google-api-go-client: update generated code with CL https://codereview.appspot.com/10234052/

R=adg, bradfitz
CC=golang-dev
https://codereview.appspot.com/10405044
diff --git a/adexchangebuyer/v1.1/adexchangebuyer-api.json b/adexchangebuyer/v1.1/adexchangebuyer-api.json
index 12b0b08..f76b2f6 100644
--- a/adexchangebuyer/v1.1/adexchangebuyer-api.json
+++ b/adexchangebuyer/v1.1/adexchangebuyer-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/6anG-k8n9dPMg0P1_a190d9g6xo\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/00O1cIHlhtIda4EaDvUs1LwgIkE\"",
  "discoveryVersion": "v1",
  "id": "adexchangebuyer:v1.1",
  "name": "adexchangebuyer",
  "version": "v1.1",
- "revision": "20130213",
+ "revision": "20130525",
  "title": "Ad Exchange Buyer API",
  "description": "Lets you manage your Ad Exchange Buyer account.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif",
   "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/adexchangebuyer/v1.1/adexchangebuyer-gen.go b/adexchangebuyer/v1.1/adexchangebuyer-gen.go
index 891eae0..c49c888 100644
--- a/adexchangebuyer/v1.1/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1.1/adexchangebuyer-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adexchangebuyer:v1.1"
 const apiName = "adexchangebuyer"
@@ -281,14 +284,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -344,11 +349,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -400,15 +407,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -474,15 +483,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -543,15 +554,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "creatives/{accountId}/{buyerCreativeId}")
-	urls = strings.Replace(urls, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
-	urls = strings.Replace(urls, "{buyerCreativeId}", cleanPathString(c.buyerCreativeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{buyerCreativeId}", url.QueryEscape(c.buyerCreativeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -621,12 +634,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "creatives")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -706,11 +721,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "creatives")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -784,14 +801,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "directdeals/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -847,11 +866,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.1/", "directdeals")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -874,12 +895,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/adexchangebuyer/v1.2/adexchangebuyer-api.json b/adexchangebuyer/v1.2/adexchangebuyer-api.json
index 3345887..8510134 100644
--- a/adexchangebuyer/v1.2/adexchangebuyer-api.json
+++ b/adexchangebuyer/v1.2/adexchangebuyer-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/uShsLFV7mdHHLUFmkv9FSqfeP_8\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/pUWO6FADzD9ohUaGwdOprKcRF0E\"",
  "discoveryVersion": "v1",
  "id": "adexchangebuyer:v1.2",
  "name": "adexchangebuyer",
  "version": "v1.2",
- "revision": "20130213",
+ "revision": "20130525",
  "title": "Ad Exchange Buyer API",
  "description": "Lets you manage your Ad Exchange Buyer account.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif",
   "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/adexchangebuyer/v1.2/adexchangebuyer-gen.go b/adexchangebuyer/v1.2/adexchangebuyer-gen.go
index 587c828..466ae1c 100644
--- a/adexchangebuyer/v1.2/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1.2/adexchangebuyer-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adexchangebuyer:v1.2"
 const apiName = "adexchangebuyer"
@@ -300,14 +303,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -363,11 +368,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -419,15 +426,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -493,15 +502,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -562,15 +573,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "creatives/{accountId}/{buyerCreativeId}")
-	urls = strings.Replace(urls, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
-	urls = strings.Replace(urls, "{buyerCreativeId}", cleanPathString(c.buyerCreativeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{buyerCreativeId}", url.QueryEscape(c.buyerCreativeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -640,12 +653,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "creatives")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -725,11 +740,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "creatives")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -803,14 +820,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "directdeals/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -866,11 +885,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1.2/", "directdeals")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -893,12 +914,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/adexchangebuyer/v1/adexchangebuyer-api.json b/adexchangebuyer/v1/adexchangebuyer-api.json
index 1ddc8b2..8c6bacb 100644
--- a/adexchangebuyer/v1/adexchangebuyer-api.json
+++ b/adexchangebuyer/v1/adexchangebuyer-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/twoiFLU2RIw-u1ZxTvm401JmU7g\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/N9gObYHSs_NjTKJyhaAPoPPiXlw\"",
  "discoveryVersion": "v1",
  "id": "adexchangebuyer:v1",
  "name": "adexchangebuyer",
  "version": "v1",
- "revision": "20130213",
+ "revision": "20130525",
  "title": "Ad Exchange Buyer API",
  "description": "Lets you manage your Ad Exchange Buyer account.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif",
   "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/adexchangebuyer/v1/adexchangebuyer-gen.go b/adexchangebuyer/v1/adexchangebuyer-gen.go
index e775c25..bb7039d 100644
--- a/adexchangebuyer/v1/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1/adexchangebuyer-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adexchangebuyer:v1"
 const apiName = "adexchangebuyer"
@@ -275,14 +278,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -338,11 +343,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -394,15 +401,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -468,15 +477,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "accounts/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -540,15 +551,17 @@
 	params.Set("alt", "json")
 	params.Set("adgroupId", fmt.Sprintf("%v", c.adgroupId))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "creatives/{accountId}/{buyerCreativeId}")
-	urls = strings.Replace(urls, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
-	urls = strings.Replace(urls, "{buyerCreativeId}", cleanPathString(c.buyerCreativeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{buyerCreativeId}", url.QueryEscape(c.buyerCreativeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -626,12 +639,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "creatives")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -701,11 +716,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "creatives")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -764,14 +781,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "directdeals/{id}")
-	urls = strings.Replace(urls, "{id}", strconv.FormatInt(c.id, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", strconv.FormatInt(c.id, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -827,11 +846,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangebuyer/v1/", "directdeals")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -854,12 +875,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/adexchangeseller/v1/adexchangeseller-api.json b/adexchangeseller/v1/adexchangeseller-api.json
index 3898564..277064b 100644
--- a/adexchangeseller/v1/adexchangeseller-api.json
+++ b/adexchangeseller/v1/adexchangeseller-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/ml4Buz_9MjvD_tExKw-NrpAQxDg\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/KWECIOGXU4KJoVWBm_dcq-jjdz4\"",
  "discoveryVersion": "v1",
  "id": "adexchangeseller:v1",
  "name": "adexchangeseller",
  "canonicalName": "Ad Exchange Seller",
  "version": "v1",
- "revision": "20130411",
+ "revision": "20130605",
  "title": "Ad Exchange Seller API",
  "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif",
   "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/adexchangeseller/v1/adexchangeseller-gen.go b/adexchangeseller/v1/adexchangeseller-gen.go
index 12ff113..b85c1fb 100644
--- a/adexchangeseller/v1/adexchangeseller-gen.go
+++ b/adexchangeseller/v1/adexchangeseller-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adexchangeseller:v1"
 const apiName = "adexchangeseller"
@@ -442,11 +445,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -508,15 +513,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients/{adClientId}/adunits/{adUnitId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -612,14 +619,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -719,15 +728,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients/{adClientId}/adunits/{adUnitId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -805,15 +816,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients/{adClientId}/customchannels/{customChannelId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -900,14 +913,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1010,15 +1025,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients/{adClientId}/customchannels/{customChannelId}/adunits")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1180,11 +1197,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "reports")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1332,14 +1351,16 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "reports/{savedReportId}")
-	urls = strings.Replace(urls, "{savedReportId}", cleanPathString(c.savedReportId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedReportId}", url.QueryEscape(c.savedReportId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1439,11 +1460,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "reports/saved")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1526,14 +1549,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adexchangeseller/v1/", "adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1581,12 +1606,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/admin/directory_v1/admin-api.json b/admin/directory_v1/admin-api.json
new file mode 100644
index 0000000..dd3705f
--- /dev/null
+++ b/admin/directory_v1/admin-api.json
@@ -0,0 +1,2635 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/xg7aqD9gvkkoP6QuI93ciKDJHIA\"",
+ "discoveryVersion": "v1",
+ "id": "admin:directory_v1",
+ "name": "admin",
+ "canonicalName": "directory",
+ "version": "directory_v1",
+ "revision": "20130610",
+ "title": "Admin Directory API",
+ "description": "Apps Directory API lets you view and manage enterprise resources like user, groups, OrgUnit, devices.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "packagePath": "admin",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/search-16.gif",
+  "x32": "http://www.google.com/images/icons/product/search-32.gif"
+ },
+ "documentationLink": "https://developers.google.com/admin-sdk/directory/",
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/admin/directory/v1/",
+ "basePath": "/admin/directory/v1/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "admin/directory/v1/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/admin.directory.device.chromeos": {
+     "description": "View and manage your Chrome OS devices' metadata"
+    },
+    "https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly": {
+     "description": "View your Chrome OS devices' metadata"
+    },
+    "https://www.googleapis.com/auth/admin.directory.device.mobile": {
+     "description": "View and manage your mobile devices' metadata"
+    },
+    "https://www.googleapis.com/auth/admin.directory.device.mobile.action": {
+     "description": "Manage your mobile devices by performing administrative tasks"
+    },
+    "https://www.googleapis.com/auth/admin.directory.device.mobile.readonly": {
+     "description": "View your mobile devices' metadata"
+    },
+    "https://www.googleapis.com/auth/admin.directory.group": {
+     "description": "View and manage the provisioning of groups on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.group.member": {
+     "description": "View and manage group subscriptions on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.group.member.readonly": {
+     "description": "View group subscriptions on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.group.readonly": {
+     "description": "View groups on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.orgunit": {
+     "description": "View and manage organization units on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.orgunit.readonly": {
+     "description": "View organization units on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.user": {
+     "description": "View and manage the provisioning of users on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.user.alias": {
+     "description": "View and manage user aliases on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.user.alias.readonly": {
+     "description": "View user aliases on your domain"
+    },
+    "https://www.googleapis.com/auth/admin.directory.user.readonly": {
+     "description": "View users on your domain"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "Alias": {
+   "id": "Alias",
+   "type": "object",
+   "description": "JSON template for Alias object in Apps Directory API.",
+   "properties": {
+    "alias": {
+     "type": "string",
+     "description": "A alias email"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique id of the group (Read-only) Unique id of the user (Read-only)"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#alias"
+    },
+    "primaryEmail": {
+     "type": "string",
+     "description": "Group's primary email (Read-only) User's primary email (Read-only)"
+    }
+   }
+  },
+  "Aliases": {
+   "id": "Aliases",
+   "type": "object",
+   "description": "JSON response template to list aliases in Apps Directory API.",
+   "properties": {
+    "aliases": {
+     "type": "array",
+     "description": "List of alias objects.",
+     "items": {
+      "$ref": "Alias"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#aliases"
+    }
+   }
+  },
+  "ChromeOsDevice": {
+   "id": "ChromeOsDevice",
+   "type": "object",
+   "description": "JSON template for Chrome Os Device resource in Apps Directory API.",
+   "properties": {
+    "annotatedLocation": {
+     "type": "string",
+     "description": "Address or location of the device as noted by the administrator"
+    },
+    "annotatedUser": {
+     "type": "string",
+     "description": "User of the device"
+    },
+    "bootMode": {
+     "type": "string",
+     "description": "Chromebook boot mode (Read-only)"
+    },
+    "deviceId": {
+     "type": "string",
+     "description": "Unique identifier of Chrome OS Device (Read-only)"
+    },
+    "firmwareVersion": {
+     "type": "string",
+     "description": "Chromebook firmware version (Read-only)"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#chromeosdevice"
+    },
+    "lastEnrollmentTime": {
+     "type": "string",
+     "description": "Date and time the device was last enrolled (Read-only)",
+     "format": "date-time"
+    },
+    "lastSync": {
+     "type": "string",
+     "description": "Date and time the device was last synchronized with the policy settings in the Google Apps administrator control panel (Read-only)",
+     "format": "date-time"
+    },
+    "macAddress": {
+     "type": "string",
+     "description": "Chromebook Mac Address (Read-only)"
+    },
+    "meid": {
+     "type": "string",
+     "description": "Mobile Equipment identifier for the 3G mobile card in the Chromebook (Read-only)"
+    },
+    "model": {
+     "type": "string",
+     "description": "Chromebook Model (Read-only)"
+    },
+    "notes": {
+     "type": "string",
+     "description": "Notes added by the administrator"
+    },
+    "orderNumber": {
+     "type": "string",
+     "description": "Chromebook order number (Read-only)"
+    },
+    "orgUnitPath": {
+     "type": "string",
+     "description": "OrgUnit of the device"
+    },
+    "osVersion": {
+     "type": "string",
+     "description": "Chromebook Os Version (Read-only)"
+    },
+    "platformVersion": {
+     "type": "string",
+     "description": "Chromebook platform version (Read-only)"
+    },
+    "serialNumber": {
+     "type": "string",
+     "description": "Chromebook serial number (Read-only)"
+    },
+    "status": {
+     "type": "string",
+     "description": "status of the device (Read-only)"
+    },
+    "supportEndDate": {
+     "type": "string",
+     "description": "Final date the device will be supported (Read-only)",
+     "format": "date-time"
+    },
+    "willAutoRenew": {
+     "type": "boolean",
+     "description": "Will Chromebook auto reniew after support end date (Read-only)"
+    }
+   }
+  },
+  "ChromeOsDevices": {
+   "id": "ChromeOsDevices",
+   "type": "object",
+   "description": "JSON response template for List Chrome OS Devices operation in Apps Directory API.",
+   "properties": {
+    "chromeosdevices": {
+     "type": "array",
+     "description": "List of Chrome OS Device objects.",
+     "items": {
+      "$ref": "ChromeOsDevice"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#chromeosdevices"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Token used to access next page of this result."
+    }
+   }
+  },
+  "Group": {
+   "id": "Group",
+   "type": "object",
+   "description": "JSON template for Group resource in Apps Directory API.",
+   "properties": {
+    "adminCreated": {
+     "type": "boolean",
+     "description": "Is the group created by admin (Read-only) *"
+    },
+    "aliases": {
+     "type": "array",
+     "description": "List of aliases (Read-only)",
+     "items": {
+      "type": "string"
+     }
+    },
+    "description": {
+     "type": "string",
+     "description": "Description of the group"
+    },
+    "email": {
+     "type": "string",
+     "description": "Email of Group",
+     "annotations": {
+      "required": [
+       "directory.groups.insert"
+      ]
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of Group (Read-only)"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#group"
+    },
+    "name": {
+     "type": "string",
+     "description": "Group name"
+    },
+    "nonEditableAliases": {
+     "type": "array",
+     "description": "List of non editable aliases (Read-only)",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "Groups": {
+   "id": "Groups",
+   "type": "object",
+   "description": "JSON response template for List Groups operation in Apps Directory API.",
+   "properties": {
+    "groups": {
+     "type": "array",
+     "description": "List of group objects.",
+     "items": {
+      "$ref": "Group"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#groups"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Token used to access next page of this result."
+    }
+   }
+  },
+  "Member": {
+   "id": "Member",
+   "type": "object",
+   "description": "JSON template for Member resource in Apps Directory API.",
+   "properties": {
+    "email": {
+     "type": "string",
+     "description": "Email of member (Read-only)"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of customer member (Read-only) Unique identifier of group (Read-only) Unique identifier of member (Read-only)"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#member"
+    },
+    "role": {
+     "type": "string",
+     "description": "Role of member"
+    },
+    "type": {
+     "type": "string",
+     "description": "Type of member (Immutable)"
+    }
+   }
+  },
+  "Members": {
+   "id": "Members",
+   "type": "object",
+   "description": "JSON response template for List Members operation in Apps Directory API.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#members"
+    },
+    "members": {
+     "type": "array",
+     "description": "List of member objects.",
+     "items": {
+      "$ref": "Member"
+     }
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Token used to access next page of this result."
+    }
+   }
+  },
+  "MobileDevice": {
+   "id": "MobileDevice",
+   "type": "object",
+   "description": "JSON template for Mobile Device resource in Apps Directory API.",
+   "properties": {
+    "applications": {
+     "type": "array",
+     "description": "List of applications installed on Mobile Device",
+     "items": {
+      "type": "object",
+      "properties": {
+       "displayName": {
+        "type": "string",
+        "description": "Display name of application"
+       },
+       "packageName": {
+        "type": "string",
+        "description": "Package name of application"
+       },
+       "permission": {
+        "type": "array",
+        "description": "List of Permissions for application",
+        "items": {
+         "type": "string"
+        }
+       },
+       "versionCode": {
+        "type": "integer",
+        "description": "Version code of application",
+        "format": "int32"
+       },
+       "versionName": {
+        "type": "string",
+        "description": "Version name of application"
+       }
+      }
+     }
+    },
+    "deviceId": {
+     "type": "string",
+     "description": "Mobile Device serial number (Read-only)"
+    },
+    "email": {
+     "type": "array",
+     "description": "List of owner user's email addresses (Read-only)",
+     "items": {
+      "type": "string"
+     }
+    },
+    "firstSync": {
+     "type": "string",
+     "description": "Date and time the device was first synchronized with the policy settings in the Google Apps administrator control panel (Read-only)",
+     "format": "date-time"
+    },
+    "hardwareId": {
+     "type": "string",
+     "description": "Mobile Device Hardware Id (Read-only)"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#mobiledevice"
+    },
+    "lastSync": {
+     "type": "string",
+     "description": "Date and time the device was last synchronized with the policy settings in the Google Apps administrator control panel (Read-only)",
+     "format": "date-time"
+    },
+    "model": {
+     "type": "string",
+     "description": "Name of the model of the device"
+    },
+    "name": {
+     "type": "array",
+     "description": "List of owner user's names (Read-only)",
+     "items": {
+      "type": "string"
+     }
+    },
+    "os": {
+     "type": "string",
+     "description": "Name of the mobile operating system"
+    },
+    "resourceId": {
+     "type": "string",
+     "description": "Unique identifier of Mobile Device (Read-only)"
+    },
+    "status": {
+     "type": "string",
+     "description": "Status of the device (Read-only)"
+    },
+    "type": {
+     "type": "string",
+     "description": "The type of device (Read-only)"
+    },
+    "userAgent": {
+     "type": "string",
+     "description": "Mobile Device user agent"
+    }
+   }
+  },
+  "MobileDeviceAction": {
+   "id": "MobileDeviceAction",
+   "type": "object",
+   "description": "JSON request template for firing commands on Mobile Device in Apps Directory Devices API.",
+   "properties": {
+    "action": {
+     "type": "string",
+     "description": "Action to be taken on the Mobile Device",
+     "annotations": {
+      "required": [
+       "directory.mobiledevices.action"
+      ]
+     }
+    }
+   }
+  },
+  "MobileDevices": {
+   "id": "MobileDevices",
+   "type": "object",
+   "description": "JSON response template for List Mobile Devices operation in Apps Directory API.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#mobiledevices"
+    },
+    "mobiledevices": {
+     "type": "array",
+     "description": "List of Mobile Device objects.",
+     "items": {
+      "$ref": "MobileDevice"
+     }
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Token used to access next page of this result."
+    }
+   }
+  },
+  "OrgUnit": {
+   "id": "OrgUnit",
+   "type": "object",
+   "description": "JSON template for Org Unit resource in Apps Directory API.",
+   "properties": {
+    "blockInheritance": {
+     "type": "boolean",
+     "description": "Should block inheritance"
+    },
+    "description": {
+     "type": "string",
+     "description": "Description of OrgUnit"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#orgUnit"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of OrgUnit",
+     "annotations": {
+      "required": [
+       "directory.orgunits.insert"
+      ]
+     }
+    },
+    "orgUnitPath": {
+     "type": "string",
+     "description": "Path of OrgUnit"
+    },
+    "parentOrgUnitPath": {
+     "type": "string",
+     "description": "Path of parent OrgUnit",
+     "annotations": {
+      "required": [
+       "directory.orgunits.insert"
+      ]
+     }
+    }
+   }
+  },
+  "OrgUnits": {
+   "id": "OrgUnits",
+   "type": "object",
+   "description": "JSON response template for List Organization Units operation in Apps Directory API.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#orgUnits"
+    },
+    "organizationUnits": {
+     "type": "array",
+     "description": "List of user objects.",
+     "items": {
+      "$ref": "OrgUnit"
+     }
+    }
+   }
+  },
+  "User": {
+   "id": "User",
+   "type": "object",
+   "description": "JSON template for User object in Apps Directory API.",
+   "properties": {
+    "addresses": {
+     "type": "array",
+     "description": "Addresses of User",
+     "items": {
+      "$ref": "UserAddress"
+     }
+    },
+    "agreedToTerms": {
+     "type": "boolean",
+     "description": "Indicates if user has agreed to terms (Read-only)"
+    },
+    "aliases": {
+     "type": "array",
+     "description": "List of aliases (Read-only)",
+     "items": {
+      "type": "string"
+     }
+    },
+    "changePasswordAtNextLogin": {
+     "type": "boolean",
+     "description": "Boolean indicating if the user should change password in next login"
+    },
+    "creationTime": {
+     "type": "string",
+     "description": "User's Google account creation time. (Read-only)",
+     "format": "date-time"
+    },
+    "customerId": {
+     "type": "string",
+     "description": "CustomerId of User (Read-only)"
+    },
+    "emails": {
+     "type": "array",
+     "description": "Emails of User",
+     "items": {
+      "$ref": "UserEmail"
+     }
+    },
+    "externalIds": {
+     "type": "array",
+     "description": "The external Ids of User *",
+     "items": {
+      "$ref": "UserExternalId"
+     }
+    },
+    "hashFunction": {
+     "type": "string",
+     "description": "Hash function name for password. Supported are MD5, SHA-1 and crypt"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of User (Read-only)"
+    },
+    "ims": {
+     "type": "array",
+     "description": "User's Instant Messenger",
+     "items": {
+      "$ref": "UserIm"
+     }
+    },
+    "includeInGlobalAddressList": {
+     "type": "boolean",
+     "description": "Boolean indicating if user is included in Global Address List"
+    },
+    "ipWhitelisted": {
+     "type": "boolean",
+     "description": "Boolean indicating if ip is whitelisted"
+    },
+    "isAdmin": {
+     "type": "boolean",
+     "description": "Boolean indicating if the user is admin (Read-only)"
+    },
+    "isDelegatedAdmin": {
+     "type": "boolean",
+     "description": "Boolean indicating if the user is delegated admin (Read-only)"
+    },
+    "isMailboxSetup": {
+     "type": "boolean",
+     "description": "Is mailbox setup (Read-only)"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#user"
+    },
+    "lastLoginTime": {
+     "type": "string",
+     "description": "User's last login time. (Read-only)",
+     "format": "date-time"
+    },
+    "name": {
+     "$ref": "UserName",
+     "description": "User's name",
+     "annotations": {
+      "required": [
+       "directory.users.insert"
+      ]
+     }
+    },
+    "nonEditableAliases": {
+     "type": "array",
+     "description": "List of non editable aliases (Read-only)",
+     "items": {
+      "type": "string"
+     }
+    },
+    "orgUnitPath": {
+     "type": "string",
+     "description": "OrgUnit of User"
+    },
+    "organizations": {
+     "type": "array",
+     "description": "Organizations of User",
+     "items": {
+      "$ref": "UserOrganization"
+     }
+    },
+    "password": {
+     "type": "string",
+     "description": "User's password",
+     "annotations": {
+      "required": [
+       "directory.users.insert"
+      ]
+     }
+    },
+    "phones": {
+     "type": "array",
+     "description": "Phone numbers of User",
+     "items": {
+      "$ref": "UserPhone"
+     }
+    },
+    "primaryEmail": {
+     "type": "string",
+     "description": "username of User",
+     "annotations": {
+      "required": [
+       "directory.users.insert"
+      ]
+     }
+    },
+    "relations": {
+     "type": "array",
+     "description": "The Relations of User *",
+     "items": {
+      "$ref": "UserRelation"
+     }
+    },
+    "suspended": {
+     "type": "boolean",
+     "description": "Indicates if user is suspended"
+    },
+    "suspensionReason": {
+     "type": "string",
+     "description": "Suspension reason if user is suspended (Read-only)"
+    },
+    "thumbnailPhotoUrl": {
+     "type": "string",
+     "description": "Photo Url of the user (Read-only)"
+    }
+   }
+  },
+  "UserAddress": {
+   "id": "UserAddress",
+   "type": "object",
+   "description": "JSON template for address.",
+   "properties": {
+    "country": {
+     "type": "string",
+     "description": "Country."
+    },
+    "countryCode": {
+     "type": "string",
+     "description": "Country code."
+    },
+    "customType": {
+     "type": "string",
+     "description": "Custom type."
+    },
+    "extendedAddress": {
+     "type": "string",
+     "description": "Extended Address."
+    },
+    "formatted": {
+     "type": "string",
+     "description": "Formatted address (read-only field)"
+    },
+    "locality": {
+     "type": "string",
+     "description": "Locality."
+    },
+    "poBox": {
+     "type": "string",
+     "description": "Other parts of address."
+    },
+    "postalCode": {
+     "type": "string",
+     "description": "Postal code."
+    },
+    "primary": {
+     "type": "boolean",
+     "description": "If this is user's primary address. Only one entry could be marked as primary."
+    },
+    "region": {
+     "type": "string",
+     "description": "Region."
+    },
+    "sourceIsStructured": {
+     "type": "boolean",
+     "description": "User supplied address was structured. Structured addresses are NOT supported at this time. You might be able to write structured addresses, but any values will eventually be clobbered."
+    },
+    "streetAddress": {
+     "type": "string",
+     "description": "Street."
+    },
+    "type": {
+     "type": "string",
+     "description": "Each entry can have a type which indicates standard values of that entry. For example address could be of home, work etc. In addition to the standard type, an entry can have a custom type and can take any value. Such type should have the CUSTOM value as type and also have a customType value."
+    }
+   }
+  },
+  "UserEmail": {
+   "id": "UserEmail",
+   "type": "object",
+   "description": "JSON template for an email.",
+   "properties": {
+    "address": {
+     "type": "string",
+     "description": "Email id of the user."
+    },
+    "customType": {
+     "type": "string",
+     "description": "Custom Type."
+    },
+    "primary": {
+     "type": "boolean",
+     "description": "If this is user's primary email. Only one entry could be marked as primary."
+    },
+    "type": {
+     "type": "string",
+     "description": "Each entry can have a type which indicates standard types of that entry. For example email could be of home, work etc. In addition to the standard type, an entry can have a custom type and can take any value Such typess should have the CUSTOM value as type and also have a customType value."
+    }
+   }
+  },
+  "UserExternalId": {
+   "id": "UserExternalId",
+   "type": "object",
+   "description": "JSON template for an externalId entry.",
+   "properties": {
+    "customType": {
+     "type": "string",
+     "description": "Custom type."
+    },
+    "type": {
+     "type": "string",
+     "description": "The type of the Id."
+    },
+    "value": {
+     "type": "string",
+     "description": "The value of the id."
+    }
+   }
+  },
+  "UserIm": {
+   "id": "UserIm",
+   "type": "object",
+   "description": "JSON template for instant messenger of an user.",
+   "properties": {
+    "customProtocol": {
+     "type": "string",
+     "description": "Custom protocol."
+    },
+    "customType": {
+     "type": "string",
+     "description": "Custom type."
+    },
+    "im": {
+     "type": "string",
+     "description": "Instant messenger id."
+    },
+    "primary": {
+     "type": "boolean",
+     "description": "If this is user's priamry im. Only one entry could be marked as primary."
+    },
+    "protocol": {
+     "type": "string",
+     "description": "Protocol used in the instant messenger. It should be one of the values from ImProtocolTypes map. Simalar to type, it can take a CUSTOM value and specify the custom name in customProtocol field."
+    },
+    "type": {
+     "type": "string",
+     "description": "Each entry can have a type which indicates standard types of that entry. For example instant messengers could be of home, work etc. In addition to the standard type, an entry can have a custom type and can take any value. Such types should have the CUSTOM value as type and also have a customType value."
+    }
+   }
+  },
+  "UserMakeAdmin": {
+   "id": "UserMakeAdmin",
+   "type": "object",
+   "description": "JSON request template for setting/revoking admin status of a user in Apps Directory API.",
+   "properties": {
+    "status": {
+     "type": "boolean",
+     "description": "Boolean indicating new admin status of the user",
+     "annotations": {
+      "required": [
+       "directory.users.makeAdmin"
+      ]
+     }
+    }
+   }
+  },
+  "UserName": {
+   "id": "UserName",
+   "type": "object",
+   "description": "JSON template for name of a user in Apps Directory API.",
+   "properties": {
+    "familyName": {
+     "type": "string",
+     "description": "Last Name",
+     "annotations": {
+      "required": [
+       "directory.users.insert"
+      ]
+     }
+    },
+    "fullName": {
+     "type": "string",
+     "description": "Full Name"
+    },
+    "givenName": {
+     "type": "string",
+     "description": "First Name",
+     "annotations": {
+      "required": [
+       "directory.users.insert"
+      ]
+     }
+    }
+   }
+  },
+  "UserOrganization": {
+   "id": "UserOrganization",
+   "type": "object",
+   "description": "JSON template for an organization entry.",
+   "properties": {
+    "costCenter": {
+     "type": "string",
+     "description": "The cost center of the users department."
+    },
+    "customType": {
+     "type": "string",
+     "description": "Custom type."
+    },
+    "department": {
+     "type": "string",
+     "description": "Department within the organization."
+    },
+    "description": {
+     "type": "string",
+     "description": "Description of the organization."
+    },
+    "domain": {
+     "type": "string",
+     "description": "The domain to which the organization belongs to."
+    },
+    "location": {
+     "type": "string",
+     "description": "Location of the organization. This need not be fully qualified address."
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the organization"
+    },
+    "primary": {
+     "type": "boolean",
+     "description": "If it user's primary organization."
+    },
+    "symbol": {
+     "type": "string",
+     "description": "Symobol of the organization."
+    },
+    "title": {
+     "type": "string",
+     "description": "Title (designation) of the user in the organization."
+    },
+    "type": {
+     "type": "string",
+     "description": "Each entry can have a type which indicates standard types of that entry. For example organization could be of school, work etc. In addition to the standard type, an entry can have a custom type and can give it any name. Such types should have the CUSTOM value as type and also have a CustomType value."
+    }
+   }
+  },
+  "UserPhone": {
+   "id": "UserPhone",
+   "type": "object",
+   "description": "JSON template for a phone entry.",
+   "properties": {
+    "customType": {
+     "type": "string",
+     "description": "Custom Type."
+    },
+    "primary": {
+     "type": "boolean",
+     "description": "If this is user's primary phone or not."
+    },
+    "type": {
+     "type": "string",
+     "description": "Each entry can have a type which indicates standard types of that entry. For example phone could be of home_fax, work, mobile etc. In addition to the standard type, an entry can have a custom type and can give it any name. Such types should have the CUSTOM value as type and also have a customType value."
+    },
+    "value": {
+     "type": "string",
+     "description": "Phone number."
+    }
+   }
+  },
+  "UserPhoto": {
+   "id": "UserPhoto",
+   "type": "object",
+   "description": "JSON template for Photo object in Apps Directory API.",
+   "properties": {
+    "height": {
+     "type": "integer",
+     "description": "Height in pixels of the photo",
+     "format": "int32"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of User (Read-only)"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#user#photo"
+    },
+    "mimeType": {
+     "type": "string",
+     "description": "Mime Type of the photo"
+    },
+    "photoData": {
+     "type": "string",
+     "description": "Base64 encoded photo data",
+     "format": "byte",
+     "annotations": {
+      "required": [
+       "directory.users.photos.update"
+      ]
+     }
+    },
+    "primaryEmail": {
+     "type": "string",
+     "description": "Primary email of User (Read-only)"
+    },
+    "width": {
+     "type": "integer",
+     "description": "Width in pixels of the photo",
+     "format": "int32"
+    }
+   }
+  },
+  "UserRelation": {
+   "id": "UserRelation",
+   "type": "object",
+   "description": "JSON template for a relation entry.",
+   "properties": {
+    "customType": {
+     "type": "string",
+     "description": "Custom Type."
+    },
+    "type": {
+     "type": "string",
+     "description": "The relation of the user. Some of the possible values are mother, father, sister, brother, manager, assistant, partner."
+    },
+    "value": {
+     "type": "string",
+     "description": "The name of the relation."
+    }
+   }
+  },
+  "UserUndelete": {
+   "id": "UserUndelete",
+   "type": "object",
+   "description": "JSON request template to undelete a user in Apps Directory API.",
+   "properties": {
+    "orgUnitPath": {
+     "type": "string",
+     "description": "OrgUnit of User"
+    }
+   }
+  },
+  "Users": {
+   "id": "Users",
+   "type": "object",
+   "description": "JSON response template for List Users operation in Apps Directory API.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#directory#users"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Token used to access next page of this result."
+    },
+    "trigger_event": {
+     "type": "string",
+     "description": "Event that triggered this response (only used in case of Push Response)"
+    },
+    "users": {
+     "type": "array",
+     "description": "List of user objects.",
+     "items": {
+      "$ref": "User"
+     }
+    }
+   }
+  }
+ },
+ "resources": {
+  "chromeosdevices": {
+   "methods": {
+    "get": {
+     "id": "directory.chromeosdevices.get",
+     "path": "customer/{customerId}/devices/chromeos/{deviceId}",
+     "httpMethod": "GET",
+     "description": "Retrieve Chrome OS Device",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "deviceId": {
+       "type": "string",
+       "description": "Immutable id of Chrome OS Device",
+       "required": true,
+       "location": "path"
+      },
+      "projection": {
+       "type": "string",
+       "description": "Restrict information returned to a set of selected fields.",
+       "enum": [
+        "BASIC",
+        "FULL"
+       ],
+       "enumDescriptions": [
+        "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+        "Includes all metadata fields"
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "deviceId"
+     ],
+     "response": {
+      "$ref": "ChromeOsDevice"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.chromeos",
+      "https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly"
+     ]
+    },
+    "list": {
+     "id": "directory.chromeosdevices.list",
+     "path": "customer/{customerId}/devices/chromeos",
+     "httpMethod": "GET",
+     "description": "Retrieve all Chrome OS Devices of a customer (paginated)",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return. Default is 100",
+       "format": "int32",
+       "minimum": "1",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Column to use for sorting results",
+       "enum": [
+        "annotatedLocation",
+        "annotatedUser",
+        "lastSync",
+        "notes",
+        "serialNumber",
+        "status",
+        "supportEndDate"
+       ],
+       "enumDescriptions": [
+        "Chromebook location as annotated by the administrator.",
+        "Chromebook user as annotated by administrator.",
+        "Chromebook last sync.",
+        "Chromebook notes as annotated by the administrator.",
+        "Chromebook Serial Number.",
+        "Chromebook status.",
+        "Chromebook support end date."
+       ],
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page in the list",
+       "location": "query"
+      },
+      "projection": {
+       "type": "string",
+       "description": "Restrict information returned to a set of selected fields.",
+       "enum": [
+        "BASIC",
+        "FULL"
+       ],
+       "enumDescriptions": [
+        "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+        "Includes all metadata fields"
+       ],
+       "location": "query"
+      },
+      "query": {
+       "type": "string",
+       "description": "Search string in the format given at http://support.google.com/chromeos/a/bin/answer.py?hl=en&answer=1698333",
+       "location": "query"
+      },
+      "sortOrder": {
+       "type": "string",
+       "description": "Whether to return results in ascending or descending order. Only of use when orderBy is also used",
+       "enum": [
+        "ASCENDING",
+        "DESCENDING"
+       ],
+       "enumDescriptions": [
+        "Ascending order.",
+        "Descending order."
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "customerId"
+     ],
+     "response": {
+      "$ref": "ChromeOsDevices"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.chromeos",
+      "https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly"
+     ]
+    },
+    "patch": {
+     "id": "directory.chromeosdevices.patch",
+     "path": "customer/{customerId}/devices/chromeos/{deviceId}",
+     "httpMethod": "PATCH",
+     "description": "Update Chrome OS Device. This method supports patch semantics.",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "deviceId": {
+       "type": "string",
+       "description": "Immutable id of Chrome OS Device",
+       "required": true,
+       "location": "path"
+      },
+      "projection": {
+       "type": "string",
+       "description": "Restrict information returned to a set of selected fields.",
+       "enum": [
+        "BASIC",
+        "FULL"
+       ],
+       "enumDescriptions": [
+        "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+        "Includes all metadata fields"
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "deviceId"
+     ],
+     "request": {
+      "$ref": "ChromeOsDevice"
+     },
+     "response": {
+      "$ref": "ChromeOsDevice"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.chromeos"
+     ]
+    },
+    "update": {
+     "id": "directory.chromeosdevices.update",
+     "path": "customer/{customerId}/devices/chromeos/{deviceId}",
+     "httpMethod": "PUT",
+     "description": "Update Chrome OS Device",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "deviceId": {
+       "type": "string",
+       "description": "Immutable id of Chrome OS Device",
+       "required": true,
+       "location": "path"
+      },
+      "projection": {
+       "type": "string",
+       "description": "Restrict information returned to a set of selected fields.",
+       "enum": [
+        "BASIC",
+        "FULL"
+       ],
+       "enumDescriptions": [
+        "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+        "Includes all metadata fields"
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "deviceId"
+     ],
+     "request": {
+      "$ref": "ChromeOsDevice"
+     },
+     "response": {
+      "$ref": "ChromeOsDevice"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.chromeos"
+     ]
+    }
+   }
+  },
+  "groups": {
+   "methods": {
+    "delete": {
+     "id": "directory.groups.delete",
+     "path": "groups/{groupKey}",
+     "httpMethod": "DELETE",
+     "description": "Delete Group",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group"
+     ]
+    },
+    "get": {
+     "id": "directory.groups.get",
+     "path": "groups/{groupKey}",
+     "httpMethod": "GET",
+     "description": "Retrieve Group",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey"
+     ],
+     "response": {
+      "$ref": "Group"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.readonly"
+     ]
+    },
+    "insert": {
+     "id": "directory.groups.insert",
+     "path": "groups",
+     "httpMethod": "POST",
+     "description": "Create Group",
+     "request": {
+      "$ref": "Group"
+     },
+     "response": {
+      "$ref": "Group"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group"
+     ]
+    },
+    "list": {
+     "id": "directory.groups.list",
+     "path": "groups",
+     "httpMethod": "GET",
+     "description": "Retrieve all groups in a domain (paginated)",
+     "parameters": {
+      "customer": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account. In case of multi-domain, to fetch all groups for a customer, fill this field instead of domain.",
+       "location": "query"
+      },
+      "domain": {
+       "type": "string",
+       "description": "Name of the domain. Fill this field to get groups from only this domain. To return all groups in a multi-domain fill customer field instead.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return. Default is 200",
+       "format": "int32",
+       "minimum": "1",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page in the list",
+       "location": "query"
+      },
+      "userKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user if only those groups are to be listed, the given user is a member of. If Id, it should match with id of user object",
+       "location": "query"
+      }
+     },
+     "response": {
+      "$ref": "Groups"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.readonly"
+     ]
+    },
+    "patch": {
+     "id": "directory.groups.patch",
+     "path": "groups/{groupKey}",
+     "httpMethod": "PATCH",
+     "description": "Update Group. This method supports patch semantics.",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey"
+     ],
+     "request": {
+      "$ref": "Group"
+     },
+     "response": {
+      "$ref": "Group"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group"
+     ]
+    },
+    "update": {
+     "id": "directory.groups.update",
+     "path": "groups/{groupKey}",
+     "httpMethod": "PUT",
+     "description": "Update Group",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey"
+     ],
+     "request": {
+      "$ref": "Group"
+     },
+     "response": {
+      "$ref": "Group"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group"
+     ]
+    }
+   },
+   "resources": {
+    "aliases": {
+     "methods": {
+      "delete": {
+       "id": "directory.groups.aliases.delete",
+       "path": "groups/{groupKey}/aliases/{alias}",
+       "httpMethod": "DELETE",
+       "description": "Remove a alias for the group",
+       "parameters": {
+        "alias": {
+         "type": "string",
+         "description": "The alias to be removed",
+         "required": true,
+         "location": "path"
+        },
+        "groupKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the group",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "groupKey",
+        "alias"
+       ],
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.group"
+       ]
+      },
+      "insert": {
+       "id": "directory.groups.aliases.insert",
+       "path": "groups/{groupKey}/aliases",
+       "httpMethod": "POST",
+       "description": "Add a alias for the group",
+       "parameters": {
+        "groupKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the group",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "groupKey"
+       ],
+       "request": {
+        "$ref": "Alias"
+       },
+       "response": {
+        "$ref": "Alias"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.group"
+       ]
+      },
+      "list": {
+       "id": "directory.groups.aliases.list",
+       "path": "groups/{groupKey}/aliases",
+       "httpMethod": "GET",
+       "description": "List all aliases for a group",
+       "parameters": {
+        "groupKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the group",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "groupKey"
+       ],
+       "response": {
+        "$ref": "Aliases"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.group",
+        "https://www.googleapis.com/auth/admin.directory.group.readonly"
+       ]
+      }
+     }
+    }
+   }
+  },
+  "members": {
+   "methods": {
+    "delete": {
+     "id": "directory.members.delete",
+     "path": "groups/{groupKey}/members/{memberKey}",
+     "httpMethod": "DELETE",
+     "description": "Remove membership.",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group",
+       "required": true,
+       "location": "path"
+      },
+      "memberKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the member",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey",
+      "memberKey"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.member"
+     ]
+    },
+    "get": {
+     "id": "directory.members.get",
+     "path": "groups/{groupKey}/members/{memberKey}",
+     "httpMethod": "GET",
+     "description": "Retrieve Group Member",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group",
+       "required": true,
+       "location": "path"
+      },
+      "memberKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the member",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey",
+      "memberKey"
+     ],
+     "response": {
+      "$ref": "Member"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.member",
+      "https://www.googleapis.com/auth/admin.directory.group.member.readonly",
+      "https://www.googleapis.com/auth/admin.directory.group.readonly"
+     ]
+    },
+    "insert": {
+     "id": "directory.members.insert",
+     "path": "groups/{groupKey}/members",
+     "httpMethod": "POST",
+     "description": "Add user to the specified group.",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey"
+     ],
+     "request": {
+      "$ref": "Member"
+     },
+     "response": {
+      "$ref": "Member"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.member"
+     ]
+    },
+    "list": {
+     "id": "directory.members.list",
+     "path": "groups/{groupKey}/members",
+     "httpMethod": "GET",
+     "description": "Retrieve all members in a group (paginated)",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group",
+       "required": true,
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return. Default is 200",
+       "format": "int32",
+       "minimum": "1",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page in the list",
+       "location": "query"
+      },
+      "roles": {
+       "type": "string",
+       "description": "Comma separated role values to filter list results on.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "groupKey"
+     ],
+     "response": {
+      "$ref": "Members"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.member",
+      "https://www.googleapis.com/auth/admin.directory.group.member.readonly",
+      "https://www.googleapis.com/auth/admin.directory.group.readonly"
+     ]
+    },
+    "patch": {
+     "id": "directory.members.patch",
+     "path": "groups/{groupKey}/members/{memberKey}",
+     "httpMethod": "PATCH",
+     "description": "Update membership of a user in the specified group. This method supports patch semantics.",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+       "required": true,
+       "location": "path"
+      },
+      "memberKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user. If Id, it should match with id of member object",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey",
+      "memberKey"
+     ],
+     "request": {
+      "$ref": "Member"
+     },
+     "response": {
+      "$ref": "Member"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.member"
+     ]
+    },
+    "update": {
+     "id": "directory.members.update",
+     "path": "groups/{groupKey}/members/{memberKey}",
+     "httpMethod": "PUT",
+     "description": "Update membership of a user in the specified group.",
+     "parameters": {
+      "groupKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+       "required": true,
+       "location": "path"
+      },
+      "memberKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user. If Id, it should match with id of member object",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "groupKey",
+      "memberKey"
+     ],
+     "request": {
+      "$ref": "Member"
+     },
+     "response": {
+      "$ref": "Member"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.group",
+      "https://www.googleapis.com/auth/admin.directory.group.member"
+     ]
+    }
+   }
+  },
+  "mobiledevices": {
+   "methods": {
+    "action": {
+     "id": "directory.mobiledevices.action",
+     "path": "customer/{customerId}/devices/mobile/{resourceId}/action",
+     "httpMethod": "POST",
+     "description": "Take action on Mobile Device",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "resourceId": {
+       "type": "string",
+       "description": "Immutable id of Mobile Device",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "resourceId"
+     ],
+     "request": {
+      "$ref": "MobileDeviceAction"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.mobile",
+      "https://www.googleapis.com/auth/admin.directory.device.mobile.action"
+     ]
+    },
+    "delete": {
+     "id": "directory.mobiledevices.delete",
+     "path": "customer/{customerId}/devices/mobile/{resourceId}",
+     "httpMethod": "DELETE",
+     "description": "Delete Mobile Device",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "resourceId": {
+       "type": "string",
+       "description": "Immutable id of Mobile Device",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "resourceId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.mobile"
+     ]
+    },
+    "get": {
+     "id": "directory.mobiledevices.get",
+     "path": "customer/{customerId}/devices/mobile/{resourceId}",
+     "httpMethod": "GET",
+     "description": "Retrieve Mobile Device",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "projection": {
+       "type": "string",
+       "description": "Restrict information returned to a set of selected fields.",
+       "enum": [
+        "BASIC",
+        "FULL"
+       ],
+       "enumDescriptions": [
+        "Includes only the basic metadata fields (e.g., deviceId, model, status, type, and status)",
+        "Includes all metadata fields"
+       ],
+       "location": "query"
+      },
+      "resourceId": {
+       "type": "string",
+       "description": "Immutable id of Mobile Device",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "resourceId"
+     ],
+     "response": {
+      "$ref": "MobileDevice"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.mobile",
+      "https://www.googleapis.com/auth/admin.directory.device.mobile.action",
+      "https://www.googleapis.com/auth/admin.directory.device.mobile.readonly"
+     ]
+    },
+    "list": {
+     "id": "directory.mobiledevices.list",
+     "path": "customer/{customerId}/devices/mobile",
+     "httpMethod": "GET",
+     "description": "Retrieve all Mobile Devices of a customer (paginated)",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return. Default is 100",
+       "format": "int32",
+       "minimum": "1",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Column to use for sorting results",
+       "enum": [
+        "deviceId",
+        "email",
+        "lastSync",
+        "model",
+        "name",
+        "os",
+        "status",
+        "type"
+       ],
+       "enumDescriptions": [
+        "Mobile Device serial number.",
+        "Owner user email.",
+        "Last policy settings sync date time of the device.",
+        "Mobile Device model.",
+        "Owner user name.",
+        "Mobile operating system.",
+        "Status of the device.",
+        "Type of the device."
+       ],
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page in the list",
+       "location": "query"
+      },
+      "projection": {
+       "type": "string",
+       "description": "Restrict information returned to a set of selected fields.",
+       "enum": [
+        "BASIC",
+        "FULL"
+       ],
+       "enumDescriptions": [
+        "Includes only the basic metadata fields (e.g., deviceId, model, status, type, and status)",
+        "Includes all metadata fields"
+       ],
+       "location": "query"
+      },
+      "query": {
+       "type": "string",
+       "description": "Search string in the format given at http://support.google.com/a/bin/answer.py?hl=en&answer=1408863#search",
+       "location": "query"
+      },
+      "sortOrder": {
+       "type": "string",
+       "description": "Whether to return results in ascending or descending order. Only of use when orderBy is also used",
+       "enum": [
+        "ASCENDING",
+        "DESCENDING"
+       ],
+       "enumDescriptions": [
+        "Ascending order.",
+        "Descending order."
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "customerId"
+     ],
+     "response": {
+      "$ref": "MobileDevices"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.device.mobile",
+      "https://www.googleapis.com/auth/admin.directory.device.mobile.action",
+      "https://www.googleapis.com/auth/admin.directory.device.mobile.readonly"
+     ]
+    }
+   }
+  },
+  "orgunits": {
+   "methods": {
+    "delete": {
+     "id": "directory.orgunits.delete",
+     "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+     "httpMethod": "DELETE",
+     "description": "Remove Organization Unit",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "orgUnitPath": {
+       "type": "string",
+       "description": "Full path of the organization unit",
+       "required": true,
+       "repeated": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "orgUnitPath"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.orgunit",
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "get": {
+     "id": "directory.orgunits.get",
+     "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+     "httpMethod": "GET",
+     "description": "Retrieve Organization Unit",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "orgUnitPath": {
+       "type": "string",
+       "description": "Full path of the organization unit",
+       "required": true,
+       "repeated": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "orgUnitPath"
+     ],
+     "response": {
+      "$ref": "OrgUnit"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.orgunit",
+      "https://www.googleapis.com/auth/admin.directory.orgunit.readonly",
+      "https://www.googleapis.com/auth/admin.directory.user",
+      "https://www.googleapis.com/auth/admin.directory.user.readonly"
+     ]
+    },
+    "insert": {
+     "id": "directory.orgunits.insert",
+     "path": "customer/{customerId}/orgunits",
+     "httpMethod": "POST",
+     "description": "Add Organization Unit",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId"
+     ],
+     "request": {
+      "$ref": "OrgUnit"
+     },
+     "response": {
+      "$ref": "OrgUnit"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.orgunit",
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "list": {
+     "id": "directory.orgunits.list",
+     "path": "customer/{customerId}/orgunits",
+     "httpMethod": "GET",
+     "description": "Retrieve all Organization Units",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "orgUnitPath": {
+       "type": "string",
+       "description": "the URL-encoded organization unit",
+       "default": "",
+       "location": "query"
+      },
+      "type": {
+       "type": "string",
+       "description": "Whether to return all sub-organizations or just immediate children",
+       "enum": [
+        "all",
+        "children"
+       ],
+       "enumDescriptions": [
+        "All sub-organization units.",
+        "Immediate children only (default)."
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "customerId"
+     ],
+     "response": {
+      "$ref": "OrgUnits"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.orgunit",
+      "https://www.googleapis.com/auth/admin.directory.orgunit.readonly",
+      "https://www.googleapis.com/auth/admin.directory.user",
+      "https://www.googleapis.com/auth/admin.directory.user.readonly"
+     ]
+    },
+    "patch": {
+     "id": "directory.orgunits.patch",
+     "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+     "httpMethod": "PATCH",
+     "description": "Update Organization Unit. This method supports patch semantics.",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "orgUnitPath": {
+       "type": "string",
+       "description": "Full path of the organization unit",
+       "required": true,
+       "repeated": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "orgUnitPath"
+     ],
+     "request": {
+      "$ref": "OrgUnit"
+     },
+     "response": {
+      "$ref": "OrgUnit"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.orgunit",
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "update": {
+     "id": "directory.orgunits.update",
+     "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+     "httpMethod": "PUT",
+     "description": "Update Organization Unit",
+     "parameters": {
+      "customerId": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account",
+       "required": true,
+       "location": "path"
+      },
+      "orgUnitPath": {
+       "type": "string",
+       "description": "Full path of the organization unit",
+       "required": true,
+       "repeated": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "customerId",
+      "orgUnitPath"
+     ],
+     "request": {
+      "$ref": "OrgUnit"
+     },
+     "response": {
+      "$ref": "OrgUnit"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.orgunit",
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    }
+   }
+  },
+  "users": {
+   "methods": {
+    "delete": {
+     "id": "directory.users.delete",
+     "path": "users/{userKey}",
+     "httpMethod": "DELETE",
+     "description": "Delete user",
+     "parameters": {
+      "userKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "get": {
+     "id": "directory.users.get",
+     "path": "users/{userKey}",
+     "httpMethod": "GET",
+     "description": "retrieve user",
+     "parameters": {
+      "userKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey"
+     ],
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user",
+      "https://www.googleapis.com/auth/admin.directory.user.readonly"
+     ]
+    },
+    "insert": {
+     "id": "directory.users.insert",
+     "path": "users",
+     "httpMethod": "POST",
+     "description": "create user.",
+     "request": {
+      "$ref": "User"
+     },
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "list": {
+     "id": "directory.users.list",
+     "path": "users",
+     "httpMethod": "GET",
+     "description": "Retrieve either deleted users or all users in a domain (paginated)",
+     "parameters": {
+      "customer": {
+       "type": "string",
+       "description": "Immutable id of the Google Apps account. In case of multi-domain, to fetch all users for a customer, fill this field instead of domain.",
+       "location": "query"
+      },
+      "domain": {
+       "type": "string",
+       "description": "Name of the domain. Fill this field to get users from only this domain. To return all users in a multi-domain fill customer field instead.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return. Default is 100. Max allowed is 500",
+       "format": "int32",
+       "minimum": "1",
+       "maximum": "500",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Column to use for sorting results",
+       "enum": [
+        "email",
+        "familyName",
+        "givenName"
+       ],
+       "enumDescriptions": [
+        "Primary email of the user.",
+        "User's family name.",
+        "User's given name."
+       ],
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page in the list",
+       "location": "query"
+      },
+      "query": {
+       "type": "string",
+       "description": "Query string for prefix matching searches. Should be of the form \"key:value\" where key can be \"email\", \"firstName\" or \"lastName\".",
+       "location": "query"
+      },
+      "showDeleted": {
+       "type": "string",
+       "description": "If set to true retrieves the list of deleted users. Default is false",
+       "location": "query"
+      },
+      "sortOrder": {
+       "type": "string",
+       "description": "Whether to return results in ascending or descending order.",
+       "enum": [
+        "ASCENDING",
+        "DESCENDING"
+       ],
+       "enumDescriptions": [
+        "Ascending order.",
+        "Descending order."
+       ],
+       "location": "query"
+      }
+     },
+     "response": {
+      "$ref": "Users"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user",
+      "https://www.googleapis.com/auth/admin.directory.user.readonly"
+     ]
+    },
+    "makeAdmin": {
+     "id": "directory.users.makeAdmin",
+     "path": "users/{userKey}/makeAdmin",
+     "httpMethod": "POST",
+     "description": "change admin status of a user",
+     "parameters": {
+      "userKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user as admin",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey"
+     ],
+     "request": {
+      "$ref": "UserMakeAdmin"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "patch": {
+     "id": "directory.users.patch",
+     "path": "users/{userKey}",
+     "httpMethod": "PATCH",
+     "description": "update user. This method supports patch semantics.",
+     "parameters": {
+      "userKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user. If Id, it should match with id of user object",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey"
+     ],
+     "request": {
+      "$ref": "User"
+     },
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "undelete": {
+     "id": "directory.users.undelete",
+     "path": "users/{userKey}/undelete",
+     "httpMethod": "POST",
+     "description": "Undelete a deleted user",
+     "parameters": {
+      "userKey": {
+       "type": "string",
+       "description": "The immutable id of the user",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey"
+     ],
+     "request": {
+      "$ref": "UserUndelete"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    },
+    "update": {
+     "id": "directory.users.update",
+     "path": "users/{userKey}",
+     "httpMethod": "PUT",
+     "description": "update user",
+     "parameters": {
+      "userKey": {
+       "type": "string",
+       "description": "Email or immutable Id of the user. If Id, it should match with id of user object",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey"
+     ],
+     "request": {
+      "$ref": "User"
+     },
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.directory.user"
+     ]
+    }
+   },
+   "resources": {
+    "aliases": {
+     "methods": {
+      "delete": {
+       "id": "directory.users.aliases.delete",
+       "path": "users/{userKey}/aliases/{alias}",
+       "httpMethod": "DELETE",
+       "description": "Remove a alias for the user",
+       "parameters": {
+        "alias": {
+         "type": "string",
+         "description": "The alias to be removed",
+         "required": true,
+         "location": "path"
+        },
+        "userKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the user",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "userKey",
+        "alias"
+       ],
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.user",
+        "https://www.googleapis.com/auth/admin.directory.user.alias"
+       ]
+      },
+      "insert": {
+       "id": "directory.users.aliases.insert",
+       "path": "users/{userKey}/aliases",
+       "httpMethod": "POST",
+       "description": "Add a alias for the user",
+       "parameters": {
+        "userKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the user",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "userKey"
+       ],
+       "request": {
+        "$ref": "Alias"
+       },
+       "response": {
+        "$ref": "Alias"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.user",
+        "https://www.googleapis.com/auth/admin.directory.user.alias"
+       ]
+      },
+      "list": {
+       "id": "directory.users.aliases.list",
+       "path": "users/{userKey}/aliases",
+       "httpMethod": "GET",
+       "description": "List all aliases for a user",
+       "parameters": {
+        "userKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the user",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "userKey"
+       ],
+       "response": {
+        "$ref": "Aliases"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.user",
+        "https://www.googleapis.com/auth/admin.directory.user.alias",
+        "https://www.googleapis.com/auth/admin.directory.user.alias.readonly",
+        "https://www.googleapis.com/auth/admin.directory.user.readonly"
+       ]
+      }
+     }
+    },
+    "photos": {
+     "methods": {
+      "delete": {
+       "id": "directory.users.photos.delete",
+       "path": "users/{userKey}/photos/thumbnail",
+       "httpMethod": "DELETE",
+       "description": "Remove photos for the user",
+       "parameters": {
+        "userKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the user",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "userKey"
+       ],
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.user"
+       ]
+      },
+      "get": {
+       "id": "directory.users.photos.get",
+       "path": "users/{userKey}/photos/thumbnail",
+       "httpMethod": "GET",
+       "description": "Retrieve photo of a user",
+       "parameters": {
+        "userKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the user",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "userKey"
+       ],
+       "response": {
+        "$ref": "UserPhoto"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.user",
+        "https://www.googleapis.com/auth/admin.directory.user.readonly"
+       ]
+      },
+      "patch": {
+       "id": "directory.users.photos.patch",
+       "path": "users/{userKey}/photos/thumbnail",
+       "httpMethod": "PATCH",
+       "description": "Add a photo for the user. This method supports patch semantics.",
+       "parameters": {
+        "userKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the user",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "userKey"
+       ],
+       "request": {
+        "$ref": "UserPhoto"
+       },
+       "response": {
+        "$ref": "UserPhoto"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.user"
+       ]
+      },
+      "update": {
+       "id": "directory.users.photos.update",
+       "path": "users/{userKey}/photos/thumbnail",
+       "httpMethod": "PUT",
+       "description": "Add a photo for the user",
+       "parameters": {
+        "userKey": {
+         "type": "string",
+         "description": "Email or immutable Id of the user",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "userKey"
+       ],
+       "request": {
+        "$ref": "UserPhoto"
+       },
+       "response": {
+        "$ref": "UserPhoto"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/admin.directory.user"
+       ]
+      }
+     }
+    }
+   }
+  }
+ }
+}
diff --git a/admin/directory_v1/admin-gen.go b/admin/directory_v1/admin-gen.go
new file mode 100644
index 0000000..965d2f0
--- /dev/null
+++ b/admin/directory_v1/admin-gen.go
@@ -0,0 +1,4599 @@
+// Package admin provides access to the Admin Directory API.
+//
+// See https://developers.google.com/admin-sdk/directory/
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/admin/directory_v1"
+//   ...
+//   adminService, err := admin.New(oauthHttpClient)
+package admin
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "admin:directory_v1"
+const apiName = "admin"
+const apiVersion = "directory_v1"
+const basePath = "https://www.googleapis.com/admin/directory/v1/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View and manage your Chrome OS devices' metadata
+	AdminDirectoryDeviceChromeosScope = "https://www.googleapis.com/auth/admin.directory.device.chromeos"
+
+	// View your Chrome OS devices' metadata
+	AdminDirectoryDeviceChromeosReadonlyScope = "https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly"
+
+	// View and manage your mobile devices' metadata
+	AdminDirectoryDeviceMobileScope = "https://www.googleapis.com/auth/admin.directory.device.mobile"
+
+	// Manage your mobile devices by performing administrative tasks
+	AdminDirectoryDeviceMobileActionScope = "https://www.googleapis.com/auth/admin.directory.device.mobile.action"
+
+	// View your mobile devices' metadata
+	AdminDirectoryDeviceMobileReadonlyScope = "https://www.googleapis.com/auth/admin.directory.device.mobile.readonly"
+
+	// View and manage the provisioning of groups on your domain
+	AdminDirectoryGroupScope = "https://www.googleapis.com/auth/admin.directory.group"
+
+	// View and manage group subscriptions on your domain
+	AdminDirectoryGroupMemberScope = "https://www.googleapis.com/auth/admin.directory.group.member"
+
+	// View group subscriptions on your domain
+	AdminDirectoryGroupMemberReadonlyScope = "https://www.googleapis.com/auth/admin.directory.group.member.readonly"
+
+	// View groups on your domain
+	AdminDirectoryGroupReadonlyScope = "https://www.googleapis.com/auth/admin.directory.group.readonly"
+
+	// View and manage organization units on your domain
+	AdminDirectoryOrgunitScope = "https://www.googleapis.com/auth/admin.directory.orgunit"
+
+	// View organization units on your domain
+	AdminDirectoryOrgunitReadonlyScope = "https://www.googleapis.com/auth/admin.directory.orgunit.readonly"
+
+	// View and manage the provisioning of users on your domain
+	AdminDirectoryUserScope = "https://www.googleapis.com/auth/admin.directory.user"
+
+	// View and manage user aliases on your domain
+	AdminDirectoryUserAliasScope = "https://www.googleapis.com/auth/admin.directory.user.alias"
+
+	// View user aliases on your domain
+	AdminDirectoryUserAliasReadonlyScope = "https://www.googleapis.com/auth/admin.directory.user.alias.readonly"
+
+	// View users on your domain
+	AdminDirectoryUserReadonlyScope = "https://www.googleapis.com/auth/admin.directory.user.readonly"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.Chromeosdevices = NewChromeosdevicesService(s)
+	s.Groups = NewGroupsService(s)
+	s.Members = NewMembersService(s)
+	s.Mobiledevices = NewMobiledevicesService(s)
+	s.Orgunits = NewOrgunitsService(s)
+	s.Users = NewUsersService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	Chromeosdevices *ChromeosdevicesService
+
+	Groups *GroupsService
+
+	Members *MembersService
+
+	Mobiledevices *MobiledevicesService
+
+	Orgunits *OrgunitsService
+
+	Users *UsersService
+}
+
+func NewChromeosdevicesService(s *Service) *ChromeosdevicesService {
+	rs := &ChromeosdevicesService{s: s}
+	return rs
+}
+
+type ChromeosdevicesService struct {
+	s *Service
+}
+
+func NewGroupsService(s *Service) *GroupsService {
+	rs := &GroupsService{s: s}
+	rs.Aliases = NewGroupsAliasesService(s)
+	return rs
+}
+
+type GroupsService struct {
+	s *Service
+
+	Aliases *GroupsAliasesService
+}
+
+func NewGroupsAliasesService(s *Service) *GroupsAliasesService {
+	rs := &GroupsAliasesService{s: s}
+	return rs
+}
+
+type GroupsAliasesService struct {
+	s *Service
+}
+
+func NewMembersService(s *Service) *MembersService {
+	rs := &MembersService{s: s}
+	return rs
+}
+
+type MembersService struct {
+	s *Service
+}
+
+func NewMobiledevicesService(s *Service) *MobiledevicesService {
+	rs := &MobiledevicesService{s: s}
+	return rs
+}
+
+type MobiledevicesService struct {
+	s *Service
+}
+
+func NewOrgunitsService(s *Service) *OrgunitsService {
+	rs := &OrgunitsService{s: s}
+	return rs
+}
+
+type OrgunitsService struct {
+	s *Service
+}
+
+func NewUsersService(s *Service) *UsersService {
+	rs := &UsersService{s: s}
+	rs.Aliases = NewUsersAliasesService(s)
+	rs.Photos = NewUsersPhotosService(s)
+	return rs
+}
+
+type UsersService struct {
+	s *Service
+
+	Aliases *UsersAliasesService
+
+	Photos *UsersPhotosService
+}
+
+func NewUsersAliasesService(s *Service) *UsersAliasesService {
+	rs := &UsersAliasesService{s: s}
+	return rs
+}
+
+type UsersAliasesService struct {
+	s *Service
+}
+
+func NewUsersPhotosService(s *Service) *UsersPhotosService {
+	rs := &UsersPhotosService{s: s}
+	return rs
+}
+
+type UsersPhotosService struct {
+	s *Service
+}
+
+type Alias struct {
+	// Alias: A alias email
+	Alias string `json:"alias,omitempty"`
+
+	// Id: Unique id of the group (Read-only) Unique id of the user
+	// (Read-only)
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// PrimaryEmail: Group's primary email (Read-only) User's primary email
+	// (Read-only)
+	PrimaryEmail string `json:"primaryEmail,omitempty"`
+}
+
+type Aliases struct {
+	// Aliases: List of alias objects.
+	Aliases []*Alias `json:"aliases,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+}
+
+type ChromeOsDevice struct {
+	// AnnotatedLocation: Address or location of the device as noted by the
+	// administrator
+	AnnotatedLocation string `json:"annotatedLocation,omitempty"`
+
+	// AnnotatedUser: User of the device
+	AnnotatedUser string `json:"annotatedUser,omitempty"`
+
+	// BootMode: Chromebook boot mode (Read-only)
+	BootMode string `json:"bootMode,omitempty"`
+
+	// DeviceId: Unique identifier of Chrome OS Device (Read-only)
+	DeviceId string `json:"deviceId,omitempty"`
+
+	// FirmwareVersion: Chromebook firmware version (Read-only)
+	FirmwareVersion string `json:"firmwareVersion,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// LastEnrollmentTime: Date and time the device was last enrolled
+	// (Read-only)
+	LastEnrollmentTime string `json:"lastEnrollmentTime,omitempty"`
+
+	// LastSync: Date and time the device was last synchronized with the
+	// policy settings in the Google Apps administrator control panel
+	// (Read-only)
+	LastSync string `json:"lastSync,omitempty"`
+
+	// MacAddress: Chromebook Mac Address (Read-only)
+	MacAddress string `json:"macAddress,omitempty"`
+
+	// Meid: Mobile Equipment identifier for the 3G mobile card in the
+	// Chromebook (Read-only)
+	Meid string `json:"meid,omitempty"`
+
+	// Model: Chromebook Model (Read-only)
+	Model string `json:"model,omitempty"`
+
+	// Notes: Notes added by the administrator
+	Notes string `json:"notes,omitempty"`
+
+	// OrderNumber: Chromebook order number (Read-only)
+	OrderNumber string `json:"orderNumber,omitempty"`
+
+	// OrgUnitPath: OrgUnit of the device
+	OrgUnitPath string `json:"orgUnitPath,omitempty"`
+
+	// OsVersion: Chromebook Os Version (Read-only)
+	OsVersion string `json:"osVersion,omitempty"`
+
+	// PlatformVersion: Chromebook platform version (Read-only)
+	PlatformVersion string `json:"platformVersion,omitempty"`
+
+	// SerialNumber: Chromebook serial number (Read-only)
+	SerialNumber string `json:"serialNumber,omitempty"`
+
+	// Status: status of the device (Read-only)
+	Status string `json:"status,omitempty"`
+
+	// SupportEndDate: Final date the device will be supported (Read-only)
+	SupportEndDate string `json:"supportEndDate,omitempty"`
+
+	// WillAutoRenew: Will Chromebook auto reniew after support end date
+	// (Read-only)
+	WillAutoRenew bool `json:"willAutoRenew,omitempty"`
+}
+
+type ChromeOsDevices struct {
+	// Chromeosdevices: List of Chrome OS Device objects.
+	Chromeosdevices []*ChromeOsDevice `json:"chromeosdevices,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Token used to access next page of this result.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type Group struct {
+	// AdminCreated: Is the group created by admin (Read-only) *
+	AdminCreated bool `json:"adminCreated,omitempty"`
+
+	// Aliases: List of aliases (Read-only)
+	Aliases []string `json:"aliases,omitempty"`
+
+	// Description: Description of the group
+	Description string `json:"description,omitempty"`
+
+	// Email: Email of Group
+	Email string `json:"email,omitempty"`
+
+	// Id: Unique identifier of Group (Read-only)
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Group name
+	Name string `json:"name,omitempty"`
+
+	// NonEditableAliases: List of non editable aliases (Read-only)
+	NonEditableAliases []string `json:"nonEditableAliases,omitempty"`
+}
+
+type Groups struct {
+	// Groups: List of group objects.
+	Groups []*Group `json:"groups,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Token used to access next page of this result.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type Member struct {
+	// Email: Email of member (Read-only)
+	Email string `json:"email,omitempty"`
+
+	// Id: Unique identifier of customer member (Read-only) Unique
+	// identifier of group (Read-only) Unique identifier of member
+	// (Read-only)
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// Role: Role of member
+	Role string `json:"role,omitempty"`
+
+	// Type: Type of member (Immutable)
+	Type string `json:"type,omitempty"`
+}
+
+type Members struct {
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// Members: List of member objects.
+	Members []*Member `json:"members,omitempty"`
+
+	// NextPageToken: Token used to access next page of this result.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type MobileDevice struct {
+	// Applications: List of applications installed on Mobile Device
+	Applications []*MobileDeviceApplications `json:"applications,omitempty"`
+
+	// DeviceId: Mobile Device serial number (Read-only)
+	DeviceId string `json:"deviceId,omitempty"`
+
+	// Email: List of owner user's email addresses (Read-only)
+	Email []string `json:"email,omitempty"`
+
+	// FirstSync: Date and time the device was first synchronized with the
+	// policy settings in the Google Apps administrator control panel
+	// (Read-only)
+	FirstSync string `json:"firstSync,omitempty"`
+
+	// HardwareId: Mobile Device Hardware Id (Read-only)
+	HardwareId string `json:"hardwareId,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// LastSync: Date and time the device was last synchronized with the
+	// policy settings in the Google Apps administrator control panel
+	// (Read-only)
+	LastSync string `json:"lastSync,omitempty"`
+
+	// Model: Name of the model of the device
+	Model string `json:"model,omitempty"`
+
+	// Name: List of owner user's names (Read-only)
+	Name []string `json:"name,omitempty"`
+
+	// Os: Name of the mobile operating system
+	Os string `json:"os,omitempty"`
+
+	// ResourceId: Unique identifier of Mobile Device (Read-only)
+	ResourceId string `json:"resourceId,omitempty"`
+
+	// Status: Status of the device (Read-only)
+	Status string `json:"status,omitempty"`
+
+	// Type: The type of device (Read-only)
+	Type string `json:"type,omitempty"`
+
+	// UserAgent: Mobile Device user agent
+	UserAgent string `json:"userAgent,omitempty"`
+}
+
+type MobileDeviceApplications struct {
+	// DisplayName: Display name of application
+	DisplayName string `json:"displayName,omitempty"`
+
+	// PackageName: Package name of application
+	PackageName string `json:"packageName,omitempty"`
+
+	// Permission: List of Permissions for application
+	Permission []string `json:"permission,omitempty"`
+
+	// VersionCode: Version code of application
+	VersionCode int64 `json:"versionCode,omitempty"`
+
+	// VersionName: Version name of application
+	VersionName string `json:"versionName,omitempty"`
+}
+
+type MobileDeviceAction struct {
+	// Action: Action to be taken on the Mobile Device
+	Action string `json:"action,omitempty"`
+}
+
+type MobileDevices struct {
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// Mobiledevices: List of Mobile Device objects.
+	Mobiledevices []*MobileDevice `json:"mobiledevices,omitempty"`
+
+	// NextPageToken: Token used to access next page of this result.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type OrgUnit struct {
+	// BlockInheritance: Should block inheritance
+	BlockInheritance bool `json:"blockInheritance,omitempty"`
+
+	// Description: Description of OrgUnit
+	Description string `json:"description,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of OrgUnit
+	Name string `json:"name,omitempty"`
+
+	// OrgUnitPath: Path of OrgUnit
+	OrgUnitPath string `json:"orgUnitPath,omitempty"`
+
+	// ParentOrgUnitPath: Path of parent OrgUnit
+	ParentOrgUnitPath string `json:"parentOrgUnitPath,omitempty"`
+}
+
+type OrgUnits struct {
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// OrganizationUnits: List of user objects.
+	OrganizationUnits []*OrgUnit `json:"organizationUnits,omitempty"`
+}
+
+type User struct {
+	// Addresses: Addresses of User
+	Addresses []*UserAddress `json:"addresses,omitempty"`
+
+	// AgreedToTerms: Indicates if user has agreed to terms (Read-only)
+	AgreedToTerms bool `json:"agreedToTerms,omitempty"`
+
+	// Aliases: List of aliases (Read-only)
+	Aliases []string `json:"aliases,omitempty"`
+
+	// ChangePasswordAtNextLogin: Boolean indicating if the user should
+	// change password in next login
+	ChangePasswordAtNextLogin bool `json:"changePasswordAtNextLogin,omitempty"`
+
+	// CreationTime: User's Google account creation time. (Read-only)
+	CreationTime string `json:"creationTime,omitempty"`
+
+	// CustomerId: CustomerId of User (Read-only)
+	CustomerId string `json:"customerId,omitempty"`
+
+	// Emails: Emails of User
+	Emails []*UserEmail `json:"emails,omitempty"`
+
+	// ExternalIds: The external Ids of User *
+	ExternalIds []*UserExternalId `json:"externalIds,omitempty"`
+
+	// HashFunction: Hash function name for password. Supported are MD5,
+	// SHA-1 and crypt
+	HashFunction string `json:"hashFunction,omitempty"`
+
+	// Id: Unique identifier of User (Read-only)
+	Id string `json:"id,omitempty"`
+
+	// Ims: User's Instant Messenger
+	Ims []*UserIm `json:"ims,omitempty"`
+
+	// IncludeInGlobalAddressList: Boolean indicating if user is included in
+	// Global Address List
+	IncludeInGlobalAddressList bool `json:"includeInGlobalAddressList,omitempty"`
+
+	// IpWhitelisted: Boolean indicating if ip is whitelisted
+	IpWhitelisted bool `json:"ipWhitelisted,omitempty"`
+
+	// IsAdmin: Boolean indicating if the user is admin (Read-only)
+	IsAdmin bool `json:"isAdmin,omitempty"`
+
+	// IsDelegatedAdmin: Boolean indicating if the user is delegated admin
+	// (Read-only)
+	IsDelegatedAdmin bool `json:"isDelegatedAdmin,omitempty"`
+
+	// IsMailboxSetup: Is mailbox setup (Read-only)
+	IsMailboxSetup bool `json:"isMailboxSetup,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// LastLoginTime: User's last login time. (Read-only)
+	LastLoginTime string `json:"lastLoginTime,omitempty"`
+
+	// Name: User's name
+	Name *UserName `json:"name,omitempty"`
+
+	// NonEditableAliases: List of non editable aliases (Read-only)
+	NonEditableAliases []string `json:"nonEditableAliases,omitempty"`
+
+	// OrgUnitPath: OrgUnit of User
+	OrgUnitPath string `json:"orgUnitPath,omitempty"`
+
+	// Organizations: Organizations of User
+	Organizations []*UserOrganization `json:"organizations,omitempty"`
+
+	// Password: User's password
+	Password string `json:"password,omitempty"`
+
+	// Phones: Phone numbers of User
+	Phones []*UserPhone `json:"phones,omitempty"`
+
+	// PrimaryEmail: username of User
+	PrimaryEmail string `json:"primaryEmail,omitempty"`
+
+	// Relations: The Relations of User *
+	Relations []*UserRelation `json:"relations,omitempty"`
+
+	// Suspended: Indicates if user is suspended
+	Suspended bool `json:"suspended,omitempty"`
+
+	// SuspensionReason: Suspension reason if user is suspended (Read-only)
+	SuspensionReason string `json:"suspensionReason,omitempty"`
+
+	// ThumbnailPhotoUrl: Photo Url of the user (Read-only)
+	ThumbnailPhotoUrl string `json:"thumbnailPhotoUrl,omitempty"`
+}
+
+type UserAddress struct {
+	// Country: Country.
+	Country string `json:"country,omitempty"`
+
+	// CountryCode: Country code.
+	CountryCode string `json:"countryCode,omitempty"`
+
+	// CustomType: Custom type.
+	CustomType string `json:"customType,omitempty"`
+
+	// ExtendedAddress: Extended Address.
+	ExtendedAddress string `json:"extendedAddress,omitempty"`
+
+	// Formatted: Formatted address (read-only field)
+	Formatted string `json:"formatted,omitempty"`
+
+	// Locality: Locality.
+	Locality string `json:"locality,omitempty"`
+
+	// PoBox: Other parts of address.
+	PoBox string `json:"poBox,omitempty"`
+
+	// PostalCode: Postal code.
+	PostalCode string `json:"postalCode,omitempty"`
+
+	// Primary: If this is user's primary address. Only one entry could be
+	// marked as primary.
+	Primary bool `json:"primary,omitempty"`
+
+	// Region: Region.
+	Region string `json:"region,omitempty"`
+
+	// SourceIsStructured: User supplied address was structured. Structured
+	// addresses are NOT supported at this time. You might be able to write
+	// structured addresses, but any values will eventually be clobbered.
+	SourceIsStructured bool `json:"sourceIsStructured,omitempty"`
+
+	// StreetAddress: Street.
+	StreetAddress string `json:"streetAddress,omitempty"`
+
+	// Type: Each entry can have a type which indicates standard values of
+	// that entry. For example address could be of home, work etc. In
+	// addition to the standard type, an entry can have a custom type and
+	// can take any value. Such type should have the CUSTOM value as type
+	// and also have a customType value.
+	Type string `json:"type,omitempty"`
+}
+
+type UserEmail struct {
+	// Address: Email id of the user.
+	Address string `json:"address,omitempty"`
+
+	// CustomType: Custom Type.
+	CustomType string `json:"customType,omitempty"`
+
+	// Primary: If this is user's primary email. Only one entry could be
+	// marked as primary.
+	Primary bool `json:"primary,omitempty"`
+
+	// Type: Each entry can have a type which indicates standard types of
+	// that entry. For example email could be of home, work etc. In addition
+	// to the standard type, an entry can have a custom type and can take
+	// any value Such typess should have the CUSTOM value as type and also
+	// have a customType value.
+	Type string `json:"type,omitempty"`
+}
+
+type UserExternalId struct {
+	// CustomType: Custom type.
+	CustomType string `json:"customType,omitempty"`
+
+	// Type: The type of the Id.
+	Type string `json:"type,omitempty"`
+
+	// Value: The value of the id.
+	Value string `json:"value,omitempty"`
+}
+
+type UserIm struct {
+	// CustomProtocol: Custom protocol.
+	CustomProtocol string `json:"customProtocol,omitempty"`
+
+	// CustomType: Custom type.
+	CustomType string `json:"customType,omitempty"`
+
+	// Im: Instant messenger id.
+	Im string `json:"im,omitempty"`
+
+	// Primary: If this is user's priamry im. Only one entry could be marked
+	// as primary.
+	Primary bool `json:"primary,omitempty"`
+
+	// Protocol: Protocol used in the instant messenger. It should be one of
+	// the values from ImProtocolTypes map. Simalar to type, it can take a
+	// CUSTOM value and specify the custom name in customProtocol field.
+	Protocol string `json:"protocol,omitempty"`
+
+	// Type: Each entry can have a type which indicates standard types of
+	// that entry. For example instant messengers could be of home, work
+	// etc. In addition to the standard type, an entry can have a custom
+	// type and can take any value. Such types should have the CUSTOM value
+	// as type and also have a customType value.
+	Type string `json:"type,omitempty"`
+}
+
+type UserMakeAdmin struct {
+	// Status: Boolean indicating new admin status of the user
+	Status bool `json:"status,omitempty"`
+}
+
+type UserName struct {
+	// FamilyName: Last Name
+	FamilyName string `json:"familyName,omitempty"`
+
+	// FullName: Full Name
+	FullName string `json:"fullName,omitempty"`
+
+	// GivenName: First Name
+	GivenName string `json:"givenName,omitempty"`
+}
+
+type UserOrganization struct {
+	// CostCenter: The cost center of the users department.
+	CostCenter string `json:"costCenter,omitempty"`
+
+	// CustomType: Custom type.
+	CustomType string `json:"customType,omitempty"`
+
+	// Department: Department within the organization.
+	Department string `json:"department,omitempty"`
+
+	// Description: Description of the organization.
+	Description string `json:"description,omitempty"`
+
+	// Domain: The domain to which the organization belongs to.
+	Domain string `json:"domain,omitempty"`
+
+	// Location: Location of the organization. This need not be fully
+	// qualified address.
+	Location string `json:"location,omitempty"`
+
+	// Name: Name of the organization
+	Name string `json:"name,omitempty"`
+
+	// Primary: If it user's primary organization.
+	Primary bool `json:"primary,omitempty"`
+
+	// Symbol: Symobol of the organization.
+	Symbol string `json:"symbol,omitempty"`
+
+	// Title: Title (designation) of the user in the organization.
+	Title string `json:"title,omitempty"`
+
+	// Type: Each entry can have a type which indicates standard types of
+	// that entry. For example organization could be of school, work etc. In
+	// addition to the standard type, an entry can have a custom type and
+	// can give it any name. Such types should have the CUSTOM value as type
+	// and also have a CustomType value.
+	Type string `json:"type,omitempty"`
+}
+
+type UserPhone struct {
+	// CustomType: Custom Type.
+	CustomType string `json:"customType,omitempty"`
+
+	// Primary: If this is user's primary phone or not.
+	Primary bool `json:"primary,omitempty"`
+
+	// Type: Each entry can have a type which indicates standard types of
+	// that entry. For example phone could be of home_fax, work, mobile etc.
+	// In addition to the standard type, an entry can have a custom type and
+	// can give it any name. Such types should have the CUSTOM value as type
+	// and also have a customType value.
+	Type string `json:"type,omitempty"`
+
+	// Value: Phone number.
+	Value string `json:"value,omitempty"`
+}
+
+type UserPhoto struct {
+	// Height: Height in pixels of the photo
+	Height int64 `json:"height,omitempty"`
+
+	// Id: Unique identifier of User (Read-only)
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// MimeType: Mime Type of the photo
+	MimeType string `json:"mimeType,omitempty"`
+
+	// PhotoData: Base64 encoded photo data
+	PhotoData string `json:"photoData,omitempty"`
+
+	// PrimaryEmail: Primary email of User (Read-only)
+	PrimaryEmail string `json:"primaryEmail,omitempty"`
+
+	// Width: Width in pixels of the photo
+	Width int64 `json:"width,omitempty"`
+}
+
+type UserRelation struct {
+	// CustomType: Custom Type.
+	CustomType string `json:"customType,omitempty"`
+
+	// Type: The relation of the user. Some of the possible values are
+	// mother, father, sister, brother, manager, assistant, partner.
+	Type string `json:"type,omitempty"`
+
+	// Value: The name of the relation.
+	Value string `json:"value,omitempty"`
+}
+
+type UserUndelete struct {
+	// OrgUnitPath: OrgUnit of User
+	OrgUnitPath string `json:"orgUnitPath,omitempty"`
+}
+
+type Users struct {
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Token used to access next page of this result.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// Trigger_event: Event that triggered this response (only used in case
+	// of Push Response)
+	Trigger_event string `json:"trigger_event,omitempty"`
+
+	// Users: List of user objects.
+	Users []*User `json:"users,omitempty"`
+}
+
+// method id "directory.chromeosdevices.get":
+
+type ChromeosdevicesGetCall struct {
+	s          *Service
+	customerId string
+	deviceId   string
+	opt_       map[string]interface{}
+}
+
+// Get: Retrieve Chrome OS Device
+func (r *ChromeosdevicesService) Get(customerId string, deviceId string) *ChromeosdevicesGetCall {
+	c := &ChromeosdevicesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.deviceId = deviceId
+	return c
+}
+
+// Projection sets the optional parameter "projection": Restrict
+// information returned to a set of selected fields.
+func (c *ChromeosdevicesGetCall) Projection(projection string) *ChromeosdevicesGetCall {
+	c.opt_["projection"] = projection
+	return c
+}
+
+func (c *ChromeosdevicesGetCall) Do() (*ChromeOsDevice, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["projection"]; ok {
+		params.Set("projection", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/chromeos/{deviceId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{deviceId}", url.QueryEscape(c.deviceId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ChromeOsDevice)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve Chrome OS Device",
+	//   "httpMethod": "GET",
+	//   "id": "directory.chromeosdevices.get",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "deviceId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "deviceId": {
+	//       "description": "Immutable id of Chrome OS Device",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "projection": {
+	//       "description": "Restrict information returned to a set of selected fields.",
+	//       "enum": [
+	//         "BASIC",
+	//         "FULL"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+	//         "Includes all metadata fields"
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/chromeos/{deviceId}",
+	//   "response": {
+	//     "$ref": "ChromeOsDevice"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.chromeos",
+	//     "https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.chromeosdevices.list":
+
+type ChromeosdevicesListCall struct {
+	s          *Service
+	customerId string
+	opt_       map[string]interface{}
+}
+
+// List: Retrieve all Chrome OS Devices of a customer (paginated)
+func (r *ChromeosdevicesService) List(customerId string) *ChromeosdevicesListCall {
+	c := &ChromeosdevicesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return. Default is 100
+func (c *ChromeosdevicesListCall) MaxResults(maxResults int64) *ChromeosdevicesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Column to use for
+// sorting results
+func (c *ChromeosdevicesListCall) OrderBy(orderBy string) *ChromeosdevicesListCall {
+	c.opt_["orderBy"] = orderBy
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page in the list
+func (c *ChromeosdevicesListCall) PageToken(pageToken string) *ChromeosdevicesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Projection sets the optional parameter "projection": Restrict
+// information returned to a set of selected fields.
+func (c *ChromeosdevicesListCall) Projection(projection string) *ChromeosdevicesListCall {
+	c.opt_["projection"] = projection
+	return c
+}
+
+// Query sets the optional parameter "query": Search string in the
+// format given at
+// http://support.google.com/chromeos/a/bin/answer.py?hl=en&answer=169833
+// 3
+func (c *ChromeosdevicesListCall) Query(query string) *ChromeosdevicesListCall {
+	c.opt_["query"] = query
+	return c
+}
+
+// SortOrder sets the optional parameter "sortOrder": Whether to return
+// results in ascending or descending order. Only of use when orderBy is
+// also used
+func (c *ChromeosdevicesListCall) SortOrder(sortOrder string) *ChromeosdevicesListCall {
+	c.opt_["sortOrder"] = sortOrder
+	return c
+}
+
+func (c *ChromeosdevicesListCall) Do() (*ChromeOsDevices, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["orderBy"]; ok {
+		params.Set("orderBy", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["projection"]; ok {
+		params.Set("projection", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["query"]; ok {
+		params.Set("query", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortOrder"]; ok {
+		params.Set("sortOrder", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/chromeos")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ChromeOsDevices)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve all Chrome OS Devices of a customer (paginated)",
+	//   "httpMethod": "GET",
+	//   "id": "directory.chromeosdevices.list",
+	//   "parameterOrder": [
+	//     "customerId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return. Default is 100",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "minimum": "1",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Column to use for sorting results",
+	//       "enum": [
+	//         "annotatedLocation",
+	//         "annotatedUser",
+	//         "lastSync",
+	//         "notes",
+	//         "serialNumber",
+	//         "status",
+	//         "supportEndDate"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Chromebook location as annotated by the administrator.",
+	//         "Chromebook user as annotated by administrator.",
+	//         "Chromebook last sync.",
+	//         "Chromebook notes as annotated by the administrator.",
+	//         "Chromebook Serial Number.",
+	//         "Chromebook status.",
+	//         "Chromebook support end date."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page in the list",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "projection": {
+	//       "description": "Restrict information returned to a set of selected fields.",
+	//       "enum": [
+	//         "BASIC",
+	//         "FULL"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+	//         "Includes all metadata fields"
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "query": {
+	//       "description": "Search string in the format given at http://support.google.com/chromeos/a/bin/answer.py?hl=en&answer=1698333",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortOrder": {
+	//       "description": "Whether to return results in ascending or descending order. Only of use when orderBy is also used",
+	//       "enum": [
+	//         "ASCENDING",
+	//         "DESCENDING"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Ascending order.",
+	//         "Descending order."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/chromeos",
+	//   "response": {
+	//     "$ref": "ChromeOsDevices"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.chromeos",
+	//     "https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.chromeosdevices.patch":
+
+type ChromeosdevicesPatchCall struct {
+	s              *Service
+	customerId     string
+	deviceId       string
+	chromeosdevice *ChromeOsDevice
+	opt_           map[string]interface{}
+}
+
+// Patch: Update Chrome OS Device. This method supports patch semantics.
+func (r *ChromeosdevicesService) Patch(customerId string, deviceId string, chromeosdevice *ChromeOsDevice) *ChromeosdevicesPatchCall {
+	c := &ChromeosdevicesPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.deviceId = deviceId
+	c.chromeosdevice = chromeosdevice
+	return c
+}
+
+// Projection sets the optional parameter "projection": Restrict
+// information returned to a set of selected fields.
+func (c *ChromeosdevicesPatchCall) Projection(projection string) *ChromeosdevicesPatchCall {
+	c.opt_["projection"] = projection
+	return c
+}
+
+func (c *ChromeosdevicesPatchCall) Do() (*ChromeOsDevice, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.chromeosdevice)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["projection"]; ok {
+		params.Set("projection", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/chromeos/{deviceId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{deviceId}", url.QueryEscape(c.deviceId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ChromeOsDevice)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update Chrome OS Device. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "directory.chromeosdevices.patch",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "deviceId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "deviceId": {
+	//       "description": "Immutable id of Chrome OS Device",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "projection": {
+	//       "description": "Restrict information returned to a set of selected fields.",
+	//       "enum": [
+	//         "BASIC",
+	//         "FULL"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+	//         "Includes all metadata fields"
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/chromeos/{deviceId}",
+	//   "request": {
+	//     "$ref": "ChromeOsDevice"
+	//   },
+	//   "response": {
+	//     "$ref": "ChromeOsDevice"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.chromeos"
+	//   ]
+	// }
+
+}
+
+// method id "directory.chromeosdevices.update":
+
+type ChromeosdevicesUpdateCall struct {
+	s              *Service
+	customerId     string
+	deviceId       string
+	chromeosdevice *ChromeOsDevice
+	opt_           map[string]interface{}
+}
+
+// Update: Update Chrome OS Device
+func (r *ChromeosdevicesService) Update(customerId string, deviceId string, chromeosdevice *ChromeOsDevice) *ChromeosdevicesUpdateCall {
+	c := &ChromeosdevicesUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.deviceId = deviceId
+	c.chromeosdevice = chromeosdevice
+	return c
+}
+
+// Projection sets the optional parameter "projection": Restrict
+// information returned to a set of selected fields.
+func (c *ChromeosdevicesUpdateCall) Projection(projection string) *ChromeosdevicesUpdateCall {
+	c.opt_["projection"] = projection
+	return c
+}
+
+func (c *ChromeosdevicesUpdateCall) Do() (*ChromeOsDevice, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.chromeosdevice)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["projection"]; ok {
+		params.Set("projection", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/chromeos/{deviceId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{deviceId}", url.QueryEscape(c.deviceId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ChromeOsDevice)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update Chrome OS Device",
+	//   "httpMethod": "PUT",
+	//   "id": "directory.chromeosdevices.update",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "deviceId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "deviceId": {
+	//       "description": "Immutable id of Chrome OS Device",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "projection": {
+	//       "description": "Restrict information returned to a set of selected fields.",
+	//       "enum": [
+	//         "BASIC",
+	//         "FULL"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Includes only the basic metadata fields (e.g., deviceId, serialNumber, status, and user)",
+	//         "Includes all metadata fields"
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/chromeos/{deviceId}",
+	//   "request": {
+	//     "$ref": "ChromeOsDevice"
+	//   },
+	//   "response": {
+	//     "$ref": "ChromeOsDevice"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.chromeos"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.delete":
+
+type GroupsDeleteCall struct {
+	s        *Service
+	groupKey string
+	opt_     map[string]interface{}
+}
+
+// Delete: Delete Group
+func (r *GroupsService) Delete(groupKey string) *GroupsDeleteCall {
+	c := &GroupsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	return c
+}
+
+func (c *GroupsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Delete Group",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.groups.delete",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.get":
+
+type GroupsGetCall struct {
+	s        *Service
+	groupKey string
+	opt_     map[string]interface{}
+}
+
+// Get: Retrieve Group
+func (r *GroupsService) Get(groupKey string) *GroupsGetCall {
+	c := &GroupsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	return c
+}
+
+func (c *GroupsGetCall) Do() (*Group, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Group)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve Group",
+	//   "httpMethod": "GET",
+	//   "id": "directory.groups.get",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}",
+	//   "response": {
+	//     "$ref": "Group"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.insert":
+
+type GroupsInsertCall struct {
+	s     *Service
+	group *Group
+	opt_  map[string]interface{}
+}
+
+// Insert: Create Group
+func (r *GroupsService) Insert(group *Group) *GroupsInsertCall {
+	c := &GroupsInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.group = group
+	return c
+}
+
+func (c *GroupsInsertCall) Do() (*Group, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Group)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Create Group",
+	//   "httpMethod": "POST",
+	//   "id": "directory.groups.insert",
+	//   "path": "groups",
+	//   "request": {
+	//     "$ref": "Group"
+	//   },
+	//   "response": {
+	//     "$ref": "Group"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.list":
+
+type GroupsListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: Retrieve all groups in a domain (paginated)
+func (r *GroupsService) List() *GroupsListCall {
+	c := &GroupsListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// Customer sets the optional parameter "customer": Immutable id of the
+// Google Apps account. In case of multi-domain, to fetch all groups for
+// a customer, fill this field instead of domain.
+func (c *GroupsListCall) Customer(customer string) *GroupsListCall {
+	c.opt_["customer"] = customer
+	return c
+}
+
+// Domain sets the optional parameter "domain": Name of the domain. Fill
+// this field to get groups from only this domain. To return all groups
+// in a multi-domain fill customer field instead.
+func (c *GroupsListCall) Domain(domain string) *GroupsListCall {
+	c.opt_["domain"] = domain
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return. Default is 200
+func (c *GroupsListCall) MaxResults(maxResults int64) *GroupsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page in the list
+func (c *GroupsListCall) PageToken(pageToken string) *GroupsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// UserKey sets the optional parameter "userKey": Email or immutable Id
+// of the user if only those groups are to be listed, the given user is
+// a member of. If Id, it should match with id of user object
+func (c *GroupsListCall) UserKey(userKey string) *GroupsListCall {
+	c.opt_["userKey"] = userKey
+	return c
+}
+
+func (c *GroupsListCall) Do() (*Groups, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["customer"]; ok {
+		params.Set("customer", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["domain"]; ok {
+		params.Set("domain", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["userKey"]; ok {
+		params.Set("userKey", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Groups)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve all groups in a domain (paginated)",
+	//   "httpMethod": "GET",
+	//   "id": "directory.groups.list",
+	//   "parameters": {
+	//     "customer": {
+	//       "description": "Immutable id of the Google Apps account. In case of multi-domain, to fetch all groups for a customer, fill this field instead of domain.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "domain": {
+	//       "description": "Name of the domain. Fill this field to get groups from only this domain. To return all groups in a multi-domain fill customer field instead.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return. Default is 200",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "minimum": "1",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page in the list",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user if only those groups are to be listed, the given user is a member of. If Id, it should match with id of user object",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups",
+	//   "response": {
+	//     "$ref": "Groups"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.patch":
+
+type GroupsPatchCall struct {
+	s        *Service
+	groupKey string
+	group    *Group
+	opt_     map[string]interface{}
+}
+
+// Patch: Update Group. This method supports patch semantics.
+func (r *GroupsService) Patch(groupKey string, group *Group) *GroupsPatchCall {
+	c := &GroupsPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.group = group
+	return c
+}
+
+func (c *GroupsPatchCall) Do() (*Group, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Group)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update Group. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "directory.groups.patch",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}",
+	//   "request": {
+	//     "$ref": "Group"
+	//   },
+	//   "response": {
+	//     "$ref": "Group"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.update":
+
+type GroupsUpdateCall struct {
+	s        *Service
+	groupKey string
+	group    *Group
+	opt_     map[string]interface{}
+}
+
+// Update: Update Group
+func (r *GroupsService) Update(groupKey string, group *Group) *GroupsUpdateCall {
+	c := &GroupsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.group = group
+	return c
+}
+
+func (c *GroupsUpdateCall) Do() (*Group, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Group)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update Group",
+	//   "httpMethod": "PUT",
+	//   "id": "directory.groups.update",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}",
+	//   "request": {
+	//     "$ref": "Group"
+	//   },
+	//   "response": {
+	//     "$ref": "Group"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.aliases.delete":
+
+type GroupsAliasesDeleteCall struct {
+	s        *Service
+	groupKey string
+	alias    string
+	opt_     map[string]interface{}
+}
+
+// Delete: Remove a alias for the group
+func (r *GroupsAliasesService) Delete(groupKey string, alias string) *GroupsAliasesDeleteCall {
+	c := &GroupsAliasesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.alias = alias
+	return c
+}
+
+func (c *GroupsAliasesDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/aliases/{alias}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{alias}", url.QueryEscape(c.alias), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Remove a alias for the group",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.groups.aliases.delete",
+	//   "parameterOrder": [
+	//     "groupKey",
+	//     "alias"
+	//   ],
+	//   "parameters": {
+	//     "alias": {
+	//       "description": "The alias to be removed",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/aliases/{alias}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.aliases.insert":
+
+type GroupsAliasesInsertCall struct {
+	s        *Service
+	groupKey string
+	alias    *Alias
+	opt_     map[string]interface{}
+}
+
+// Insert: Add a alias for the group
+func (r *GroupsAliasesService) Insert(groupKey string, alias *Alias) *GroupsAliasesInsertCall {
+	c := &GroupsAliasesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.alias = alias
+	return c
+}
+
+func (c *GroupsAliasesInsertCall) Do() (*Alias, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.alias)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/aliases")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Alias)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Add a alias for the group",
+	//   "httpMethod": "POST",
+	//   "id": "directory.groups.aliases.insert",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/aliases",
+	//   "request": {
+	//     "$ref": "Alias"
+	//   },
+	//   "response": {
+	//     "$ref": "Alias"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group"
+	//   ]
+	// }
+
+}
+
+// method id "directory.groups.aliases.list":
+
+type GroupsAliasesListCall struct {
+	s        *Service
+	groupKey string
+	opt_     map[string]interface{}
+}
+
+// List: List all aliases for a group
+func (r *GroupsAliasesService) List(groupKey string) *GroupsAliasesListCall {
+	c := &GroupsAliasesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	return c
+}
+
+func (c *GroupsAliasesListCall) Do() (*Aliases, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/aliases")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Aliases)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all aliases for a group",
+	//   "httpMethod": "GET",
+	//   "id": "directory.groups.aliases.list",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/aliases",
+	//   "response": {
+	//     "$ref": "Aliases"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.members.delete":
+
+type MembersDeleteCall struct {
+	s         *Service
+	groupKey  string
+	memberKey string
+	opt_      map[string]interface{}
+}
+
+// Delete: Remove membership.
+func (r *MembersService) Delete(groupKey string, memberKey string) *MembersDeleteCall {
+	c := &MembersDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.memberKey = memberKey
+	return c
+}
+
+func (c *MembersDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/members/{memberKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{memberKey}", url.QueryEscape(c.memberKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Remove membership.",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.members.delete",
+	//   "parameterOrder": [
+	//     "groupKey",
+	//     "memberKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "memberKey": {
+	//       "description": "Email or immutable Id of the member",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/members/{memberKey}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member"
+	//   ]
+	// }
+
+}
+
+// method id "directory.members.get":
+
+type MembersGetCall struct {
+	s         *Service
+	groupKey  string
+	memberKey string
+	opt_      map[string]interface{}
+}
+
+// Get: Retrieve Group Member
+func (r *MembersService) Get(groupKey string, memberKey string) *MembersGetCall {
+	c := &MembersGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.memberKey = memberKey
+	return c
+}
+
+func (c *MembersGetCall) Do() (*Member, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/members/{memberKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{memberKey}", url.QueryEscape(c.memberKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Member)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve Group Member",
+	//   "httpMethod": "GET",
+	//   "id": "directory.members.get",
+	//   "parameterOrder": [
+	//     "groupKey",
+	//     "memberKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "memberKey": {
+	//       "description": "Email or immutable Id of the member",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/members/{memberKey}",
+	//   "response": {
+	//     "$ref": "Member"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member.readonly",
+	//     "https://www.googleapis.com/auth/admin.directory.group.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.members.insert":
+
+type MembersInsertCall struct {
+	s        *Service
+	groupKey string
+	member   *Member
+	opt_     map[string]interface{}
+}
+
+// Insert: Add user to the specified group.
+func (r *MembersService) Insert(groupKey string, member *Member) *MembersInsertCall {
+	c := &MembersInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.member = member
+	return c
+}
+
+func (c *MembersInsertCall) Do() (*Member, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.member)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/members")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Member)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Add user to the specified group.",
+	//   "httpMethod": "POST",
+	//   "id": "directory.members.insert",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/members",
+	//   "request": {
+	//     "$ref": "Member"
+	//   },
+	//   "response": {
+	//     "$ref": "Member"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member"
+	//   ]
+	// }
+
+}
+
+// method id "directory.members.list":
+
+type MembersListCall struct {
+	s        *Service
+	groupKey string
+	opt_     map[string]interface{}
+}
+
+// List: Retrieve all members in a group (paginated)
+func (r *MembersService) List(groupKey string) *MembersListCall {
+	c := &MembersListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return. Default is 200
+func (c *MembersListCall) MaxResults(maxResults int64) *MembersListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page in the list
+func (c *MembersListCall) PageToken(pageToken string) *MembersListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Roles sets the optional parameter "roles": Comma separated role
+// values to filter list results on.
+func (c *MembersListCall) Roles(roles string) *MembersListCall {
+	c.opt_["roles"] = roles
+	return c
+}
+
+func (c *MembersListCall) Do() (*Members, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["roles"]; ok {
+		params.Set("roles", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/members")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Members)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve all members in a group (paginated)",
+	//   "httpMethod": "GET",
+	//   "id": "directory.members.list",
+	//   "parameterOrder": [
+	//     "groupKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return. Default is 200",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "minimum": "1",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page in the list",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "roles": {
+	//       "description": "Comma separated role values to filter list results on.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/members",
+	//   "response": {
+	//     "$ref": "Members"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member.readonly",
+	//     "https://www.googleapis.com/auth/admin.directory.group.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.members.patch":
+
+type MembersPatchCall struct {
+	s         *Service
+	groupKey  string
+	memberKey string
+	member    *Member
+	opt_      map[string]interface{}
+}
+
+// Patch: Update membership of a user in the specified group. This
+// method supports patch semantics.
+func (r *MembersService) Patch(groupKey string, memberKey string, member *Member) *MembersPatchCall {
+	c := &MembersPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.memberKey = memberKey
+	c.member = member
+	return c
+}
+
+func (c *MembersPatchCall) Do() (*Member, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.member)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/members/{memberKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{memberKey}", url.QueryEscape(c.memberKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Member)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update membership of a user in the specified group. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "directory.members.patch",
+	//   "parameterOrder": [
+	//     "groupKey",
+	//     "memberKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "memberKey": {
+	//       "description": "Email or immutable Id of the user. If Id, it should match with id of member object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/members/{memberKey}",
+	//   "request": {
+	//     "$ref": "Member"
+	//   },
+	//   "response": {
+	//     "$ref": "Member"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member"
+	//   ]
+	// }
+
+}
+
+// method id "directory.members.update":
+
+type MembersUpdateCall struct {
+	s         *Service
+	groupKey  string
+	memberKey string
+	member    *Member
+	opt_      map[string]interface{}
+}
+
+// Update: Update membership of a user in the specified group.
+func (r *MembersService) Update(groupKey string, memberKey string, member *Member) *MembersUpdateCall {
+	c := &MembersUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.groupKey = groupKey
+	c.memberKey = memberKey
+	c.member = member
+	return c
+}
+
+func (c *MembersUpdateCall) Do() (*Member, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.member)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "groups/{groupKey}/members/{memberKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupKey}", url.QueryEscape(c.groupKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{memberKey}", url.QueryEscape(c.memberKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Member)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update membership of a user in the specified group.",
+	//   "httpMethod": "PUT",
+	//   "id": "directory.members.update",
+	//   "parameterOrder": [
+	//     "groupKey",
+	//     "memberKey"
+	//   ],
+	//   "parameters": {
+	//     "groupKey": {
+	//       "description": "Email or immutable Id of the group. If Id, it should match with id of group object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "memberKey": {
+	//       "description": "Email or immutable Id of the user. If Id, it should match with id of member object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "groups/{groupKey}/members/{memberKey}",
+	//   "request": {
+	//     "$ref": "Member"
+	//   },
+	//   "response": {
+	//     "$ref": "Member"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.group",
+	//     "https://www.googleapis.com/auth/admin.directory.group.member"
+	//   ]
+	// }
+
+}
+
+// method id "directory.mobiledevices.action":
+
+type MobiledevicesActionCall struct {
+	s                  *Service
+	customerId         string
+	resourceId         string
+	mobiledeviceaction *MobileDeviceAction
+	opt_               map[string]interface{}
+}
+
+// Action: Take action on Mobile Device
+func (r *MobiledevicesService) Action(customerId string, resourceId string, mobiledeviceaction *MobileDeviceAction) *MobiledevicesActionCall {
+	c := &MobiledevicesActionCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.resourceId = resourceId
+	c.mobiledeviceaction = mobiledeviceaction
+	return c
+}
+
+func (c *MobiledevicesActionCall) Do() error {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.mobiledeviceaction)
+	if err != nil {
+		return err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/mobile/{resourceId}/action")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{resourceId}", url.QueryEscape(c.resourceId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Take action on Mobile Device",
+	//   "httpMethod": "POST",
+	//   "id": "directory.mobiledevices.action",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "resourceId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "resourceId": {
+	//       "description": "Immutable id of Mobile Device",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/mobile/{resourceId}/action",
+	//   "request": {
+	//     "$ref": "MobileDeviceAction"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile",
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile.action"
+	//   ]
+	// }
+
+}
+
+// method id "directory.mobiledevices.delete":
+
+type MobiledevicesDeleteCall struct {
+	s          *Service
+	customerId string
+	resourceId string
+	opt_       map[string]interface{}
+}
+
+// Delete: Delete Mobile Device
+func (r *MobiledevicesService) Delete(customerId string, resourceId string) *MobiledevicesDeleteCall {
+	c := &MobiledevicesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.resourceId = resourceId
+	return c
+}
+
+func (c *MobiledevicesDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/mobile/{resourceId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{resourceId}", url.QueryEscape(c.resourceId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Delete Mobile Device",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.mobiledevices.delete",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "resourceId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "resourceId": {
+	//       "description": "Immutable id of Mobile Device",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/mobile/{resourceId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile"
+	//   ]
+	// }
+
+}
+
+// method id "directory.mobiledevices.get":
+
+type MobiledevicesGetCall struct {
+	s          *Service
+	customerId string
+	resourceId string
+	opt_       map[string]interface{}
+}
+
+// Get: Retrieve Mobile Device
+func (r *MobiledevicesService) Get(customerId string, resourceId string) *MobiledevicesGetCall {
+	c := &MobiledevicesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.resourceId = resourceId
+	return c
+}
+
+// Projection sets the optional parameter "projection": Restrict
+// information returned to a set of selected fields.
+func (c *MobiledevicesGetCall) Projection(projection string) *MobiledevicesGetCall {
+	c.opt_["projection"] = projection
+	return c
+}
+
+func (c *MobiledevicesGetCall) Do() (*MobileDevice, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["projection"]; ok {
+		params.Set("projection", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/mobile/{resourceId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{resourceId}", url.QueryEscape(c.resourceId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(MobileDevice)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve Mobile Device",
+	//   "httpMethod": "GET",
+	//   "id": "directory.mobiledevices.get",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "resourceId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "projection": {
+	//       "description": "Restrict information returned to a set of selected fields.",
+	//       "enum": [
+	//         "BASIC",
+	//         "FULL"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Includes only the basic metadata fields (e.g., deviceId, model, status, type, and status)",
+	//         "Includes all metadata fields"
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "resourceId": {
+	//       "description": "Immutable id of Mobile Device",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/mobile/{resourceId}",
+	//   "response": {
+	//     "$ref": "MobileDevice"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile",
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile.action",
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.mobiledevices.list":
+
+type MobiledevicesListCall struct {
+	s          *Service
+	customerId string
+	opt_       map[string]interface{}
+}
+
+// List: Retrieve all Mobile Devices of a customer (paginated)
+func (r *MobiledevicesService) List(customerId string) *MobiledevicesListCall {
+	c := &MobiledevicesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return. Default is 100
+func (c *MobiledevicesListCall) MaxResults(maxResults int64) *MobiledevicesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Column to use for
+// sorting results
+func (c *MobiledevicesListCall) OrderBy(orderBy string) *MobiledevicesListCall {
+	c.opt_["orderBy"] = orderBy
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page in the list
+func (c *MobiledevicesListCall) PageToken(pageToken string) *MobiledevicesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Projection sets the optional parameter "projection": Restrict
+// information returned to a set of selected fields.
+func (c *MobiledevicesListCall) Projection(projection string) *MobiledevicesListCall {
+	c.opt_["projection"] = projection
+	return c
+}
+
+// Query sets the optional parameter "query": Search string in the
+// format given at
+// http://support.google.com/a/bin/answer.py?hl=en&answer=1408863#search
+func (c *MobiledevicesListCall) Query(query string) *MobiledevicesListCall {
+	c.opt_["query"] = query
+	return c
+}
+
+// SortOrder sets the optional parameter "sortOrder": Whether to return
+// results in ascending or descending order. Only of use when orderBy is
+// also used
+func (c *MobiledevicesListCall) SortOrder(sortOrder string) *MobiledevicesListCall {
+	c.opt_["sortOrder"] = sortOrder
+	return c
+}
+
+func (c *MobiledevicesListCall) Do() (*MobileDevices, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["orderBy"]; ok {
+		params.Set("orderBy", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["projection"]; ok {
+		params.Set("projection", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["query"]; ok {
+		params.Set("query", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortOrder"]; ok {
+		params.Set("sortOrder", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/devices/mobile")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(MobileDevices)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve all Mobile Devices of a customer (paginated)",
+	//   "httpMethod": "GET",
+	//   "id": "directory.mobiledevices.list",
+	//   "parameterOrder": [
+	//     "customerId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return. Default is 100",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "minimum": "1",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Column to use for sorting results",
+	//       "enum": [
+	//         "deviceId",
+	//         "email",
+	//         "lastSync",
+	//         "model",
+	//         "name",
+	//         "os",
+	//         "status",
+	//         "type"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Mobile Device serial number.",
+	//         "Owner user email.",
+	//         "Last policy settings sync date time of the device.",
+	//         "Mobile Device model.",
+	//         "Owner user name.",
+	//         "Mobile operating system.",
+	//         "Status of the device.",
+	//         "Type of the device."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page in the list",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "projection": {
+	//       "description": "Restrict information returned to a set of selected fields.",
+	//       "enum": [
+	//         "BASIC",
+	//         "FULL"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Includes only the basic metadata fields (e.g., deviceId, model, status, type, and status)",
+	//         "Includes all metadata fields"
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "query": {
+	//       "description": "Search string in the format given at http://support.google.com/a/bin/answer.py?hl=en&answer=1408863#search",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortOrder": {
+	//       "description": "Whether to return results in ascending or descending order. Only of use when orderBy is also used",
+	//       "enum": [
+	//         "ASCENDING",
+	//         "DESCENDING"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Ascending order.",
+	//         "Descending order."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/devices/mobile",
+	//   "response": {
+	//     "$ref": "MobileDevices"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile",
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile.action",
+	//     "https://www.googleapis.com/auth/admin.directory.device.mobile.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.orgunits.delete":
+
+type OrgunitsDeleteCall struct {
+	s           *Service
+	customerId  string
+	orgUnitPath []string
+	opt_        map[string]interface{}
+}
+
+// Delete: Remove Organization Unit
+func (r *OrgunitsService) Delete(customerId string, orgUnitPath []string) *OrgunitsDeleteCall {
+	c := &OrgunitsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.orgUnitPath = orgUnitPath
+	return c
+}
+
+func (c *OrgunitsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/orgunits{/orgUnitPath*}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{orgUnitPath}", url.QueryEscape(c.orgUnitPath[0]), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Remove Organization Unit",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.orgunits.delete",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "orgUnitPath"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "orgUnitPath": {
+	//       "description": "Full path of the organization unit",
+	//       "location": "path",
+	//       "repeated": true,
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit",
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.orgunits.get":
+
+type OrgunitsGetCall struct {
+	s           *Service
+	customerId  string
+	orgUnitPath []string
+	opt_        map[string]interface{}
+}
+
+// Get: Retrieve Organization Unit
+func (r *OrgunitsService) Get(customerId string, orgUnitPath []string) *OrgunitsGetCall {
+	c := &OrgunitsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.orgUnitPath = orgUnitPath
+	return c
+}
+
+func (c *OrgunitsGetCall) Do() (*OrgUnit, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/orgunits{/orgUnitPath*}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{orgUnitPath}", url.QueryEscape(c.orgUnitPath[0]), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OrgUnit)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve Organization Unit",
+	//   "httpMethod": "GET",
+	//   "id": "directory.orgunits.get",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "orgUnitPath"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "orgUnitPath": {
+	//       "description": "Full path of the organization unit",
+	//       "location": "path",
+	//       "repeated": true,
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+	//   "response": {
+	//     "$ref": "OrgUnit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit",
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit.readonly",
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.orgunits.insert":
+
+type OrgunitsInsertCall struct {
+	s          *Service
+	customerId string
+	orgunit    *OrgUnit
+	opt_       map[string]interface{}
+}
+
+// Insert: Add Organization Unit
+func (r *OrgunitsService) Insert(customerId string, orgunit *OrgUnit) *OrgunitsInsertCall {
+	c := &OrgunitsInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.orgunit = orgunit
+	return c
+}
+
+func (c *OrgunitsInsertCall) Do() (*OrgUnit, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orgunit)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/orgunits")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OrgUnit)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Add Organization Unit",
+	//   "httpMethod": "POST",
+	//   "id": "directory.orgunits.insert",
+	//   "parameterOrder": [
+	//     "customerId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/orgunits",
+	//   "request": {
+	//     "$ref": "OrgUnit"
+	//   },
+	//   "response": {
+	//     "$ref": "OrgUnit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit",
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.orgunits.list":
+
+type OrgunitsListCall struct {
+	s          *Service
+	customerId string
+	opt_       map[string]interface{}
+}
+
+// List: Retrieve all Organization Units
+func (r *OrgunitsService) List(customerId string) *OrgunitsListCall {
+	c := &OrgunitsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	return c
+}
+
+// OrgUnitPath sets the optional parameter "orgUnitPath": the
+// URL-encoded organization unit
+func (c *OrgunitsListCall) OrgUnitPath(orgUnitPath string) *OrgunitsListCall {
+	c.opt_["orgUnitPath"] = orgUnitPath
+	return c
+}
+
+// Type sets the optional parameter "type": Whether to return all
+// sub-organizations or just immediate children
+func (c *OrgunitsListCall) Type(type_ string) *OrgunitsListCall {
+	c.opt_["type"] = type_
+	return c
+}
+
+func (c *OrgunitsListCall) Do() (*OrgUnits, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["orgUnitPath"]; ok {
+		params.Set("orgUnitPath", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["type"]; ok {
+		params.Set("type", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/orgunits")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OrgUnits)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve all Organization Units",
+	//   "httpMethod": "GET",
+	//   "id": "directory.orgunits.list",
+	//   "parameterOrder": [
+	//     "customerId"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "orgUnitPath": {
+	//       "default": "",
+	//       "description": "the URL-encoded organization unit",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "type": {
+	//       "description": "Whether to return all sub-organizations or just immediate children",
+	//       "enum": [
+	//         "all",
+	//         "children"
+	//       ],
+	//       "enumDescriptions": [
+	//         "All sub-organization units.",
+	//         "Immediate children only (default)."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/orgunits",
+	//   "response": {
+	//     "$ref": "OrgUnits"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit",
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit.readonly",
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.orgunits.patch":
+
+type OrgunitsPatchCall struct {
+	s           *Service
+	customerId  string
+	orgUnitPath []string
+	orgunit     *OrgUnit
+	opt_        map[string]interface{}
+}
+
+// Patch: Update Organization Unit. This method supports patch
+// semantics.
+func (r *OrgunitsService) Patch(customerId string, orgUnitPath []string, orgunit *OrgUnit) *OrgunitsPatchCall {
+	c := &OrgunitsPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.orgUnitPath = orgUnitPath
+	c.orgunit = orgunit
+	return c
+}
+
+func (c *OrgunitsPatchCall) Do() (*OrgUnit, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orgunit)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/orgunits{/orgUnitPath*}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{orgUnitPath}", url.QueryEscape(c.orgUnitPath[0]), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OrgUnit)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update Organization Unit. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "directory.orgunits.patch",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "orgUnitPath"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "orgUnitPath": {
+	//       "description": "Full path of the organization unit",
+	//       "location": "path",
+	//       "repeated": true,
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+	//   "request": {
+	//     "$ref": "OrgUnit"
+	//   },
+	//   "response": {
+	//     "$ref": "OrgUnit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit",
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.orgunits.update":
+
+type OrgunitsUpdateCall struct {
+	s           *Service
+	customerId  string
+	orgUnitPath []string
+	orgunit     *OrgUnit
+	opt_        map[string]interface{}
+}
+
+// Update: Update Organization Unit
+func (r *OrgunitsService) Update(customerId string, orgUnitPath []string, orgunit *OrgUnit) *OrgunitsUpdateCall {
+	c := &OrgunitsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.customerId = customerId
+	c.orgUnitPath = orgUnitPath
+	c.orgunit = orgunit
+	return c
+}
+
+func (c *OrgunitsUpdateCall) Do() (*OrgUnit, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orgunit)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "customer/{customerId}/orgunits{/orgUnitPath*}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{orgUnitPath}", url.QueryEscape(c.orgUnitPath[0]), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OrgUnit)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Update Organization Unit",
+	//   "httpMethod": "PUT",
+	//   "id": "directory.orgunits.update",
+	//   "parameterOrder": [
+	//     "customerId",
+	//     "orgUnitPath"
+	//   ],
+	//   "parameters": {
+	//     "customerId": {
+	//       "description": "Immutable id of the Google Apps account",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "orgUnitPath": {
+	//       "description": "Full path of the organization unit",
+	//       "location": "path",
+	//       "repeated": true,
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "customer/{customerId}/orgunits{/orgUnitPath*}",
+	//   "request": {
+	//     "$ref": "OrgUnit"
+	//   },
+	//   "response": {
+	//     "$ref": "OrgUnit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.orgunit",
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.delete":
+
+type UsersDeleteCall struct {
+	s       *Service
+	userKey string
+	opt_    map[string]interface{}
+}
+
+// Delete: Delete user
+func (r *UsersService) Delete(userKey string) *UsersDeleteCall {
+	c := &UsersDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	return c
+}
+
+func (c *UsersDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Delete user",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.users.delete",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.get":
+
+type UsersGetCall struct {
+	s       *Service
+	userKey string
+	opt_    map[string]interface{}
+}
+
+// Get: retrieve user
+func (r *UsersService) Get(userKey string) *UsersGetCall {
+	c := &UsersGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	return c
+}
+
+func (c *UsersGetCall) Do() (*User, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(User)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "retrieve user",
+	//   "httpMethod": "GET",
+	//   "id": "directory.users.get",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}",
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.insert":
+
+type UsersInsertCall struct {
+	s    *Service
+	user *User
+	opt_ map[string]interface{}
+}
+
+// Insert: create user.
+func (r *UsersService) Insert(user *User) *UsersInsertCall {
+	c := &UsersInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.user = user
+	return c
+}
+
+func (c *UsersInsertCall) Do() (*User, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(User)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "create user.",
+	//   "httpMethod": "POST",
+	//   "id": "directory.users.insert",
+	//   "path": "users",
+	//   "request": {
+	//     "$ref": "User"
+	//   },
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.list":
+
+type UsersListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: Retrieve either deleted users or all users in a domain
+// (paginated)
+func (r *UsersService) List() *UsersListCall {
+	c := &UsersListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// Customer sets the optional parameter "customer": Immutable id of the
+// Google Apps account. In case of multi-domain, to fetch all users for
+// a customer, fill this field instead of domain.
+func (c *UsersListCall) Customer(customer string) *UsersListCall {
+	c.opt_["customer"] = customer
+	return c
+}
+
+// Domain sets the optional parameter "domain": Name of the domain. Fill
+// this field to get users from only this domain. To return all users in
+// a multi-domain fill customer field instead.
+func (c *UsersListCall) Domain(domain string) *UsersListCall {
+	c.opt_["domain"] = domain
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return. Default is 100. Max allowed is 500
+func (c *UsersListCall) MaxResults(maxResults int64) *UsersListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Column to use for
+// sorting results
+func (c *UsersListCall) OrderBy(orderBy string) *UsersListCall {
+	c.opt_["orderBy"] = orderBy
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page in the list
+func (c *UsersListCall) PageToken(pageToken string) *UsersListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Query sets the optional parameter "query": Query string for prefix
+// matching searches. Should be of the form "key:value" where key can be
+// "email", "firstName" or "lastName".
+func (c *UsersListCall) Query(query string) *UsersListCall {
+	c.opt_["query"] = query
+	return c
+}
+
+// ShowDeleted sets the optional parameter "showDeleted": If set to true
+// retrieves the list of deleted users. Default is false
+func (c *UsersListCall) ShowDeleted(showDeleted string) *UsersListCall {
+	c.opt_["showDeleted"] = showDeleted
+	return c
+}
+
+// SortOrder sets the optional parameter "sortOrder": Whether to return
+// results in ascending or descending order.
+func (c *UsersListCall) SortOrder(sortOrder string) *UsersListCall {
+	c.opt_["sortOrder"] = sortOrder
+	return c
+}
+
+func (c *UsersListCall) Do() (*Users, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["customer"]; ok {
+		params.Set("customer", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["domain"]; ok {
+		params.Set("domain", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["orderBy"]; ok {
+		params.Set("orderBy", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["query"]; ok {
+		params.Set("query", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["showDeleted"]; ok {
+		params.Set("showDeleted", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortOrder"]; ok {
+		params.Set("sortOrder", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Users)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve either deleted users or all users in a domain (paginated)",
+	//   "httpMethod": "GET",
+	//   "id": "directory.users.list",
+	//   "parameters": {
+	//     "customer": {
+	//       "description": "Immutable id of the Google Apps account. In case of multi-domain, to fetch all users for a customer, fill this field instead of domain.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "domain": {
+	//       "description": "Name of the domain. Fill this field to get users from only this domain. To return all users in a multi-domain fill customer field instead.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return. Default is 100. Max allowed is 500",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "500",
+	//       "minimum": "1",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Column to use for sorting results",
+	//       "enum": [
+	//         "email",
+	//         "familyName",
+	//         "givenName"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Primary email of the user.",
+	//         "User's family name.",
+	//         "User's given name."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page in the list",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "query": {
+	//       "description": "Query string for prefix matching searches. Should be of the form \"key:value\" where key can be \"email\", \"firstName\" or \"lastName\".",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "showDeleted": {
+	//       "description": "If set to true retrieves the list of deleted users. Default is false",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortOrder": {
+	//       "description": "Whether to return results in ascending or descending order.",
+	//       "enum": [
+	//         "ASCENDING",
+	//         "DESCENDING"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Ascending order.",
+	//         "Descending order."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users",
+	//   "response": {
+	//     "$ref": "Users"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.makeAdmin":
+
+type UsersMakeAdminCall struct {
+	s             *Service
+	userKey       string
+	usermakeadmin *UserMakeAdmin
+	opt_          map[string]interface{}
+}
+
+// MakeAdmin: change admin status of a user
+func (r *UsersService) MakeAdmin(userKey string, usermakeadmin *UserMakeAdmin) *UsersMakeAdminCall {
+	c := &UsersMakeAdminCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.usermakeadmin = usermakeadmin
+	return c
+}
+
+func (c *UsersMakeAdminCall) Do() error {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.usermakeadmin)
+	if err != nil {
+		return err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/makeAdmin")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "change admin status of a user",
+	//   "httpMethod": "POST",
+	//   "id": "directory.users.makeAdmin",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user as admin",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/makeAdmin",
+	//   "request": {
+	//     "$ref": "UserMakeAdmin"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.patch":
+
+type UsersPatchCall struct {
+	s       *Service
+	userKey string
+	user    *User
+	opt_    map[string]interface{}
+}
+
+// Patch: update user. This method supports patch semantics.
+func (r *UsersService) Patch(userKey string, user *User) *UsersPatchCall {
+	c := &UsersPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.user = user
+	return c
+}
+
+func (c *UsersPatchCall) Do() (*User, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(User)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "update user. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "directory.users.patch",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user. If Id, it should match with id of user object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}",
+	//   "request": {
+	//     "$ref": "User"
+	//   },
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.undelete":
+
+type UsersUndeleteCall struct {
+	s            *Service
+	userKey      string
+	userundelete *UserUndelete
+	opt_         map[string]interface{}
+}
+
+// Undelete: Undelete a deleted user
+func (r *UsersService) Undelete(userKey string, userundelete *UserUndelete) *UsersUndeleteCall {
+	c := &UsersUndeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.userundelete = userundelete
+	return c
+}
+
+func (c *UsersUndeleteCall) Do() error {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userundelete)
+	if err != nil {
+		return err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/undelete")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Undelete a deleted user",
+	//   "httpMethod": "POST",
+	//   "id": "directory.users.undelete",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "The immutable id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/undelete",
+	//   "request": {
+	//     "$ref": "UserUndelete"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.update":
+
+type UsersUpdateCall struct {
+	s       *Service
+	userKey string
+	user    *User
+	opt_    map[string]interface{}
+}
+
+// Update: update user
+func (r *UsersService) Update(userKey string, user *User) *UsersUpdateCall {
+	c := &UsersUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.user = user
+	return c
+}
+
+func (c *UsersUpdateCall) Do() (*User, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(User)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "update user",
+	//   "httpMethod": "PUT",
+	//   "id": "directory.users.update",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user. If Id, it should match with id of user object",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}",
+	//   "request": {
+	//     "$ref": "User"
+	//   },
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.aliases.delete":
+
+type UsersAliasesDeleteCall struct {
+	s       *Service
+	userKey string
+	alias   string
+	opt_    map[string]interface{}
+}
+
+// Delete: Remove a alias for the user
+func (r *UsersAliasesService) Delete(userKey string, alias string) *UsersAliasesDeleteCall {
+	c := &UsersAliasesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.alias = alias
+	return c
+}
+
+func (c *UsersAliasesDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/aliases/{alias}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{alias}", url.QueryEscape(c.alias), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Remove a alias for the user",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.users.aliases.delete",
+	//   "parameterOrder": [
+	//     "userKey",
+	//     "alias"
+	//   ],
+	//   "parameters": {
+	//     "alias": {
+	//       "description": "The alias to be removed",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/aliases/{alias}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.alias"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.aliases.insert":
+
+type UsersAliasesInsertCall struct {
+	s       *Service
+	userKey string
+	alias   *Alias
+	opt_    map[string]interface{}
+}
+
+// Insert: Add a alias for the user
+func (r *UsersAliasesService) Insert(userKey string, alias *Alias) *UsersAliasesInsertCall {
+	c := &UsersAliasesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.alias = alias
+	return c
+}
+
+func (c *UsersAliasesInsertCall) Do() (*Alias, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.alias)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/aliases")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Alias)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Add a alias for the user",
+	//   "httpMethod": "POST",
+	//   "id": "directory.users.aliases.insert",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/aliases",
+	//   "request": {
+	//     "$ref": "Alias"
+	//   },
+	//   "response": {
+	//     "$ref": "Alias"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.alias"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.aliases.list":
+
+type UsersAliasesListCall struct {
+	s       *Service
+	userKey string
+	opt_    map[string]interface{}
+}
+
+// List: List all aliases for a user
+func (r *UsersAliasesService) List(userKey string) *UsersAliasesListCall {
+	c := &UsersAliasesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	return c
+}
+
+func (c *UsersAliasesListCall) Do() (*Aliases, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/aliases")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Aliases)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all aliases for a user",
+	//   "httpMethod": "GET",
+	//   "id": "directory.users.aliases.list",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/aliases",
+	//   "response": {
+	//     "$ref": "Aliases"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.alias",
+	//     "https://www.googleapis.com/auth/admin.directory.user.alias.readonly",
+	//     "https://www.googleapis.com/auth/admin.directory.user.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.photos.delete":
+
+type UsersPhotosDeleteCall struct {
+	s       *Service
+	userKey string
+	opt_    map[string]interface{}
+}
+
+// Delete: Remove photos for the user
+func (r *UsersPhotosService) Delete(userKey string) *UsersPhotosDeleteCall {
+	c := &UsersPhotosDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	return c
+}
+
+func (c *UsersPhotosDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/photos/thumbnail")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Remove photos for the user",
+	//   "httpMethod": "DELETE",
+	//   "id": "directory.users.photos.delete",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/photos/thumbnail",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.photos.get":
+
+type UsersPhotosGetCall struct {
+	s       *Service
+	userKey string
+	opt_    map[string]interface{}
+}
+
+// Get: Retrieve photo of a user
+func (r *UsersPhotosService) Get(userKey string) *UsersPhotosGetCall {
+	c := &UsersPhotosGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	return c
+}
+
+func (c *UsersPhotosGetCall) Do() (*UserPhoto, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/photos/thumbnail")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UserPhoto)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieve photo of a user",
+	//   "httpMethod": "GET",
+	//   "id": "directory.users.photos.get",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/photos/thumbnail",
+	//   "response": {
+	//     "$ref": "UserPhoto"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user",
+	//     "https://www.googleapis.com/auth/admin.directory.user.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.photos.patch":
+
+type UsersPhotosPatchCall struct {
+	s         *Service
+	userKey   string
+	userphoto *UserPhoto
+	opt_      map[string]interface{}
+}
+
+// Patch: Add a photo for the user. This method supports patch
+// semantics.
+func (r *UsersPhotosService) Patch(userKey string, userphoto *UserPhoto) *UsersPhotosPatchCall {
+	c := &UsersPhotosPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.userphoto = userphoto
+	return c
+}
+
+func (c *UsersPhotosPatchCall) Do() (*UserPhoto, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userphoto)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/photos/thumbnail")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UserPhoto)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Add a photo for the user. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "directory.users.photos.patch",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/photos/thumbnail",
+	//   "request": {
+	//     "$ref": "UserPhoto"
+	//   },
+	//   "response": {
+	//     "$ref": "UserPhoto"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
+
+// method id "directory.users.photos.update":
+
+type UsersPhotosUpdateCall struct {
+	s         *Service
+	userKey   string
+	userphoto *UserPhoto
+	opt_      map[string]interface{}
+}
+
+// Update: Add a photo for the user
+func (r *UsersPhotosService) Update(userKey string, userphoto *UserPhoto) *UsersPhotosUpdateCall {
+	c := &UsersPhotosUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.userphoto = userphoto
+	return c
+}
+
+func (c *UsersPhotosUpdateCall) Do() (*UserPhoto, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userphoto)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/directory/v1/", "users/{userKey}/photos/thumbnail")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UserPhoto)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Add a photo for the user",
+	//   "httpMethod": "PUT",
+	//   "id": "directory.users.photos.update",
+	//   "parameterOrder": [
+	//     "userKey"
+	//   ],
+	//   "parameters": {
+	//     "userKey": {
+	//       "description": "Email or immutable Id of the user",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "users/{userKey}/photos/thumbnail",
+	//   "request": {
+	//     "$ref": "UserPhoto"
+	//   },
+	//   "response": {
+	//     "$ref": "UserPhoto"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.directory.user"
+	//   ]
+	// }
+
+}
diff --git a/admin/reports_v1/admin-api.json b/admin/reports_v1/admin-api.json
new file mode 100644
index 0000000..60586cd
--- /dev/null
+++ b/admin/reports_v1/admin-api.json
@@ -0,0 +1,519 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/o3be_Yx028r4exv8nNbsutFtD94\"",
+ "discoveryVersion": "v1",
+ "id": "admin:reports_v1",
+ "name": "admin",
+ "canonicalName": "reports",
+ "version": "reports_v1",
+ "revision": "20130506",
+ "title": "Admin Reports API",
+ "description": "Allows the administrators of Google Apps customers to fetch reports about the usage, collaboration, security and risk for their users.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "packagePath": "admin",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/search-16.gif",
+  "x32": "http://www.google.com/images/icons/product/search-32.gif"
+ },
+ "documentationLink": "https://developers.google.com/admin-sdk/reports/",
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/admin/reports/v1/",
+ "basePath": "/admin/reports/v1/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "admin/reports/v1/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/admin.reports.audit.readonly": {
+     "description": "View audit reports of Google Apps for your domain"
+    },
+    "https://www.googleapis.com/auth/admin.reports.usage.readonly": {
+     "description": "View usage reports of Google Apps for your domain"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "Activities": {
+   "id": "Activities",
+   "type": "object",
+   "description": "JSON template for a collection of activites. Author: prakhar@google.com (Prakhar Jain)",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "Each record in read response.",
+     "items": {
+      "$ref": "Activity"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list response this is.",
+     "default": "admin#reports#activities"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Token for retrieving the next page"
+    }
+   }
+  },
+  "Activity": {
+   "id": "Activity",
+   "type": "object",
+   "description": "JSON template for the activity resource. Author: prakhar@google.com (Prakhar Jain)",
+   "properties": {
+    "actor": {
+     "type": "object",
+     "description": "User doing the action.",
+     "properties": {
+      "callerType": {
+       "type": "string",
+       "description": "User or OAuth 2LO request."
+      },
+      "email": {
+       "type": "string",
+       "description": "Email address of the user."
+      },
+      "key": {
+       "type": "string",
+       "description": "For OAuth 2LO API requests, consumer_key of the requestor."
+      },
+      "profileId": {
+       "type": "string",
+       "description": "Obfuscated user id of the user."
+      }
+     }
+    },
+    "events": {
+     "type": "array",
+     "description": "Activity events.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "name": {
+        "type": "string",
+        "description": "Name of event."
+       },
+       "parameters": {
+        "type": "array",
+        "description": "Parameter value pairs for various applications.",
+        "items": {
+         "type": "object",
+         "properties": {
+          "boolValue": {
+           "type": "boolean",
+           "description": "Boolean value of the parameter."
+          },
+          "intValue": {
+           "type": "string",
+           "description": "Integral value of the parameter.",
+           "format": "int64"
+          },
+          "name": {
+           "type": "string",
+           "description": "The name of the parameter."
+          },
+          "value": {
+           "type": "string",
+           "description": "String value of the parameter."
+          }
+         }
+        }
+       },
+       "type": {
+        "type": "string",
+        "description": "Type of event."
+       }
+      }
+     }
+    },
+    "id": {
+     "type": "object",
+     "description": "Unique identifier for each activity record.",
+     "properties": {
+      "applicationName": {
+       "type": "string",
+       "description": "Application name to which the event belongs."
+      },
+      "customerId": {
+       "type": "string",
+       "description": "Obfuscated customer ID of the source customer."
+      },
+      "time": {
+       "type": "string",
+       "description": "Time of occurrence of the activity.",
+       "format": "date-time"
+      },
+      "uniqueQualifier": {
+       "type": "string",
+       "description": "Unique qualifier if multiple events have the same time.",
+       "format": "int64"
+      }
+     }
+    },
+    "ipAddress": {
+     "type": "string",
+     "description": "IP Address of the user doing the action."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is.",
+     "default": "admin#reports#activity"
+    },
+    "ownerDomain": {
+     "type": "string",
+     "description": "Domain of source customer."
+    }
+   }
+  },
+  "UsageReport": {
+   "id": "UsageReport",
+   "type": "object",
+   "description": "JSON template for a usage report. Author: prakhar@google.com (Prakhar Jain)",
+   "properties": {
+    "date": {
+     "type": "string",
+     "description": "The date to which the record belongs."
+    },
+    "entity": {
+     "type": "object",
+     "description": "Information about the type of the item.",
+     "properties": {
+      "customerId": {
+       "type": "string",
+       "description": "Obfuscated customer id for the record."
+      },
+      "profileId": {
+       "type": "string",
+       "description": "Obfuscated user id for the record."
+      },
+      "type": {
+       "type": "string",
+       "description": "The type of item, can be a customer or user."
+      },
+      "userEmail": {
+       "type": "string",
+       "description": "user's email."
+      }
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of object.",
+     "default": "admin#reports#usageReport"
+    },
+    "parameters": {
+     "type": "array",
+     "description": "Parameter value pairs for various applications.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "boolValue": {
+        "type": "boolean",
+        "description": "Boolean value of the parameter."
+       },
+       "datetimeValue": {
+        "type": "string",
+        "description": "RFC 3339 formatted value of the parameter.",
+        "format": "date-time"
+       },
+       "intValue": {
+        "type": "string",
+        "description": "Integral value of the parameter.",
+        "format": "int64"
+       },
+       "name": {
+        "type": "string",
+        "description": "The name of the parameter."
+       },
+       "stringValue": {
+        "type": "string",
+        "description": "String value of the parameter."
+       }
+      }
+     }
+    }
+   }
+  },
+  "UsageReports": {
+   "id": "UsageReports",
+   "type": "object",
+   "description": "JSON template for a collection of usage reports. Author: prakhar@google.com (Prakhar Jain)",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "The kind of object.",
+     "default": "admin#reports#usageReports"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Token for retrieving the next page"
+    },
+    "usageReports": {
+     "type": "array",
+     "description": "Various application parameter records.",
+     "items": {
+      "$ref": "UsageReport"
+     }
+    },
+    "warnings": {
+     "type": "array",
+     "description": "Warnings if any.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "code": {
+        "type": "string",
+        "description": "Machine readable code / warning type."
+       },
+       "data": {
+        "type": "array",
+        "description": "Key-Value pairs to give detailed information on the warning.",
+        "items": {
+         "type": "object",
+         "properties": {
+          "key": {
+           "type": "string",
+           "description": "Key associated with a key-value pair to give detailed information on the warning."
+          },
+          "value": {
+           "type": "string",
+           "description": "Value associated with a key-value pair to give detailed information on the warning."
+          }
+         }
+        }
+       },
+       "message": {
+        "type": "string",
+        "description": "Human readable message for the warning."
+       }
+      }
+     }
+    }
+   }
+  }
+ },
+ "resources": {
+  "activities": {
+   "methods": {
+    "list": {
+     "id": "reports.activities.list",
+     "path": "activity/users/{userKey}/applications/{applicationName}",
+     "httpMethod": "GET",
+     "description": "Retrieves a list of activities for a specific customer and application.",
+     "parameters": {
+      "actorIpAddress": {
+       "type": "string",
+       "description": "IP Address of host where the event was performed. Supports both IPv4 and IPv6 addresses.",
+       "location": "query"
+      },
+      "applicationName": {
+       "type": "string",
+       "description": "Application name for which the events are to be retrieved.",
+       "required": true,
+       "pattern": "(admin)|(docs)",
+       "location": "path"
+      },
+      "endTime": {
+       "type": "string",
+       "description": "Return events which occured at or before this time.",
+       "pattern": "(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d):(\\d\\d)(?:\\.(\\d+))?(?:(Z)|([-+])(\\d\\d):(\\d\\d))",
+       "location": "query"
+      },
+      "eventName": {
+       "type": "string",
+       "description": "Name of the event being queried.",
+       "location": "query"
+      },
+      "filters": {
+       "type": "string",
+       "description": "Event parameters in the form [parameter1 name][operator][parameter1 value],[parameter2 name][operator][parameter2 value],...",
+       "pattern": "(.+[\u003c,\u003c=,==,\u003e=,\u003e,\u003c\u003e].+,)*(.+[\u003c,\u003c=,==,\u003e=,\u003e,\u003c\u003e].+)",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Number of activity records to be shown in each page.",
+       "format": "int32",
+       "minimum": "1",
+       "maximum": "1000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page.",
+       "location": "query"
+      },
+      "startTime": {
+       "type": "string",
+       "description": "Return events which occured at or after this time.",
+       "pattern": "(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d):(\\d\\d)(?:\\.(\\d+))?(?:(Z)|([-+])(\\d\\d):(\\d\\d))",
+       "location": "query"
+      },
+      "userKey": {
+       "type": "string",
+       "description": "Represents the profile id or the user email for which the data should be filtered. When 'all' is specified as the userKey, it returns usageReports for all users.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey",
+      "applicationName"
+     ],
+     "response": {
+      "$ref": "Activities"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.reports.audit.readonly"
+     ]
+    }
+   }
+  },
+  "customerUsageReports": {
+   "methods": {
+    "get": {
+     "id": "reports.customerUsageReports.get",
+     "path": "usage/dates/{date}",
+     "httpMethod": "GET",
+     "description": "Retrieves a report which is a collection of properties / statistics for a specific customer.",
+     "parameters": {
+      "date": {
+       "type": "string",
+       "description": "Represents the date in yyyy-mm-dd format for which the data is to be fetched.",
+       "required": true,
+       "pattern": "(\\d){4}-(\\d){2}-(\\d){2}",
+       "location": "path"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page.",
+       "location": "query"
+      },
+      "parameters": {
+       "type": "string",
+       "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
+       "pattern": "(((accounts)|(gmail)|(calendar)|(docs)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)):.+)",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "date"
+     ],
+     "response": {
+      "$ref": "UsageReports"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.reports.usage.readonly"
+     ]
+    }
+   }
+  },
+  "userUsageReport": {
+   "methods": {
+    "get": {
+     "id": "reports.userUsageReport.get",
+     "path": "usage/users/{userKey}/dates/{date}",
+     "httpMethod": "GET",
+     "description": "Retrieves a report which is a collection of properties / statistics for a set of users.",
+     "parameters": {
+      "date": {
+       "type": "string",
+       "description": "Represents the date in yyyy-mm-dd format for which the data is to be fetched.",
+       "required": true,
+       "pattern": "(\\d){4}-(\\d){2}-(\\d){2}",
+       "location": "path"
+      },
+      "filters": {
+       "type": "string",
+       "description": "Represents the set of filters including parameter operator value.",
+       "pattern": "(((accounts)|(gmail)|(calendar)|(docs)):.+[\u003c,\u003c=,==,\u003e=,\u003e,!=].+,)*(((accounts)|(gmail)|(calendar)|(docs)):.+[\u003c,\u003c=,==,\u003e=,\u003e,!=].+)",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return. Maximum allowed is 1000",
+       "format": "uint32",
+       "maximum": "1000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Token to specify next page.",
+       "location": "query"
+      },
+      "parameters": {
+       "type": "string",
+       "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
+       "pattern": "(((accounts)|(gmail)|(calendar)|(docs)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)):.+)",
+       "location": "query"
+      },
+      "userKey": {
+       "type": "string",
+       "description": "Represents the profile id or the user email for which the data should be filtered.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "userKey",
+      "date"
+     ],
+     "response": {
+      "$ref": "UsageReports"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/admin.reports.usage.readonly"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/admin/reports_v1/admin-gen.go b/admin/reports_v1/admin-gen.go
new file mode 100644
index 0000000..d33a612
--- /dev/null
+++ b/admin/reports_v1/admin-gen.go
@@ -0,0 +1,690 @@
+// Package admin provides access to the Admin Reports API.
+//
+// See https://developers.google.com/admin-sdk/reports/
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/admin/reports_v1"
+//   ...
+//   adminService, err := admin.New(oauthHttpClient)
+package admin
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "admin:reports_v1"
+const apiName = "admin"
+const apiVersion = "reports_v1"
+const basePath = "https://www.googleapis.com/admin/reports/v1/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View audit reports of Google Apps for your domain
+	AdminReportsAuditReadonlyScope = "https://www.googleapis.com/auth/admin.reports.audit.readonly"
+
+	// View usage reports of Google Apps for your domain
+	AdminReportsUsageReadonlyScope = "https://www.googleapis.com/auth/admin.reports.usage.readonly"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.Activities = NewActivitiesService(s)
+	s.CustomerUsageReports = NewCustomerUsageReportsService(s)
+	s.UserUsageReport = NewUserUsageReportService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	Activities *ActivitiesService
+
+	CustomerUsageReports *CustomerUsageReportsService
+
+	UserUsageReport *UserUsageReportService
+}
+
+func NewActivitiesService(s *Service) *ActivitiesService {
+	rs := &ActivitiesService{s: s}
+	return rs
+}
+
+type ActivitiesService struct {
+	s *Service
+}
+
+func NewCustomerUsageReportsService(s *Service) *CustomerUsageReportsService {
+	rs := &CustomerUsageReportsService{s: s}
+	return rs
+}
+
+type CustomerUsageReportsService struct {
+	s *Service
+}
+
+func NewUserUsageReportService(s *Service) *UserUsageReportService {
+	rs := &UserUsageReportService{s: s}
+	return rs
+}
+
+type UserUsageReportService struct {
+	s *Service
+}
+
+type Activities struct {
+	// Items: Each record in read response.
+	Items []*Activity `json:"items,omitempty"`
+
+	// Kind: Kind of list response this is.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Token for retrieving the next page
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type Activity struct {
+	// Actor: User doing the action.
+	Actor *ActivityActor `json:"actor,omitempty"`
+
+	// Events: Activity events.
+	Events []*ActivityEvents `json:"events,omitempty"`
+
+	// Id: Unique identifier for each activity record.
+	Id *ActivityId `json:"id,omitempty"`
+
+	// IpAddress: IP Address of the user doing the action.
+	IpAddress string `json:"ipAddress,omitempty"`
+
+	// Kind: Kind of resource this is.
+	Kind string `json:"kind,omitempty"`
+
+	// OwnerDomain: Domain of source customer.
+	OwnerDomain string `json:"ownerDomain,omitempty"`
+}
+
+type ActivityActor struct {
+	// CallerType: User or OAuth 2LO request.
+	CallerType string `json:"callerType,omitempty"`
+
+	// Email: Email address of the user.
+	Email string `json:"email,omitempty"`
+
+	// Key: For OAuth 2LO API requests, consumer_key of the requestor.
+	Key string `json:"key,omitempty"`
+
+	// ProfileId: Obfuscated user id of the user.
+	ProfileId string `json:"profileId,omitempty"`
+}
+
+type ActivityEvents struct {
+	// Name: Name of event.
+	Name string `json:"name,omitempty"`
+
+	// Parameters: Parameter value pairs for various applications.
+	Parameters []*ActivityEventsParameters `json:"parameters,omitempty"`
+
+	// Type: Type of event.
+	Type string `json:"type,omitempty"`
+}
+
+type ActivityEventsParameters struct {
+	// BoolValue: Boolean value of the parameter.
+	BoolValue bool `json:"boolValue,omitempty"`
+
+	// IntValue: Integral value of the parameter.
+	IntValue int64 `json:"intValue,omitempty,string"`
+
+	// Name: The name of the parameter.
+	Name string `json:"name,omitempty"`
+
+	// Value: String value of the parameter.
+	Value string `json:"value,omitempty"`
+}
+
+type ActivityId struct {
+	// ApplicationName: Application name to which the event belongs.
+	ApplicationName string `json:"applicationName,omitempty"`
+
+	// CustomerId: Obfuscated customer ID of the source customer.
+	CustomerId string `json:"customerId,omitempty"`
+
+	// Time: Time of occurrence of the activity.
+	Time string `json:"time,omitempty"`
+
+	// UniqueQualifier: Unique qualifier if multiple events have the same
+	// time.
+	UniqueQualifier int64 `json:"uniqueQualifier,omitempty,string"`
+}
+
+type UsageReport struct {
+	// Date: The date to which the record belongs.
+	Date string `json:"date,omitempty"`
+
+	// Entity: Information about the type of the item.
+	Entity *UsageReportEntity `json:"entity,omitempty"`
+
+	// Kind: The kind of object.
+	Kind string `json:"kind,omitempty"`
+
+	// Parameters: Parameter value pairs for various applications.
+	Parameters []*UsageReportParameters `json:"parameters,omitempty"`
+}
+
+type UsageReportEntity struct {
+	// CustomerId: Obfuscated customer id for the record.
+	CustomerId string `json:"customerId,omitempty"`
+
+	// ProfileId: Obfuscated user id for the record.
+	ProfileId string `json:"profileId,omitempty"`
+
+	// Type: The type of item, can be a customer or user.
+	Type string `json:"type,omitempty"`
+
+	// UserEmail: user's email.
+	UserEmail string `json:"userEmail,omitempty"`
+}
+
+type UsageReportParameters struct {
+	// BoolValue: Boolean value of the parameter.
+	BoolValue bool `json:"boolValue,omitempty"`
+
+	// DatetimeValue: RFC 3339 formatted value of the parameter.
+	DatetimeValue string `json:"datetimeValue,omitempty"`
+
+	// IntValue: Integral value of the parameter.
+	IntValue int64 `json:"intValue,omitempty,string"`
+
+	// Name: The name of the parameter.
+	Name string `json:"name,omitempty"`
+
+	// StringValue: String value of the parameter.
+	StringValue string `json:"stringValue,omitempty"`
+}
+
+type UsageReports struct {
+	// Kind: The kind of object.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Token for retrieving the next page
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// UsageReports: Various application parameter records.
+	UsageReports []*UsageReport `json:"usageReports,omitempty"`
+
+	// Warnings: Warnings if any.
+	Warnings []*UsageReportsWarnings `json:"warnings,omitempty"`
+}
+
+type UsageReportsWarnings struct {
+	// Code: Machine readable code / warning type.
+	Code string `json:"code,omitempty"`
+
+	// Data: Key-Value pairs to give detailed information on the warning.
+	Data []*UsageReportsWarningsData `json:"data,omitempty"`
+
+	// Message: Human readable message for the warning.
+	Message string `json:"message,omitempty"`
+}
+
+type UsageReportsWarningsData struct {
+	// Key: Key associated with a key-value pair to give detailed
+	// information on the warning.
+	Key string `json:"key,omitempty"`
+
+	// Value: Value associated with a key-value pair to give detailed
+	// information on the warning.
+	Value string `json:"value,omitempty"`
+}
+
+// method id "reports.activities.list":
+
+type ActivitiesListCall struct {
+	s               *Service
+	userKey         string
+	applicationName string
+	opt_            map[string]interface{}
+}
+
+// List: Retrieves a list of activities for a specific customer and
+// application.
+func (r *ActivitiesService) List(userKey string, applicationName string) *ActivitiesListCall {
+	c := &ActivitiesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.applicationName = applicationName
+	return c
+}
+
+// ActorIpAddress sets the optional parameter "actorIpAddress": IP
+// Address of host where the event was performed. Supports both IPv4 and
+// IPv6 addresses.
+func (c *ActivitiesListCall) ActorIpAddress(actorIpAddress string) *ActivitiesListCall {
+	c.opt_["actorIpAddress"] = actorIpAddress
+	return c
+}
+
+// EndTime sets the optional parameter "endTime": Return events which
+// occured at or before this time.
+func (c *ActivitiesListCall) EndTime(endTime string) *ActivitiesListCall {
+	c.opt_["endTime"] = endTime
+	return c
+}
+
+// EventName sets the optional parameter "eventName": Name of the event
+// being queried.
+func (c *ActivitiesListCall) EventName(eventName string) *ActivitiesListCall {
+	c.opt_["eventName"] = eventName
+	return c
+}
+
+// Filters sets the optional parameter "filters": Event parameters in
+// the form [parameter1 name][operator][parameter1 value],[parameter2
+// name][operator][parameter2 value],...
+func (c *ActivitiesListCall) Filters(filters string) *ActivitiesListCall {
+	c.opt_["filters"] = filters
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Number of
+// activity records to be shown in each page.
+func (c *ActivitiesListCall) MaxResults(maxResults int64) *ActivitiesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page.
+func (c *ActivitiesListCall) PageToken(pageToken string) *ActivitiesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// StartTime sets the optional parameter "startTime": Return events
+// which occured at or after this time.
+func (c *ActivitiesListCall) StartTime(startTime string) *ActivitiesListCall {
+	c.opt_["startTime"] = startTime
+	return c
+}
+
+func (c *ActivitiesListCall) Do() (*Activities, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["actorIpAddress"]; ok {
+		params.Set("actorIpAddress", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["endTime"]; ok {
+		params.Set("endTime", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["eventName"]; ok {
+		params.Set("eventName", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["filters"]; ok {
+		params.Set("filters", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["startTime"]; ok {
+		params.Set("startTime", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/reports/v1/", "activity/users/{userKey}/applications/{applicationName}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{applicationName}", url.QueryEscape(c.applicationName), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Activities)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a list of activities for a specific customer and application.",
+	//   "httpMethod": "GET",
+	//   "id": "reports.activities.list",
+	//   "parameterOrder": [
+	//     "userKey",
+	//     "applicationName"
+	//   ],
+	//   "parameters": {
+	//     "actorIpAddress": {
+	//       "description": "IP Address of host where the event was performed. Supports both IPv4 and IPv6 addresses.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "applicationName": {
+	//       "description": "Application name for which the events are to be retrieved.",
+	//       "location": "path",
+	//       "pattern": "(admin)|(docs)",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "endTime": {
+	//       "description": "Return events which occured at or before this time.",
+	//       "location": "query",
+	//       "pattern": "(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d):(\\d\\d)(?:\\.(\\d+))?(?:(Z)|([-+])(\\d\\d):(\\d\\d))",
+	//       "type": "string"
+	//     },
+	//     "eventName": {
+	//       "description": "Name of the event being queried.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "filters": {
+	//       "description": "Event parameters in the form [parameter1 name][operator][parameter1 value],[parameter2 name][operator][parameter2 value],...",
+	//       "location": "query",
+	//       "pattern": "(.+[\u003c,\u003c=,==,\u003e=,\u003e,\u003c\u003e].+,)*(.+[\u003c,\u003c=,==,\u003e=,\u003e,\u003c\u003e].+)",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Number of activity records to be shown in each page.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "1000",
+	//       "minimum": "1",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "startTime": {
+	//       "description": "Return events which occured at or after this time.",
+	//       "location": "query",
+	//       "pattern": "(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d):(\\d\\d)(?:\\.(\\d+))?(?:(Z)|([-+])(\\d\\d):(\\d\\d))",
+	//       "type": "string"
+	//     },
+	//     "userKey": {
+	//       "description": "Represents the profile id or the user email for which the data should be filtered. When 'all' is specified as the userKey, it returns usageReports for all users.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "activity/users/{userKey}/applications/{applicationName}",
+	//   "response": {
+	//     "$ref": "Activities"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.reports.audit.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "reports.customerUsageReports.get":
+
+type CustomerUsageReportsGetCall struct {
+	s    *Service
+	date string
+	opt_ map[string]interface{}
+}
+
+// Get: Retrieves a report which is a collection of properties /
+// statistics for a specific customer.
+func (r *CustomerUsageReportsService) Get(date string) *CustomerUsageReportsGetCall {
+	c := &CustomerUsageReportsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.date = date
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page.
+func (c *CustomerUsageReportsGetCall) PageToken(pageToken string) *CustomerUsageReportsGetCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Parameters sets the optional parameter "parameters": Represents the
+// application name, parameter name pairs to fetch in csv as
+// app_name1:param_name1, app_name2:param_name2.
+func (c *CustomerUsageReportsGetCall) Parameters(parameters string) *CustomerUsageReportsGetCall {
+	c.opt_["parameters"] = parameters
+	return c
+}
+
+func (c *CustomerUsageReportsGetCall) Do() (*UsageReports, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["parameters"]; ok {
+		params.Set("parameters", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/reports/v1/", "usage/dates/{date}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{date}", url.QueryEscape(c.date), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UsageReports)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a report which is a collection of properties / statistics for a specific customer.",
+	//   "httpMethod": "GET",
+	//   "id": "reports.customerUsageReports.get",
+	//   "parameterOrder": [
+	//     "date"
+	//   ],
+	//   "parameters": {
+	//     "date": {
+	//       "description": "Represents the date in yyyy-mm-dd format for which the data is to be fetched.",
+	//       "location": "path",
+	//       "pattern": "(\\d){4}-(\\d){2}-(\\d){2}",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "parameters": {
+	//       "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
+	//       "location": "query",
+	//       "pattern": "(((accounts)|(gmail)|(calendar)|(docs)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)):.+)",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "usage/dates/{date}",
+	//   "response": {
+	//     "$ref": "UsageReports"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.reports.usage.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "reports.userUsageReport.get":
+
+type UserUsageReportGetCall struct {
+	s       *Service
+	userKey string
+	date    string
+	opt_    map[string]interface{}
+}
+
+// Get: Retrieves a report which is a collection of properties /
+// statistics for a set of users.
+func (r *UserUsageReportService) Get(userKey string, date string) *UserUsageReportGetCall {
+	c := &UserUsageReportGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.userKey = userKey
+	c.date = date
+	return c
+}
+
+// Filters sets the optional parameter "filters": Represents the set of
+// filters including parameter operator value.
+func (c *UserUsageReportGetCall) Filters(filters string) *UserUsageReportGetCall {
+	c.opt_["filters"] = filters
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return. Maximum allowed is 1000
+func (c *UserUsageReportGetCall) MaxResults(maxResults int64) *UserUsageReportGetCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Token to specify
+// next page.
+func (c *UserUsageReportGetCall) PageToken(pageToken string) *UserUsageReportGetCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Parameters sets the optional parameter "parameters": Represents the
+// application name, parameter name pairs to fetch in csv as
+// app_name1:param_name1, app_name2:param_name2.
+func (c *UserUsageReportGetCall) Parameters(parameters string) *UserUsageReportGetCall {
+	c.opt_["parameters"] = parameters
+	return c
+}
+
+func (c *UserUsageReportGetCall) Do() (*UsageReports, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filters"]; ok {
+		params.Set("filters", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["parameters"]; ok {
+		params.Set("parameters", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/admin/reports/v1/", "usage/users/{userKey}/dates/{date}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userKey}", url.QueryEscape(c.userKey), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{date}", url.QueryEscape(c.date), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UsageReports)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a report which is a collection of properties / statistics for a set of users.",
+	//   "httpMethod": "GET",
+	//   "id": "reports.userUsageReport.get",
+	//   "parameterOrder": [
+	//     "userKey",
+	//     "date"
+	//   ],
+	//   "parameters": {
+	//     "date": {
+	//       "description": "Represents the date in yyyy-mm-dd format for which the data is to be fetched.",
+	//       "location": "path",
+	//       "pattern": "(\\d){4}-(\\d){2}-(\\d){2}",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "filters": {
+	//       "description": "Represents the set of filters including parameter operator value.",
+	//       "location": "query",
+	//       "pattern": "(((accounts)|(gmail)|(calendar)|(docs)):.+[\u003c,\u003c=,==,\u003e=,\u003e,!=].+,)*(((accounts)|(gmail)|(calendar)|(docs)):.+[\u003c,\u003c=,==,\u003e=,\u003e,!=].+)",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return. Maximum allowed is 1000",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "1000",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Token to specify next page.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "parameters": {
+	//       "description": "Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.",
+	//       "location": "query",
+	//       "pattern": "(((accounts)|(gmail)|(calendar)|(docs)):.+,)*(((accounts)|(gmail)|(calendar)|(docs)):.+)",
+	//       "type": "string"
+	//     },
+	//     "userKey": {
+	//       "description": "Represents the profile id or the user email for which the data should be filtered.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "usage/users/{userKey}/dates/{date}",
+	//   "response": {
+	//     "$ref": "UsageReports"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/admin.reports.usage.readonly"
+	//   ]
+	// }
+
+}
diff --git a/adsense/v1.1/adsense-api.json b/adsense/v1.1/adsense-api.json
index c7ee9d4..0372359 100644
--- a/adsense/v1.1/adsense-api.json
+++ b/adsense/v1.1/adsense-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/5JtMgGJmjPOPBZfZhFa8oTSl5iU\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/Qnn4L_HVgP8gCRS8494aO_LEQg0\"",
  "discoveryVersion": "v1",
  "id": "adsense:v1.1",
  "name": "adsense",
  "canonicalName": "AdSense",
  "version": "v1.1",
- "revision": "20130411",
+ "revision": "20130605",
  "title": "AdSense Management API",
  "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/adsense-16.png",
   "x32": "http://www.google.com/images/icons/product/adsense-32.png"
diff --git a/adsense/v1.1/adsense-gen.go b/adsense/v1.1/adsense-gen.go
index fcbd371..6d45aac 100644
--- a/adsense/v1.1/adsense-gen.go
+++ b/adsense/v1.1/adsense-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adsense:v1.1"
 const apiName = "adsense"
@@ -507,14 +510,16 @@
 		params.Set("tree", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -597,11 +602,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -683,14 +690,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -764,16 +773,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -878,15 +889,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -995,16 +1008,18 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1092,16 +1107,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1197,15 +1214,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1317,16 +1336,18 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1506,14 +1527,16 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/reports")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1667,15 +1690,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "accounts/{accountId}/adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1773,11 +1798,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1839,15 +1866,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients/{adClientId}/adunits/{adUnitId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1943,14 +1972,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2050,15 +2081,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients/{adClientId}/adunits/{adUnitId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2136,15 +2169,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients/{adClientId}/customchannels/{customChannelId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2231,14 +2266,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2341,15 +2378,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients/{adClientId}/customchannels/{customChannelId}/adunits")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2532,11 +2571,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "reports")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2687,14 +2728,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.1/", "adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2742,12 +2785,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/adsense/v1.2/adsense-api.json b/adsense/v1.2/adsense-api.json
index 587be53..98b1cc4 100644
--- a/adsense/v1.2/adsense-api.json
+++ b/adsense/v1.2/adsense-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/jPUUAf0fbO472zp4iQcDTlekxzw\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/Po2vXm4qf5nIA0ezXZo5C92dPyk\"",
  "discoveryVersion": "v1",
  "id": "adsense:v1.2",
  "name": "adsense",
  "canonicalName": "AdSense",
  "version": "v1.2",
- "revision": "20130411",
+ "revision": "20130605",
  "title": "AdSense Management API",
  "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/adsense-16.png",
   "x32": "http://www.google.com/images/icons/product/adsense-32.png"
diff --git a/adsense/v1.2/adsense-gen.go b/adsense/v1.2/adsense-gen.go
index 29634cb..da409b5 100644
--- a/adsense/v1.2/adsense-gen.go
+++ b/adsense/v1.2/adsense-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adsense:v1.2"
 const apiName = "adsense"
@@ -733,14 +736,16 @@
 		params.Set("tree", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -823,11 +828,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -909,14 +916,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -990,16 +999,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1104,15 +1115,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1221,16 +1234,18 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1318,16 +1333,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1423,15 +1440,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1543,16 +1562,18 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1732,14 +1753,16 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/reports")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1902,15 +1925,17 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/reports/{savedReportId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{savedReportId}", cleanPathString(c.savedReportId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedReportId}", url.QueryEscape(c.savedReportId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2017,14 +2042,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/reports/saved")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2095,15 +2122,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/savedadstyles/{savedAdStyleId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{savedAdStyleId}", cleanPathString(c.savedAdStyleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedAdStyleId}", url.QueryEscape(c.savedAdStyleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2189,14 +2218,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/savedadstyles")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2290,15 +2321,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "accounts/{accountId}/adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2396,11 +2429,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2462,15 +2497,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients/{adClientId}/adunits/{adUnitId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2566,14 +2603,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2673,15 +2712,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients/{adClientId}/adunits/{adUnitId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2759,15 +2800,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients/{adClientId}/customchannels/{customChannelId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2854,14 +2897,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2964,15 +3009,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients/{adClientId}/customchannels/{customChannelId}/adunits")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3155,11 +3202,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "reports")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3319,14 +3368,16 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "reports/{savedReportId}")
-	urls = strings.Replace(urls, "{savedReportId}", cleanPathString(c.savedReportId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedReportId}", url.QueryEscape(c.savedReportId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3426,11 +3477,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "reports/saved")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3490,14 +3543,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "savedadstyles/{savedAdStyleId}")
-	urls = strings.Replace(urls, "{savedAdStyleId}", cleanPathString(c.savedAdStyleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedAdStyleId}", url.QueryEscape(c.savedAdStyleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3576,11 +3631,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "savedadstyles")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3663,14 +3720,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.2/", "adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3718,12 +3777,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/adsense/v1.3/adsense-api.json b/adsense/v1.3/adsense-api.json
new file mode 100644
index 0000000..33a8096
--- /dev/null
+++ b/adsense/v1.3/adsense-api.json
@@ -0,0 +1,2250 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/oIPv3ZggdK9DywzNXfM47QX3VqE\"",
+ "discoveryVersion": "v1",
+ "id": "adsense:v1.3",
+ "name": "adsense",
+ "canonicalName": "AdSense",
+ "version": "v1.3",
+ "revision": "20130605",
+ "title": "AdSense Management API",
+ "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/adsense-16.png",
+  "x32": "http://www.google.com/images/icons/product/adsense-32.png"
+ },
+ "documentationLink": "https://developers.google.com/adsense/management/",
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/adsense/v1.3/",
+ "basePath": "/adsense/v1.3/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "adsense/v1.3/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "csv",
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of text/csv",
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/adsense": {
+     "description": "View and manage your AdSense data"
+    },
+    "https://www.googleapis.com/auth/adsense.readonly": {
+     "description": "View your AdSense data"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "Account": {
+   "id": "Account",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this account."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#account.",
+     "default": "adsense#account"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of this account."
+    },
+    "premium": {
+     "type": "boolean",
+     "description": "Whether this account is premium."
+    },
+    "subAccounts": {
+     "type": "array",
+     "description": "Sub accounts of the this account.",
+     "items": {
+      "$ref": "Account"
+     }
+    }
+   }
+  },
+  "Accounts": {
+   "id": "Accounts",
+   "type": "object",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "ETag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The accounts returned in this list response.",
+     "items": {
+      "$ref": "Account"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#accounts.",
+     "default": "adsense#accounts"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through accounts. To retrieve the next page of results, set the next request's \"pageToken\" value to this."
+    }
+   }
+  },
+  "AdClient": {
+   "id": "AdClient",
+   "type": "object",
+   "properties": {
+    "arcOptIn": {
+     "type": "boolean",
+     "description": "Whether this ad client is opted in to ARC."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this ad client."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#adClient.",
+     "default": "adsense#adClient"
+    },
+    "productCode": {
+     "type": "string",
+     "description": "This ad client's product code, which corresponds to the PRODUCT_CODE report dimension."
+    },
+    "supportsReporting": {
+     "type": "boolean",
+     "description": "Whether this ad client supports being reported on."
+    }
+   }
+  },
+  "AdClients": {
+   "id": "AdClients",
+   "type": "object",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "ETag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The ad clients returned in this list response.",
+     "items": {
+      "$ref": "AdClient"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#adClients.",
+     "default": "adsense#adClients"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through ad clients. To retrieve the next page of results, set the next request's \"pageToken\" value to this."
+    }
+   }
+  },
+  "AdCode": {
+   "id": "AdCode",
+   "type": "object",
+   "properties": {
+    "adCode": {
+     "type": "string",
+     "description": "The ad code snippet."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind this is, in this case adsense#adCode.",
+     "default": "adsense#adCode"
+    }
+   }
+  },
+  "AdStyle": {
+   "id": "AdStyle",
+   "type": "object",
+   "properties": {
+    "colors": {
+     "type": "object",
+     "description": "The colors which are included in the style. These are represented as six hexadecimal characters, similar to HTML color codes, but without the leading hash.",
+     "properties": {
+      "background": {
+       "type": "string",
+       "description": "The color of the ad background."
+      },
+      "border": {
+       "type": "string",
+       "description": "The color of the ad border."
+      },
+      "text": {
+       "type": "string",
+       "description": "The color of the ad text."
+      },
+      "title": {
+       "type": "string",
+       "description": "The color of the ad title."
+      },
+      "url": {
+       "type": "string",
+       "description": "The color of the ad url."
+      }
+     }
+    },
+    "corners": {
+     "type": "string",
+     "description": "The style of the corners in the ad."
+    },
+    "font": {
+     "type": "object",
+     "description": "The font which is included in the style.",
+     "properties": {
+      "family": {
+       "type": "string",
+       "description": "The family of the font."
+      },
+      "size": {
+       "type": "string",
+       "description": "The size of the font."
+      }
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind this is, in this case adsense#adStyle.",
+     "default": "adsense#adStyle"
+    }
+   }
+  },
+  "AdUnit": {
+   "id": "AdUnit",
+   "type": "object",
+   "properties": {
+    "code": {
+     "type": "string",
+     "description": "Identity code of this ad unit, not necessarily unique across ad clients."
+    },
+    "contentAdsSettings": {
+     "type": "object",
+     "description": "Settings specific to content ads (AFC) and highend mobile content ads (AFMC).",
+     "properties": {
+      "backupOption": {
+       "type": "object",
+       "description": "The backup option to be used in instances where no ad is available.",
+       "properties": {
+        "color": {
+         "type": "string",
+         "description": "Color to use when type is set to COLOR."
+        },
+        "type": {
+         "type": "string",
+         "description": "Type of the backup option. Possible values are BLANK, COLOR and URL."
+        },
+        "url": {
+         "type": "string",
+         "description": "URL to use when type is set to URL."
+        }
+       }
+      },
+      "size": {
+       "type": "string",
+       "description": "Size of this ad unit."
+      },
+      "type": {
+       "type": "string",
+       "description": "Type of this ad unit."
+      }
+     }
+    },
+    "customStyle": {
+     "$ref": "AdStyle",
+     "description": "Custom style information specific to this ad unit."
+    },
+    "feedAdsSettings": {
+     "type": "object",
+     "description": "Settings specific to feed ads (AFF).",
+     "properties": {
+      "adPosition": {
+       "type": "string",
+       "description": "The position of the ads relative to the feed entries."
+      },
+      "frequency": {
+       "type": "integer",
+       "description": "The frequency at which ads should appear in the feed (i.e. every N entries).",
+       "format": "int32"
+      },
+      "minimumWordCount": {
+       "type": "integer",
+       "description": "The minimum length an entry should be in order to have attached ads.",
+       "format": "int32"
+      },
+      "type": {
+       "type": "string",
+       "description": "The type of ads which should appear."
+      }
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this ad unit. This should be considered an opaque identifier; it is not safe to rely on it being in any particular format."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#adUnit.",
+     "default": "adsense#adUnit"
+    },
+    "mobileContentAdsSettings": {
+     "type": "object",
+     "description": "Settings specific to WAP mobile content ads (AFMC).",
+     "properties": {
+      "markupLanguage": {
+       "type": "string",
+       "description": "The markup language to use for this ad unit."
+      },
+      "scriptingLanguage": {
+       "type": "string",
+       "description": "The scripting language to use for this ad unit."
+      },
+      "size": {
+       "type": "string",
+       "description": "Size of this ad unit."
+      },
+      "type": {
+       "type": "string",
+       "description": "Type of this ad unit."
+      }
+     }
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of this ad unit."
+    },
+    "savedStyleId": {
+     "type": "string",
+     "description": "ID of the saved ad style which holds this ad unit's style information."
+    },
+    "status": {
+     "type": "string",
+     "description": "Status of this ad unit. Possible values are:\nNEW: Indicates that the ad unit was created within the last seven days and does not yet have any activity associated with it.\n\nACTIVE: Indicates that there has been activity on this ad unit in the last seven days.\n\nINACTIVE: Indicates that there has been no activity on this ad unit in the last seven days."
+    }
+   }
+  },
+  "AdUnits": {
+   "id": "AdUnits",
+   "type": "object",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "ETag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The ad units returned in this list response.",
+     "items": {
+      "$ref": "AdUnit"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#adUnits.",
+     "default": "adsense#adUnits"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through ad units. To retrieve the next page of results, set the next request's \"pageToken\" value to this."
+    }
+   }
+  },
+  "AdsenseReportsGenerateResponse": {
+   "id": "AdsenseReportsGenerateResponse",
+   "type": "object",
+   "properties": {
+    "averages": {
+     "type": "array",
+     "description": "The averages of the report. This is the same length as any other row in the report; cells corresponding to dimension columns are empty.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "headers": {
+     "type": "array",
+     "description": "The header information of the columns requested in the report. This is a list of headers; one for each dimension in the request, followed by one for each metric in the request.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "currency": {
+        "type": "string",
+        "description": "The currency of this column. Only present if the header type is METRIC_CURRENCY."
+       },
+       "name": {
+        "type": "string",
+        "description": "The name of the header."
+       },
+       "type": {
+        "type": "string",
+        "description": "The type of the header; one of DIMENSION, METRIC_TALLY, METRIC_RATIO, or METRIC_CURRENCY."
+       }
+      }
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind this is, in this case adsense#report.",
+     "default": "adsense#report"
+    },
+    "rows": {
+     "type": "array",
+     "description": "The output rows of the report. Each row is a list of cells; one for each dimension in the request, followed by one for each metric in the request. The dimension cells contain strings, and the metric cells contain numbers.",
+     "items": {
+      "type": "array",
+      "items": {
+       "type": "string"
+      }
+     }
+    },
+    "totalMatchedRows": {
+     "type": "string",
+     "description": "The total number of rows matched by the report request. Fewer rows may be returned in the response due to being limited by the row count requested or the report row limit.",
+     "format": "int64"
+    },
+    "totals": {
+     "type": "array",
+     "description": "The totals of the report. This is the same length as any other row in the report; cells corresponding to dimension columns are empty.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "warnings": {
+     "type": "array",
+     "description": "Any warnings associated with generation of the report.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "Alert": {
+   "id": "Alert",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this alert. This should be considered an opaque identifier; it is not safe to rely on it being in any particular format."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#alert.",
+     "default": "adsense#alert"
+    },
+    "message": {
+     "type": "string",
+     "description": "The localized alert message."
+    },
+    "severity": {
+     "type": "string",
+     "description": "Severity of this alert. Possible values: INFO, WARNING, SEVERE."
+    },
+    "type": {
+     "type": "string",
+     "description": "Type of this alert. Possible values: SELF_HOLD, MIGRATED_TO_BILLING3, ADDRESS_PIN_VERIFICATION, PHONE_PIN_VERIFICATION, CORPORATE_ENTITY, GRAYLISTED_PUBLISHER, API_HOLD."
+    }
+   }
+  },
+  "Alerts": {
+   "id": "Alerts",
+   "type": "object",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "The alerts returned in this list response.",
+     "items": {
+      "$ref": "Alert"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#alerts.",
+     "default": "adsense#alerts"
+    }
+   }
+  },
+  "CustomChannel": {
+   "id": "CustomChannel",
+   "type": "object",
+   "properties": {
+    "code": {
+     "type": "string",
+     "description": "Code of this custom channel, not necessarily unique across ad clients."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this custom channel. This should be considered an opaque identifier; it is not safe to rely on it being in any particular format."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#customChannel.",
+     "default": "adsense#customChannel"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of this custom channel."
+    },
+    "targetingInfo": {
+     "type": "object",
+     "description": "The targeting information of this custom channel, if activated.",
+     "properties": {
+      "adsAppearOn": {
+       "type": "string",
+       "description": "The name used to describe this channel externally."
+      },
+      "description": {
+       "type": "string",
+       "description": "The external description of the channel."
+      },
+      "location": {
+       "type": "string",
+       "description": "The locations in which ads appear. (Only valid for content and mobile content ads). Acceptable values for content ads are: TOP_LEFT, TOP_CENTER, TOP_RIGHT, MIDDLE_LEFT, MIDDLE_CENTER, MIDDLE_RIGHT, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT, MULTIPLE_LOCATIONS. Acceptable values for mobile content ads are: TOP, MIDDLE, BOTTOM, MULTIPLE_LOCATIONS."
+      },
+      "siteLanguage": {
+       "type": "string",
+       "description": "The language of the sites ads will be displayed on."
+      }
+     }
+    }
+   }
+  },
+  "CustomChannels": {
+   "id": "CustomChannels",
+   "type": "object",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "ETag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The custom channels returned in this list response.",
+     "items": {
+      "$ref": "CustomChannel"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#customChannels.",
+     "default": "adsense#customChannels"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through custom channels. To retrieve the next page of results, set the next request's \"pageToken\" value to this."
+    }
+   }
+  },
+  "Metadata": {
+   "id": "Metadata",
+   "type": "object",
+   "properties": {
+    "items": {
+     "type": "array",
+     "items": {
+      "$ref": "ReportingMetadataEntry"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#metadata.",
+     "default": "adsense#metadata"
+    }
+   }
+  },
+  "ReportingMetadataEntry": {
+   "id": "ReportingMetadataEntry",
+   "type": "object",
+   "properties": {
+    "compatibleDimensions": {
+     "type": "array",
+     "description": "For metrics this is a list of dimension IDs which the metric is compatible with, for dimensions it is a list of compatibility groups the dimension belongs to.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "compatibleMetrics": {
+     "type": "array",
+     "description": "The names of the metrics the dimension or metric this reporting metadata entry describes is compatible with.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this reporting metadata entry, corresponding to the name of the appropriate dimension or metric."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#reportingMetadataEntry.",
+     "default": "adsense#reportingMetadataEntry"
+    },
+    "requiredDimensions": {
+     "type": "array",
+     "description": "The names of the dimensions which the dimension or metric this reporting metadata entry describes requires to also be present in order for the report to be valid. Omitting these will not cause an error or warning, but may result in data which cannot be correctly interpreted.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "requiredMetrics": {
+     "type": "array",
+     "description": "The names of the metrics which the dimension or metric this reporting metadata entry describes requires to also be present in order for the report to be valid. Omitting these will not cause an error or warning, but may result in data which cannot be correctly interpreted.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "supportedProducts": {
+     "type": "array",
+     "description": "The codes of the projects supported by the dimension or metric this reporting metadata entry describes.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "SavedAdStyle": {
+   "id": "SavedAdStyle",
+   "type": "object",
+   "properties": {
+    "adStyle": {
+     "$ref": "AdStyle",
+     "description": "The AdStyle itself."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this saved ad style. This should be considered an opaque identifier; it is not safe to rely on it being in any particular format."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#savedAdStyle.",
+     "default": "adsense#savedAdStyle"
+    },
+    "name": {
+     "type": "string",
+     "description": "The user selected name of this SavedAdStyle."
+    }
+   }
+  },
+  "SavedAdStyles": {
+   "id": "SavedAdStyles",
+   "type": "object",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "ETag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The saved ad styles returned in this list response.",
+     "items": {
+      "$ref": "SavedAdStyle"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#savedAdStyles.",
+     "default": "adsense#savedAdStyles"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through ad units. To retrieve the next page of results, set the next request's \"pageToken\" value to this."
+    }
+   }
+  },
+  "SavedReport": {
+   "id": "SavedReport",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this saved report."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#savedReport.",
+     "default": "adsense#savedReport"
+    },
+    "name": {
+     "type": "string",
+     "description": "This saved report's name."
+    }
+   }
+  },
+  "SavedReports": {
+   "id": "SavedReports",
+   "type": "object",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "ETag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The saved reports returned in this list response.",
+     "items": {
+      "$ref": "SavedReport"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#savedReports.",
+     "default": "adsense#savedReports"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through saved reports. To retrieve the next page of results, set the next request's \"pageToken\" value to this."
+    }
+   }
+  },
+  "UrlChannel": {
+   "id": "UrlChannel",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier of this URL channel. This should be considered an opaque identifier; it is not safe to rely on it being in any particular format."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of resource this is, in this case adsense#urlChannel.",
+     "default": "adsense#urlChannel"
+    },
+    "urlPattern": {
+     "type": "string",
+     "description": "URL Pattern of this URL channel. Does not include \"http://\" or \"https://\". Example: www.example.com/home"
+    }
+   }
+  },
+  "UrlChannels": {
+   "id": "UrlChannels",
+   "type": "object",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "ETag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The URL channels returned in this list response.",
+     "items": {
+      "$ref": "UrlChannel"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Kind of list this is, in this case adsense#urlChannels.",
+     "default": "adsense#urlChannels"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through URL channels. To retrieve the next page of results, set the next request's \"pageToken\" value to this."
+    }
+   }
+  }
+ },
+ "resources": {
+  "accounts": {
+   "methods": {
+    "get": {
+     "id": "adsense.accounts.get",
+     "path": "accounts/{accountId}",
+     "httpMethod": "GET",
+     "description": "Get information about the selected AdSense account.",
+     "parameters": {
+      "accountId": {
+       "type": "string",
+       "description": "Account to get information about.",
+       "required": true,
+       "location": "path"
+      },
+      "tree": {
+       "type": "boolean",
+       "description": "Whether the tree of sub accounts should be returned.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "accountId"
+     ],
+     "response": {
+      "$ref": "Account"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    },
+    "list": {
+     "id": "adsense.accounts.list",
+     "path": "accounts",
+     "httpMethod": "GET",
+     "description": "List all accounts available to this AdSense account.",
+     "parameters": {
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of accounts to include in the response, used for paging.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A continuation token, used to page through accounts. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+       "location": "query"
+      }
+     },
+     "response": {
+      "$ref": "Accounts"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    }
+   },
+   "resources": {
+    "adclients": {
+     "methods": {
+      "list": {
+       "id": "adsense.accounts.adclients.list",
+       "path": "accounts/{accountId}/adclients",
+       "httpMethod": "GET",
+       "description": "List all ad clients in the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account for which to list ad clients.",
+         "required": true,
+         "location": "path"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of ad clients to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10000",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through ad clients. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "accountId"
+       ],
+       "response": {
+        "$ref": "AdClients"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    },
+    "adunits": {
+     "methods": {
+      "get": {
+       "id": "adsense.accounts.adunits.get",
+       "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}",
+       "httpMethod": "GET",
+       "description": "Gets the specified ad unit in the specified ad client for the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account to which the ad client belongs.",
+         "required": true,
+         "location": "path"
+        },
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client for which to get the ad unit.",
+         "required": true,
+         "location": "path"
+        },
+        "adUnitId": {
+         "type": "string",
+         "description": "Ad unit to retrieve.",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "adClientId",
+        "adUnitId"
+       ],
+       "response": {
+        "$ref": "AdUnit"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      },
+      "getAdCode": {
+       "id": "adsense.accounts.adunits.getAdCode",
+       "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode",
+       "httpMethod": "GET",
+       "description": "Get ad code for the specified ad unit.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account which contains the ad client.",
+         "required": true,
+         "location": "path"
+        },
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client with contains the ad unit.",
+         "required": true,
+         "location": "path"
+        },
+        "adUnitId": {
+         "type": "string",
+         "description": "Ad unit to get the code for.",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "adClientId",
+        "adUnitId"
+       ],
+       "response": {
+        "$ref": "AdCode"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      },
+      "list": {
+       "id": "adsense.accounts.adunits.list",
+       "path": "accounts/{accountId}/adclients/{adClientId}/adunits",
+       "httpMethod": "GET",
+       "description": "List all ad units in the specified ad client for the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account to which the ad client belongs.",
+         "required": true,
+         "location": "path"
+        },
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client for which to list ad units.",
+         "required": true,
+         "location": "path"
+        },
+        "includeInactive": {
+         "type": "boolean",
+         "description": "Whether to include inactive ad units. Default: true.",
+         "location": "query"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of ad units to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10000",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "adClientId"
+       ],
+       "response": {
+        "$ref": "AdUnits"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     },
+     "resources": {
+      "customchannels": {
+       "methods": {
+        "list": {
+         "id": "adsense.accounts.adunits.customchannels.list",
+         "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels",
+         "httpMethod": "GET",
+         "description": "List all custom channels which the specified ad unit belongs to.",
+         "parameters": {
+          "accountId": {
+           "type": "string",
+           "description": "Account to which the ad client belongs.",
+           "required": true,
+           "location": "path"
+          },
+          "adClientId": {
+           "type": "string",
+           "description": "Ad client which contains the ad unit.",
+           "required": true,
+           "location": "path"
+          },
+          "adUnitId": {
+           "type": "string",
+           "description": "Ad unit for which to list custom channels.",
+           "required": true,
+           "location": "path"
+          },
+          "maxResults": {
+           "type": "integer",
+           "description": "The maximum number of custom channels to include in the response, used for paging.",
+           "format": "int32",
+           "minimum": "0",
+           "maximum": "10000",
+           "location": "query"
+          },
+          "pageToken": {
+           "type": "string",
+           "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+           "location": "query"
+          }
+         },
+         "parameterOrder": [
+          "accountId",
+          "adClientId",
+          "adUnitId"
+         ],
+         "response": {
+          "$ref": "CustomChannels"
+         },
+         "scopes": [
+          "https://www.googleapis.com/auth/adsense",
+          "https://www.googleapis.com/auth/adsense.readonly"
+         ]
+        }
+       }
+      }
+     }
+    },
+    "alerts": {
+     "methods": {
+      "list": {
+       "id": "adsense.accounts.alerts.list",
+       "path": "accounts/{accountId}/alerts",
+       "httpMethod": "GET",
+       "description": "List the alerts for the specified AdSense account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account for which to retrieve the alerts.",
+         "required": true,
+         "location": "path"
+        },
+        "locale": {
+         "type": "string",
+         "description": "The locale to use for translating alert messages. The account locale will be used if this is not supplied. The AdSense default (English) will be used if the supplied locale is invalid or unsupported.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "accountId"
+       ],
+       "response": {
+        "$ref": "Alerts"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    },
+    "customchannels": {
+     "methods": {
+      "get": {
+       "id": "adsense.accounts.customchannels.get",
+       "path": "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}",
+       "httpMethod": "GET",
+       "description": "Get the specified custom channel from the specified ad client for the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account to which the ad client belongs.",
+         "required": true,
+         "location": "path"
+        },
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client which contains the custom channel.",
+         "required": true,
+         "location": "path"
+        },
+        "customChannelId": {
+         "type": "string",
+         "description": "Custom channel to retrieve.",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "adClientId",
+        "customChannelId"
+       ],
+       "response": {
+        "$ref": "CustomChannel"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      },
+      "list": {
+       "id": "adsense.accounts.customchannels.list",
+       "path": "accounts/{accountId}/adclients/{adClientId}/customchannels",
+       "httpMethod": "GET",
+       "description": "List all custom channels in the specified ad client for the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account to which the ad client belongs.",
+         "required": true,
+         "location": "path"
+        },
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client for which to list custom channels.",
+         "required": true,
+         "location": "path"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of custom channels to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10000",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "adClientId"
+       ],
+       "response": {
+        "$ref": "CustomChannels"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     },
+     "resources": {
+      "adunits": {
+       "methods": {
+        "list": {
+         "id": "adsense.accounts.customchannels.adunits.list",
+         "path": "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits",
+         "httpMethod": "GET",
+         "description": "List all ad units in the specified custom channel.",
+         "parameters": {
+          "accountId": {
+           "type": "string",
+           "description": "Account to which the ad client belongs.",
+           "required": true,
+           "location": "path"
+          },
+          "adClientId": {
+           "type": "string",
+           "description": "Ad client which contains the custom channel.",
+           "required": true,
+           "location": "path"
+          },
+          "customChannelId": {
+           "type": "string",
+           "description": "Custom channel for which to list ad units.",
+           "required": true,
+           "location": "path"
+          },
+          "includeInactive": {
+           "type": "boolean",
+           "description": "Whether to include inactive ad units. Default: true.",
+           "location": "query"
+          },
+          "maxResults": {
+           "type": "integer",
+           "description": "The maximum number of ad units to include in the response, used for paging.",
+           "format": "int32",
+           "minimum": "0",
+           "maximum": "10000",
+           "location": "query"
+          },
+          "pageToken": {
+           "type": "string",
+           "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+           "location": "query"
+          }
+         },
+         "parameterOrder": [
+          "accountId",
+          "adClientId",
+          "customChannelId"
+         ],
+         "response": {
+          "$ref": "AdUnits"
+         },
+         "scopes": [
+          "https://www.googleapis.com/auth/adsense",
+          "https://www.googleapis.com/auth/adsense.readonly"
+         ]
+        }
+       }
+      }
+     }
+    },
+    "reports": {
+     "methods": {
+      "generate": {
+       "id": "adsense.accounts.reports.generate",
+       "path": "accounts/{accountId}/reports",
+       "httpMethod": "GET",
+       "description": "Generate an AdSense report based on the report request sent in the query parameters. Returns the result as JSON; to retrieve output in CSV format specify \"alt=csv\" as a query parameter.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account upon which to report.",
+         "required": true,
+         "location": "path"
+        },
+        "currency": {
+         "type": "string",
+         "description": "Optional currency to use when reporting on monetary metrics. Defaults to the account's currency if not set.",
+         "pattern": "[a-zA-Z]+",
+         "location": "query"
+        },
+        "dimension": {
+         "type": "string",
+         "description": "Dimensions to base the report on.",
+         "pattern": "[a-zA-Z_]+",
+         "repeated": true,
+         "location": "query"
+        },
+        "endDate": {
+         "type": "string",
+         "description": "End of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+         "required": true,
+         "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+         "location": "query"
+        },
+        "filter": {
+         "type": "string",
+         "description": "Filters to be run on the report.",
+         "pattern": "[a-zA-Z_]+(==|=@).+",
+         "repeated": true,
+         "location": "query"
+        },
+        "locale": {
+         "type": "string",
+         "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+         "pattern": "[a-zA-Z_]+",
+         "location": "query"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of rows of report data to return.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "50000",
+         "location": "query"
+        },
+        "metric": {
+         "type": "string",
+         "description": "Numeric columns to include in the report.",
+         "pattern": "[a-zA-Z_]+",
+         "repeated": true,
+         "location": "query"
+        },
+        "sort": {
+         "type": "string",
+         "description": "The name of a dimension or metric to sort the resulting report on, optionally prefixed with \"+\" to sort ascending or \"-\" to sort descending. If no prefix is specified, the column is sorted ascending.",
+         "pattern": "(\\+|-)?[a-zA-Z_]+",
+         "repeated": true,
+         "location": "query"
+        },
+        "startDate": {
+         "type": "string",
+         "description": "Start of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+         "required": true,
+         "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+         "location": "query"
+        },
+        "startIndex": {
+         "type": "integer",
+         "description": "Index of the first row of report data to return.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "5000",
+         "location": "query"
+        },
+        "useTimezoneReporting": {
+         "type": "boolean",
+         "description": "Whether the report should be generated in the AdSense account's local timezone. If false default PST/PDT timezone will be used.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "startDate",
+        "endDate"
+       ],
+       "response": {
+        "$ref": "AdsenseReportsGenerateResponse"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ],
+       "supportsMediaDownload": true
+      }
+     },
+     "resources": {
+      "saved": {
+       "methods": {
+        "generate": {
+         "id": "adsense.accounts.reports.saved.generate",
+         "path": "accounts/{accountId}/reports/{savedReportId}",
+         "httpMethod": "GET",
+         "description": "Generate an AdSense report based on the saved report ID sent in the query parameters.",
+         "parameters": {
+          "accountId": {
+           "type": "string",
+           "description": "Account to which the saved reports belong.",
+           "required": true,
+           "location": "path"
+          },
+          "locale": {
+           "type": "string",
+           "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+           "pattern": "[a-zA-Z_]+",
+           "location": "query"
+          },
+          "maxResults": {
+           "type": "integer",
+           "description": "The maximum number of rows of report data to return.",
+           "format": "int32",
+           "minimum": "0",
+           "maximum": "50000",
+           "location": "query"
+          },
+          "savedReportId": {
+           "type": "string",
+           "description": "The saved report to retrieve.",
+           "required": true,
+           "location": "path"
+          },
+          "startIndex": {
+           "type": "integer",
+           "description": "Index of the first row of report data to return.",
+           "format": "int32",
+           "minimum": "0",
+           "maximum": "5000",
+           "location": "query"
+          }
+         },
+         "parameterOrder": [
+          "accountId",
+          "savedReportId"
+         ],
+         "response": {
+          "$ref": "AdsenseReportsGenerateResponse"
+         },
+         "scopes": [
+          "https://www.googleapis.com/auth/adsense",
+          "https://www.googleapis.com/auth/adsense.readonly"
+         ]
+        },
+        "list": {
+         "id": "adsense.accounts.reports.saved.list",
+         "path": "accounts/{accountId}/reports/saved",
+         "httpMethod": "GET",
+         "description": "List all saved reports in the specified AdSense account.",
+         "parameters": {
+          "accountId": {
+           "type": "string",
+           "description": "Account to which the saved reports belong.",
+           "required": true,
+           "location": "path"
+          },
+          "maxResults": {
+           "type": "integer",
+           "description": "The maximum number of saved reports to include in the response, used for paging.",
+           "format": "int32",
+           "minimum": "0",
+           "maximum": "100",
+           "location": "query"
+          },
+          "pageToken": {
+           "type": "string",
+           "description": "A continuation token, used to page through saved reports. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+           "location": "query"
+          }
+         },
+         "parameterOrder": [
+          "accountId"
+         ],
+         "response": {
+          "$ref": "SavedReports"
+         },
+         "scopes": [
+          "https://www.googleapis.com/auth/adsense",
+          "https://www.googleapis.com/auth/adsense.readonly"
+         ]
+        }
+       }
+      }
+     }
+    },
+    "savedadstyles": {
+     "methods": {
+      "get": {
+       "id": "adsense.accounts.savedadstyles.get",
+       "path": "accounts/{accountId}/savedadstyles/{savedAdStyleId}",
+       "httpMethod": "GET",
+       "description": "List a specific saved ad style for the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account for which to get the saved ad style.",
+         "required": true,
+         "location": "path"
+        },
+        "savedAdStyleId": {
+         "type": "string",
+         "description": "Saved ad style to retrieve.",
+         "required": true,
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "savedAdStyleId"
+       ],
+       "response": {
+        "$ref": "SavedAdStyle"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      },
+      "list": {
+       "id": "adsense.accounts.savedadstyles.list",
+       "path": "accounts/{accountId}/savedadstyles",
+       "httpMethod": "GET",
+       "description": "List all saved ad styles in the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account for which to list saved ad styles.",
+         "required": true,
+         "location": "path"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of saved ad styles to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10000",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through saved ad styles. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "accountId"
+       ],
+       "response": {
+        "$ref": "SavedAdStyles"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    },
+    "urlchannels": {
+     "methods": {
+      "list": {
+       "id": "adsense.accounts.urlchannels.list",
+       "path": "accounts/{accountId}/adclients/{adClientId}/urlchannels",
+       "httpMethod": "GET",
+       "description": "List all URL channels in the specified ad client for the specified account.",
+       "parameters": {
+        "accountId": {
+         "type": "string",
+         "description": "Account to which the ad client belongs.",
+         "required": true,
+         "location": "path"
+        },
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client for which to list URL channels.",
+         "required": true,
+         "location": "path"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of URL channels to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10000",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through URL channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "accountId",
+        "adClientId"
+       ],
+       "response": {
+        "$ref": "UrlChannels"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    }
+   }
+  },
+  "adclients": {
+   "methods": {
+    "list": {
+     "id": "adsense.adclients.list",
+     "path": "adclients",
+     "httpMethod": "GET",
+     "description": "List all ad clients in this AdSense account.",
+     "parameters": {
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of ad clients to include in the response, used for paging.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A continuation token, used to page through ad clients. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+       "location": "query"
+      }
+     },
+     "response": {
+      "$ref": "AdClients"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    }
+   }
+  },
+  "adunits": {
+   "methods": {
+    "get": {
+     "id": "adsense.adunits.get",
+     "path": "adclients/{adClientId}/adunits/{adUnitId}",
+     "httpMethod": "GET",
+     "description": "Gets the specified ad unit in the specified ad client.",
+     "parameters": {
+      "adClientId": {
+       "type": "string",
+       "description": "Ad client for which to get the ad unit.",
+       "required": true,
+       "location": "path"
+      },
+      "adUnitId": {
+       "type": "string",
+       "description": "Ad unit to retrieve.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "adClientId",
+      "adUnitId"
+     ],
+     "response": {
+      "$ref": "AdUnit"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    },
+    "getAdCode": {
+     "id": "adsense.adunits.getAdCode",
+     "path": "adclients/{adClientId}/adunits/{adUnitId}/adcode",
+     "httpMethod": "GET",
+     "description": "Get ad code for the specified ad unit.",
+     "parameters": {
+      "adClientId": {
+       "type": "string",
+       "description": "Ad client with contains the ad unit.",
+       "required": true,
+       "location": "path"
+      },
+      "adUnitId": {
+       "type": "string",
+       "description": "Ad unit to get the code for.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "adClientId",
+      "adUnitId"
+     ],
+     "response": {
+      "$ref": "AdCode"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    },
+    "list": {
+     "id": "adsense.adunits.list",
+     "path": "adclients/{adClientId}/adunits",
+     "httpMethod": "GET",
+     "description": "List all ad units in the specified ad client for this AdSense account.",
+     "parameters": {
+      "adClientId": {
+       "type": "string",
+       "description": "Ad client for which to list ad units.",
+       "required": true,
+       "location": "path"
+      },
+      "includeInactive": {
+       "type": "boolean",
+       "description": "Whether to include inactive ad units. Default: true.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of ad units to include in the response, used for paging.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "adClientId"
+     ],
+     "response": {
+      "$ref": "AdUnits"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    }
+   },
+   "resources": {
+    "customchannels": {
+     "methods": {
+      "list": {
+       "id": "adsense.adunits.customchannels.list",
+       "path": "adclients/{adClientId}/adunits/{adUnitId}/customchannels",
+       "httpMethod": "GET",
+       "description": "List all custom channels which the specified ad unit belongs to.",
+       "parameters": {
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client which contains the ad unit.",
+         "required": true,
+         "location": "path"
+        },
+        "adUnitId": {
+         "type": "string",
+         "description": "Ad unit for which to list custom channels.",
+         "required": true,
+         "location": "path"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of custom channels to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10000",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "adClientId",
+        "adUnitId"
+       ],
+       "response": {
+        "$ref": "CustomChannels"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    }
+   }
+  },
+  "alerts": {
+   "methods": {
+    "list": {
+     "id": "adsense.alerts.list",
+     "path": "alerts",
+     "httpMethod": "GET",
+     "description": "List the alerts for this AdSense account.",
+     "parameters": {
+      "locale": {
+       "type": "string",
+       "description": "The locale to use for translating alert messages. The account locale will be used if this is not supplied. The AdSense default (English) will be used if the supplied locale is invalid or unsupported.",
+       "location": "query"
+      }
+     },
+     "response": {
+      "$ref": "Alerts"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    }
+   }
+  },
+  "customchannels": {
+   "methods": {
+    "get": {
+     "id": "adsense.customchannels.get",
+     "path": "adclients/{adClientId}/customchannels/{customChannelId}",
+     "httpMethod": "GET",
+     "description": "Get the specified custom channel from the specified ad client.",
+     "parameters": {
+      "adClientId": {
+       "type": "string",
+       "description": "Ad client which contains the custom channel.",
+       "required": true,
+       "location": "path"
+      },
+      "customChannelId": {
+       "type": "string",
+       "description": "Custom channel to retrieve.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "adClientId",
+      "customChannelId"
+     ],
+     "response": {
+      "$ref": "CustomChannel"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    },
+    "list": {
+     "id": "adsense.customchannels.list",
+     "path": "adclients/{adClientId}/customchannels",
+     "httpMethod": "GET",
+     "description": "List all custom channels in the specified ad client for this AdSense account.",
+     "parameters": {
+      "adClientId": {
+       "type": "string",
+       "description": "Ad client for which to list custom channels.",
+       "required": true,
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of custom channels to include in the response, used for paging.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "adClientId"
+     ],
+     "response": {
+      "$ref": "CustomChannels"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    }
+   },
+   "resources": {
+    "adunits": {
+     "methods": {
+      "list": {
+       "id": "adsense.customchannels.adunits.list",
+       "path": "adclients/{adClientId}/customchannels/{customChannelId}/adunits",
+       "httpMethod": "GET",
+       "description": "List all ad units in the specified custom channel.",
+       "parameters": {
+        "adClientId": {
+         "type": "string",
+         "description": "Ad client which contains the custom channel.",
+         "required": true,
+         "location": "path"
+        },
+        "customChannelId": {
+         "type": "string",
+         "description": "Custom channel for which to list ad units.",
+         "required": true,
+         "location": "path"
+        },
+        "includeInactive": {
+         "type": "boolean",
+         "description": "Whether to include inactive ad units. Default: true.",
+         "location": "query"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of ad units to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10000",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "adClientId",
+        "customChannelId"
+       ],
+       "response": {
+        "$ref": "AdUnits"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    }
+   }
+  },
+  "metadata": {
+   "resources": {
+    "dimensions": {
+     "methods": {
+      "list": {
+       "id": "adsense.metadata.dimensions.list",
+       "path": "metadata/dimensions",
+       "httpMethod": "GET",
+       "description": "List the metadata for the dimensions available to this AdSense account.",
+       "response": {
+        "$ref": "Metadata"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    },
+    "metrics": {
+     "methods": {
+      "list": {
+       "id": "adsense.metadata.metrics.list",
+       "path": "metadata/metrics",
+       "httpMethod": "GET",
+       "description": "List the metadata for the metrics available to this AdSense account.",
+       "response": {
+        "$ref": "Metadata"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    }
+   }
+  },
+  "reports": {
+   "methods": {
+    "generate": {
+     "id": "adsense.reports.generate",
+     "path": "reports",
+     "httpMethod": "GET",
+     "description": "Generate an AdSense report based on the report request sent in the query parameters. Returns the result as JSON; to retrieve output in CSV format specify \"alt=csv\" as a query parameter.",
+     "parameters": {
+      "accountId": {
+       "type": "string",
+       "description": "Accounts upon which to report.",
+       "repeated": true,
+       "location": "query"
+      },
+      "currency": {
+       "type": "string",
+       "description": "Optional currency to use when reporting on monetary metrics. Defaults to the account's currency if not set.",
+       "pattern": "[a-zA-Z]+",
+       "location": "query"
+      },
+      "dimension": {
+       "type": "string",
+       "description": "Dimensions to base the report on.",
+       "pattern": "[a-zA-Z_]+",
+       "repeated": true,
+       "location": "query"
+      },
+      "endDate": {
+       "type": "string",
+       "description": "End of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+       "required": true,
+       "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+       "location": "query"
+      },
+      "filter": {
+       "type": "string",
+       "description": "Filters to be run on the report.",
+       "pattern": "[a-zA-Z_]+(==|=@).+",
+       "repeated": true,
+       "location": "query"
+      },
+      "locale": {
+       "type": "string",
+       "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+       "pattern": "[a-zA-Z_]+",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of rows of report data to return.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "50000",
+       "location": "query"
+      },
+      "metric": {
+       "type": "string",
+       "description": "Numeric columns to include in the report.",
+       "pattern": "[a-zA-Z_]+",
+       "repeated": true,
+       "location": "query"
+      },
+      "sort": {
+       "type": "string",
+       "description": "The name of a dimension or metric to sort the resulting report on, optionally prefixed with \"+\" to sort ascending or \"-\" to sort descending. If no prefix is specified, the column is sorted ascending.",
+       "pattern": "(\\+|-)?[a-zA-Z_]+",
+       "repeated": true,
+       "location": "query"
+      },
+      "startDate": {
+       "type": "string",
+       "description": "Start of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+       "required": true,
+       "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+       "location": "query"
+      },
+      "startIndex": {
+       "type": "integer",
+       "description": "Index of the first row of report data to return.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "5000",
+       "location": "query"
+      },
+      "useTimezoneReporting": {
+       "type": "boolean",
+       "description": "Whether the report should be generated in the AdSense account's local timezone. If false default PST/PDT timezone will be used.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "startDate",
+      "endDate"
+     ],
+     "response": {
+      "$ref": "AdsenseReportsGenerateResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ],
+     "supportsMediaDownload": true
+    }
+   },
+   "resources": {
+    "saved": {
+     "methods": {
+      "generate": {
+       "id": "adsense.reports.saved.generate",
+       "path": "reports/{savedReportId}",
+       "httpMethod": "GET",
+       "description": "Generate an AdSense report based on the saved report ID sent in the query parameters.",
+       "parameters": {
+        "locale": {
+         "type": "string",
+         "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+         "pattern": "[a-zA-Z_]+",
+         "location": "query"
+        },
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of rows of report data to return.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "50000",
+         "location": "query"
+        },
+        "savedReportId": {
+         "type": "string",
+         "description": "The saved report to retrieve.",
+         "required": true,
+         "location": "path"
+        },
+        "startIndex": {
+         "type": "integer",
+         "description": "Index of the first row of report data to return.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "5000",
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "savedReportId"
+       ],
+       "response": {
+        "$ref": "AdsenseReportsGenerateResponse"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      },
+      "list": {
+       "id": "adsense.reports.saved.list",
+       "path": "reports/saved",
+       "httpMethod": "GET",
+       "description": "List all saved reports in this AdSense account.",
+       "parameters": {
+        "maxResults": {
+         "type": "integer",
+         "description": "The maximum number of saved reports to include in the response, used for paging.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "100",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "A continuation token, used to page through saved reports. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+         "location": "query"
+        }
+       },
+       "response": {
+        "$ref": "SavedReports"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/adsense",
+        "https://www.googleapis.com/auth/adsense.readonly"
+       ]
+      }
+     }
+    }
+   }
+  },
+  "savedadstyles": {
+   "methods": {
+    "get": {
+     "id": "adsense.savedadstyles.get",
+     "path": "savedadstyles/{savedAdStyleId}",
+     "httpMethod": "GET",
+     "description": "Get a specific saved ad style from the user's account.",
+     "parameters": {
+      "savedAdStyleId": {
+       "type": "string",
+       "description": "Saved ad style to retrieve.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "savedAdStyleId"
+     ],
+     "response": {
+      "$ref": "SavedAdStyle"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    },
+    "list": {
+     "id": "adsense.savedadstyles.list",
+     "path": "savedadstyles",
+     "httpMethod": "GET",
+     "description": "List all saved ad styles in the user's account.",
+     "parameters": {
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of saved ad styles to include in the response, used for paging.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A continuation token, used to page through saved ad styles. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+       "location": "query"
+      }
+     },
+     "response": {
+      "$ref": "SavedAdStyles"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    }
+   }
+  },
+  "urlchannels": {
+   "methods": {
+    "list": {
+     "id": "adsense.urlchannels.list",
+     "path": "adclients/{adClientId}/urlchannels",
+     "httpMethod": "GET",
+     "description": "List all URL channels in the specified ad client for this AdSense account.",
+     "parameters": {
+      "adClientId": {
+       "type": "string",
+       "description": "Ad client for which to list URL channels.",
+       "required": true,
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of URL channels to include in the response, used for paging.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10000",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A continuation token, used to page through URL channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "adClientId"
+     ],
+     "response": {
+      "$ref": "UrlChannels"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/adsense",
+      "https://www.googleapis.com/auth/adsense.readonly"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/adsense/v1.3/adsense-gen.go b/adsense/v1.3/adsense-gen.go
new file mode 100644
index 0000000..161e331
--- /dev/null
+++ b/adsense/v1.3/adsense-gen.go
@@ -0,0 +1,4372 @@
+// Package adsense provides access to the AdSense Management API.
+//
+// See https://developers.google.com/adsense/management/
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/adsense/v1.3"
+//   ...
+//   adsenseService, err := adsense.New(oauthHttpClient)
+package adsense
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "adsense:v1.3"
+const apiName = "adsense"
+const apiVersion = "v1.3"
+const basePath = "https://www.googleapis.com/adsense/v1.3/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View and manage your AdSense data
+	AdsenseScope = "https://www.googleapis.com/auth/adsense"
+
+	// View your AdSense data
+	AdsenseReadonlyScope = "https://www.googleapis.com/auth/adsense.readonly"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.Accounts = NewAccountsService(s)
+	s.Adclients = NewAdclientsService(s)
+	s.Adunits = NewAdunitsService(s)
+	s.Alerts = NewAlertsService(s)
+	s.Customchannels = NewCustomchannelsService(s)
+	s.Metadata = NewMetadataService(s)
+	s.Reports = NewReportsService(s)
+	s.Savedadstyles = NewSavedadstylesService(s)
+	s.Urlchannels = NewUrlchannelsService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	Accounts *AccountsService
+
+	Adclients *AdclientsService
+
+	Adunits *AdunitsService
+
+	Alerts *AlertsService
+
+	Customchannels *CustomchannelsService
+
+	Metadata *MetadataService
+
+	Reports *ReportsService
+
+	Savedadstyles *SavedadstylesService
+
+	Urlchannels *UrlchannelsService
+}
+
+func NewAccountsService(s *Service) *AccountsService {
+	rs := &AccountsService{s: s}
+	rs.Adclients = NewAccountsAdclientsService(s)
+	rs.Adunits = NewAccountsAdunitsService(s)
+	rs.Alerts = NewAccountsAlertsService(s)
+	rs.Customchannels = NewAccountsCustomchannelsService(s)
+	rs.Reports = NewAccountsReportsService(s)
+	rs.Savedadstyles = NewAccountsSavedadstylesService(s)
+	rs.Urlchannels = NewAccountsUrlchannelsService(s)
+	return rs
+}
+
+type AccountsService struct {
+	s *Service
+
+	Adclients *AccountsAdclientsService
+
+	Adunits *AccountsAdunitsService
+
+	Alerts *AccountsAlertsService
+
+	Customchannels *AccountsCustomchannelsService
+
+	Reports *AccountsReportsService
+
+	Savedadstyles *AccountsSavedadstylesService
+
+	Urlchannels *AccountsUrlchannelsService
+}
+
+func NewAccountsAdclientsService(s *Service) *AccountsAdclientsService {
+	rs := &AccountsAdclientsService{s: s}
+	return rs
+}
+
+type AccountsAdclientsService struct {
+	s *Service
+}
+
+func NewAccountsAdunitsService(s *Service) *AccountsAdunitsService {
+	rs := &AccountsAdunitsService{s: s}
+	rs.Customchannels = NewAccountsAdunitsCustomchannelsService(s)
+	return rs
+}
+
+type AccountsAdunitsService struct {
+	s *Service
+
+	Customchannels *AccountsAdunitsCustomchannelsService
+}
+
+func NewAccountsAdunitsCustomchannelsService(s *Service) *AccountsAdunitsCustomchannelsService {
+	rs := &AccountsAdunitsCustomchannelsService{s: s}
+	return rs
+}
+
+type AccountsAdunitsCustomchannelsService struct {
+	s *Service
+}
+
+func NewAccountsAlertsService(s *Service) *AccountsAlertsService {
+	rs := &AccountsAlertsService{s: s}
+	return rs
+}
+
+type AccountsAlertsService struct {
+	s *Service
+}
+
+func NewAccountsCustomchannelsService(s *Service) *AccountsCustomchannelsService {
+	rs := &AccountsCustomchannelsService{s: s}
+	rs.Adunits = NewAccountsCustomchannelsAdunitsService(s)
+	return rs
+}
+
+type AccountsCustomchannelsService struct {
+	s *Service
+
+	Adunits *AccountsCustomchannelsAdunitsService
+}
+
+func NewAccountsCustomchannelsAdunitsService(s *Service) *AccountsCustomchannelsAdunitsService {
+	rs := &AccountsCustomchannelsAdunitsService{s: s}
+	return rs
+}
+
+type AccountsCustomchannelsAdunitsService struct {
+	s *Service
+}
+
+func NewAccountsReportsService(s *Service) *AccountsReportsService {
+	rs := &AccountsReportsService{s: s}
+	rs.Saved = NewAccountsReportsSavedService(s)
+	return rs
+}
+
+type AccountsReportsService struct {
+	s *Service
+
+	Saved *AccountsReportsSavedService
+}
+
+func NewAccountsReportsSavedService(s *Service) *AccountsReportsSavedService {
+	rs := &AccountsReportsSavedService{s: s}
+	return rs
+}
+
+type AccountsReportsSavedService struct {
+	s *Service
+}
+
+func NewAccountsSavedadstylesService(s *Service) *AccountsSavedadstylesService {
+	rs := &AccountsSavedadstylesService{s: s}
+	return rs
+}
+
+type AccountsSavedadstylesService struct {
+	s *Service
+}
+
+func NewAccountsUrlchannelsService(s *Service) *AccountsUrlchannelsService {
+	rs := &AccountsUrlchannelsService{s: s}
+	return rs
+}
+
+type AccountsUrlchannelsService struct {
+	s *Service
+}
+
+func NewAdclientsService(s *Service) *AdclientsService {
+	rs := &AdclientsService{s: s}
+	return rs
+}
+
+type AdclientsService struct {
+	s *Service
+}
+
+func NewAdunitsService(s *Service) *AdunitsService {
+	rs := &AdunitsService{s: s}
+	rs.Customchannels = NewAdunitsCustomchannelsService(s)
+	return rs
+}
+
+type AdunitsService struct {
+	s *Service
+
+	Customchannels *AdunitsCustomchannelsService
+}
+
+func NewAdunitsCustomchannelsService(s *Service) *AdunitsCustomchannelsService {
+	rs := &AdunitsCustomchannelsService{s: s}
+	return rs
+}
+
+type AdunitsCustomchannelsService struct {
+	s *Service
+}
+
+func NewAlertsService(s *Service) *AlertsService {
+	rs := &AlertsService{s: s}
+	return rs
+}
+
+type AlertsService struct {
+	s *Service
+}
+
+func NewCustomchannelsService(s *Service) *CustomchannelsService {
+	rs := &CustomchannelsService{s: s}
+	rs.Adunits = NewCustomchannelsAdunitsService(s)
+	return rs
+}
+
+type CustomchannelsService struct {
+	s *Service
+
+	Adunits *CustomchannelsAdunitsService
+}
+
+func NewCustomchannelsAdunitsService(s *Service) *CustomchannelsAdunitsService {
+	rs := &CustomchannelsAdunitsService{s: s}
+	return rs
+}
+
+type CustomchannelsAdunitsService struct {
+	s *Service
+}
+
+func NewMetadataService(s *Service) *MetadataService {
+	rs := &MetadataService{s: s}
+	rs.Dimensions = NewMetadataDimensionsService(s)
+	rs.Metrics = NewMetadataMetricsService(s)
+	return rs
+}
+
+type MetadataService struct {
+	s *Service
+
+	Dimensions *MetadataDimensionsService
+
+	Metrics *MetadataMetricsService
+}
+
+func NewMetadataDimensionsService(s *Service) *MetadataDimensionsService {
+	rs := &MetadataDimensionsService{s: s}
+	return rs
+}
+
+type MetadataDimensionsService struct {
+	s *Service
+}
+
+func NewMetadataMetricsService(s *Service) *MetadataMetricsService {
+	rs := &MetadataMetricsService{s: s}
+	return rs
+}
+
+type MetadataMetricsService struct {
+	s *Service
+}
+
+func NewReportsService(s *Service) *ReportsService {
+	rs := &ReportsService{s: s}
+	rs.Saved = NewReportsSavedService(s)
+	return rs
+}
+
+type ReportsService struct {
+	s *Service
+
+	Saved *ReportsSavedService
+}
+
+func NewReportsSavedService(s *Service) *ReportsSavedService {
+	rs := &ReportsSavedService{s: s}
+	return rs
+}
+
+type ReportsSavedService struct {
+	s *Service
+}
+
+func NewSavedadstylesService(s *Service) *SavedadstylesService {
+	rs := &SavedadstylesService{s: s}
+	return rs
+}
+
+type SavedadstylesService struct {
+	s *Service
+}
+
+func NewUrlchannelsService(s *Service) *UrlchannelsService {
+	rs := &UrlchannelsService{s: s}
+	return rs
+}
+
+type UrlchannelsService struct {
+	s *Service
+}
+
+type Account struct {
+	// Id: Unique identifier of this account.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#account.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of this account.
+	Name string `json:"name,omitempty"`
+
+	// Premium: Whether this account is premium.
+	Premium bool `json:"premium,omitempty"`
+
+	// SubAccounts: Sub accounts of the this account.
+	SubAccounts []*Account `json:"subAccounts,omitempty"`
+}
+
+type Accounts struct {
+	// Etag: ETag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The accounts returned in this list response.
+	Items []*Account `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#accounts.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through accounts. To
+	// retrieve the next page of results, set the next request's "pageToken"
+	// value to this.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type AdClient struct {
+	// ArcOptIn: Whether this ad client is opted in to ARC.
+	ArcOptIn bool `json:"arcOptIn,omitempty"`
+
+	// Id: Unique identifier of this ad client.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#adClient.
+	Kind string `json:"kind,omitempty"`
+
+	// ProductCode: This ad client's product code, which corresponds to the
+	// PRODUCT_CODE report dimension.
+	ProductCode string `json:"productCode,omitempty"`
+
+	// SupportsReporting: Whether this ad client supports being reported on.
+	SupportsReporting bool `json:"supportsReporting,omitempty"`
+}
+
+type AdClients struct {
+	// Etag: ETag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The ad clients returned in this list response.
+	Items []*AdClient `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#adClients.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through ad clients. To
+	// retrieve the next page of results, set the next request's "pageToken"
+	// value to this.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type AdCode struct {
+	// AdCode: The ad code snippet.
+	AdCode string `json:"adCode,omitempty"`
+
+	// Kind: Kind this is, in this case adsense#adCode.
+	Kind string `json:"kind,omitempty"`
+}
+
+type AdStyle struct {
+	// Colors: The colors which are included in the style. These are
+	// represented as six hexadecimal characters, similar to HTML color
+	// codes, but without the leading hash.
+	Colors *AdStyleColors `json:"colors,omitempty"`
+
+	// Corners: The style of the corners in the ad.
+	Corners string `json:"corners,omitempty"`
+
+	// Font: The font which is included in the style.
+	Font *AdStyleFont `json:"font,omitempty"`
+
+	// Kind: Kind this is, in this case adsense#adStyle.
+	Kind string `json:"kind,omitempty"`
+}
+
+type AdStyleColors struct {
+	// Background: The color of the ad background.
+	Background string `json:"background,omitempty"`
+
+	// Border: The color of the ad border.
+	Border string `json:"border,omitempty"`
+
+	// Text: The color of the ad text.
+	Text string `json:"text,omitempty"`
+
+	// Title: The color of the ad title.
+	Title string `json:"title,omitempty"`
+
+	// Url: The color of the ad url.
+	Url string `json:"url,omitempty"`
+}
+
+type AdStyleFont struct {
+	// Family: The family of the font.
+	Family string `json:"family,omitempty"`
+
+	// Size: The size of the font.
+	Size string `json:"size,omitempty"`
+}
+
+type AdUnit struct {
+	// Code: Identity code of this ad unit, not necessarily unique across ad
+	// clients.
+	Code string `json:"code,omitempty"`
+
+	// ContentAdsSettings: Settings specific to content ads (AFC) and
+	// highend mobile content ads (AFMC).
+	ContentAdsSettings *AdUnitContentAdsSettings `json:"contentAdsSettings,omitempty"`
+
+	// CustomStyle: Custom style information specific to this ad unit.
+	CustomStyle *AdStyle `json:"customStyle,omitempty"`
+
+	// FeedAdsSettings: Settings specific to feed ads (AFF).
+	FeedAdsSettings *AdUnitFeedAdsSettings `json:"feedAdsSettings,omitempty"`
+
+	// Id: Unique identifier of this ad unit. This should be considered an
+	// opaque identifier; it is not safe to rely on it being in any
+	// particular format.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#adUnit.
+	Kind string `json:"kind,omitempty"`
+
+	// MobileContentAdsSettings: Settings specific to WAP mobile content ads
+	// (AFMC).
+	MobileContentAdsSettings *AdUnitMobileContentAdsSettings `json:"mobileContentAdsSettings,omitempty"`
+
+	// Name: Name of this ad unit.
+	Name string `json:"name,omitempty"`
+
+	// SavedStyleId: ID of the saved ad style which holds this ad unit's
+	// style information.
+	SavedStyleId string `json:"savedStyleId,omitempty"`
+
+	// Status: Status of this ad unit. Possible values are:
+	// NEW: Indicates
+	// that the ad unit was created within the last seven days and does not
+	// yet have any activity associated with it.
+	//
+	// ACTIVE: Indicates that
+	// there has been activity on this ad unit in the last seven
+	// days.
+	//
+	// INACTIVE: Indicates that there has been no activity on this ad
+	// unit in the last seven days.
+	Status string `json:"status,omitempty"`
+}
+
+type AdUnitContentAdsSettings struct {
+	// BackupOption: The backup option to be used in instances where no ad
+	// is available.
+	BackupOption *AdUnitContentAdsSettingsBackupOption `json:"backupOption,omitempty"`
+
+	// Size: Size of this ad unit.
+	Size string `json:"size,omitempty"`
+
+	// Type: Type of this ad unit.
+	Type string `json:"type,omitempty"`
+}
+
+type AdUnitContentAdsSettingsBackupOption struct {
+	// Color: Color to use when type is set to COLOR.
+	Color string `json:"color,omitempty"`
+
+	// Type: Type of the backup option. Possible values are BLANK, COLOR and
+	// URL.
+	Type string `json:"type,omitempty"`
+
+	// Url: URL to use when type is set to URL.
+	Url string `json:"url,omitempty"`
+}
+
+type AdUnitFeedAdsSettings struct {
+	// AdPosition: The position of the ads relative to the feed entries.
+	AdPosition string `json:"adPosition,omitempty"`
+
+	// Frequency: The frequency at which ads should appear in the feed (i.e.
+	// every N entries).
+	Frequency int64 `json:"frequency,omitempty"`
+
+	// MinimumWordCount: The minimum length an entry should be in order to
+	// have attached ads.
+	MinimumWordCount int64 `json:"minimumWordCount,omitempty"`
+
+	// Type: The type of ads which should appear.
+	Type string `json:"type,omitempty"`
+}
+
+type AdUnitMobileContentAdsSettings struct {
+	// MarkupLanguage: The markup language to use for this ad unit.
+	MarkupLanguage string `json:"markupLanguage,omitempty"`
+
+	// ScriptingLanguage: The scripting language to use for this ad unit.
+	ScriptingLanguage string `json:"scriptingLanguage,omitempty"`
+
+	// Size: Size of this ad unit.
+	Size string `json:"size,omitempty"`
+
+	// Type: Type of this ad unit.
+	Type string `json:"type,omitempty"`
+}
+
+type AdUnits struct {
+	// Etag: ETag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The ad units returned in this list response.
+	Items []*AdUnit `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#adUnits.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through ad units. To
+	// retrieve the next page of results, set the next request's "pageToken"
+	// value to this.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type AdsenseReportsGenerateResponse struct {
+	// Averages: The averages of the report. This is the same length as any
+	// other row in the report; cells corresponding to dimension columns are
+	// empty.
+	Averages []string `json:"averages,omitempty"`
+
+	// Headers: The header information of the columns requested in the
+	// report. This is a list of headers; one for each dimension in the
+	// request, followed by one for each metric in the request.
+	Headers []*AdsenseReportsGenerateResponseHeaders `json:"headers,omitempty"`
+
+	// Kind: Kind this is, in this case adsense#report.
+	Kind string `json:"kind,omitempty"`
+
+	// Rows: The output rows of the report. Each row is a list of cells; one
+	// for each dimension in the request, followed by one for each metric in
+	// the request. The dimension cells contain strings, and the metric
+	// cells contain numbers.
+	Rows [][]string `json:"rows,omitempty"`
+
+	// TotalMatchedRows: The total number of rows matched by the report
+	// request. Fewer rows may be returned in the response due to being
+	// limited by the row count requested or the report row limit.
+	TotalMatchedRows int64 `json:"totalMatchedRows,omitempty,string"`
+
+	// Totals: The totals of the report. This is the same length as any
+	// other row in the report; cells corresponding to dimension columns are
+	// empty.
+	Totals []string `json:"totals,omitempty"`
+
+	// Warnings: Any warnings associated with generation of the report.
+	Warnings []string `json:"warnings,omitempty"`
+}
+
+type AdsenseReportsGenerateResponseHeaders struct {
+	// Currency: The currency of this column. Only present if the header
+	// type is METRIC_CURRENCY.
+	Currency string `json:"currency,omitempty"`
+
+	// Name: The name of the header.
+	Name string `json:"name,omitempty"`
+
+	// Type: The type of the header; one of DIMENSION, METRIC_TALLY,
+	// METRIC_RATIO, or METRIC_CURRENCY.
+	Type string `json:"type,omitempty"`
+}
+
+type Alert struct {
+	// Id: Unique identifier of this alert. This should be considered an
+	// opaque identifier; it is not safe to rely on it being in any
+	// particular format.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#alert.
+	Kind string `json:"kind,omitempty"`
+
+	// Message: The localized alert message.
+	Message string `json:"message,omitempty"`
+
+	// Severity: Severity of this alert. Possible values: INFO, WARNING,
+	// SEVERE.
+	Severity string `json:"severity,omitempty"`
+
+	// Type: Type of this alert. Possible values: SELF_HOLD,
+	// MIGRATED_TO_BILLING3, ADDRESS_PIN_VERIFICATION,
+	// PHONE_PIN_VERIFICATION, CORPORATE_ENTITY, GRAYLISTED_PUBLISHER,
+	// API_HOLD.
+	Type string `json:"type,omitempty"`
+}
+
+type Alerts struct {
+	// Items: The alerts returned in this list response.
+	Items []*Alert `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#alerts.
+	Kind string `json:"kind,omitempty"`
+}
+
+type CustomChannel struct {
+	// Code: Code of this custom channel, not necessarily unique across ad
+	// clients.
+	Code string `json:"code,omitempty"`
+
+	// Id: Unique identifier of this custom channel. This should be
+	// considered an opaque identifier; it is not safe to rely on it being
+	// in any particular format.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#customChannel.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of this custom channel.
+	Name string `json:"name,omitempty"`
+
+	// TargetingInfo: The targeting information of this custom channel, if
+	// activated.
+	TargetingInfo *CustomChannelTargetingInfo `json:"targetingInfo,omitempty"`
+}
+
+type CustomChannelTargetingInfo struct {
+	// AdsAppearOn: The name used to describe this channel externally.
+	AdsAppearOn string `json:"adsAppearOn,omitempty"`
+
+	// Description: The external description of the channel.
+	Description string `json:"description,omitempty"`
+
+	// Location: The locations in which ads appear. (Only valid for content
+	// and mobile content ads). Acceptable values for content ads are:
+	// TOP_LEFT, TOP_CENTER, TOP_RIGHT, MIDDLE_LEFT, MIDDLE_CENTER,
+	// MIDDLE_RIGHT, BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT,
+	// MULTIPLE_LOCATIONS. Acceptable values for mobile content ads are:
+	// TOP, MIDDLE, BOTTOM, MULTIPLE_LOCATIONS.
+	Location string `json:"location,omitempty"`
+
+	// SiteLanguage: The language of the sites ads will be displayed on.
+	SiteLanguage string `json:"siteLanguage,omitempty"`
+}
+
+type CustomChannels struct {
+	// Etag: ETag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The custom channels returned in this list response.
+	Items []*CustomChannel `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#customChannels.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through custom
+	// channels. To retrieve the next page of results, set the next
+	// request's "pageToken" value to this.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type Metadata struct {
+	Items []*ReportingMetadataEntry `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#metadata.
+	Kind string `json:"kind,omitempty"`
+}
+
+type ReportingMetadataEntry struct {
+	// CompatibleDimensions: For metrics this is a list of dimension IDs
+	// which the metric is compatible with, for dimensions it is a list of
+	// compatibility groups the dimension belongs to.
+	CompatibleDimensions []string `json:"compatibleDimensions,omitempty"`
+
+	// CompatibleMetrics: The names of the metrics the dimension or metric
+	// this reporting metadata entry describes is compatible with.
+	CompatibleMetrics []string `json:"compatibleMetrics,omitempty"`
+
+	// Id: Unique identifier of this reporting metadata entry, corresponding
+	// to the name of the appropriate dimension or metric.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case
+	// adsense#reportingMetadataEntry.
+	Kind string `json:"kind,omitempty"`
+
+	// RequiredDimensions: The names of the dimensions which the dimension
+	// or metric this reporting metadata entry describes requires to also be
+	// present in order for the report to be valid. Omitting these will not
+	// cause an error or warning, but may result in data which cannot be
+	// correctly interpreted.
+	RequiredDimensions []string `json:"requiredDimensions,omitempty"`
+
+	// RequiredMetrics: The names of the metrics which the dimension or
+	// metric this reporting metadata entry describes requires to also be
+	// present in order for the report to be valid. Omitting these will not
+	// cause an error or warning, but may result in data which cannot be
+	// correctly interpreted.
+	RequiredMetrics []string `json:"requiredMetrics,omitempty"`
+
+	// SupportedProducts: The codes of the projects supported by the
+	// dimension or metric this reporting metadata entry describes.
+	SupportedProducts []string `json:"supportedProducts,omitempty"`
+}
+
+type SavedAdStyle struct {
+	// AdStyle: The AdStyle itself.
+	AdStyle *AdStyle `json:"adStyle,omitempty"`
+
+	// Id: Unique identifier of this saved ad style. This should be
+	// considered an opaque identifier; it is not safe to rely on it being
+	// in any particular format.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#savedAdStyle.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: The user selected name of this SavedAdStyle.
+	Name string `json:"name,omitempty"`
+}
+
+type SavedAdStyles struct {
+	// Etag: ETag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The saved ad styles returned in this list response.
+	Items []*SavedAdStyle `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#savedAdStyles.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through ad units. To
+	// retrieve the next page of results, set the next request's "pageToken"
+	// value to this.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type SavedReport struct {
+	// Id: Unique identifier of this saved report.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#savedReport.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: This saved report's name.
+	Name string `json:"name,omitempty"`
+}
+
+type SavedReports struct {
+	// Etag: ETag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The saved reports returned in this list response.
+	Items []*SavedReport `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#savedReports.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through saved reports.
+	// To retrieve the next page of results, set the next request's
+	// "pageToken" value to this.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type UrlChannel struct {
+	// Id: Unique identifier of this URL channel. This should be considered
+	// an opaque identifier; it is not safe to rely on it being in any
+	// particular format.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Kind of resource this is, in this case adsense#urlChannel.
+	Kind string `json:"kind,omitempty"`
+
+	// UrlPattern: URL Pattern of this URL channel. Does not include
+	// "http://" or "https://". Example: www.example.com/home
+	UrlPattern string `json:"urlPattern,omitempty"`
+}
+
+type UrlChannels struct {
+	// Etag: ETag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The URL channels returned in this list response.
+	Items []*UrlChannel `json:"items,omitempty"`
+
+	// Kind: Kind of list this is, in this case adsense#urlChannels.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through URL channels.
+	// To retrieve the next page of results, set the next request's
+	// "pageToken" value to this.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+// method id "adsense.accounts.get":
+
+type AccountsGetCall struct {
+	s         *Service
+	accountId string
+	opt_      map[string]interface{}
+}
+
+// Get: Get information about the selected AdSense account.
+func (r *AccountsService) Get(accountId string) *AccountsGetCall {
+	c := &AccountsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	return c
+}
+
+// Tree sets the optional parameter "tree": Whether the tree of sub
+// accounts should be returned.
+func (c *AccountsGetCall) Tree(tree bool) *AccountsGetCall {
+	c.opt_["tree"] = tree
+	return c
+}
+
+func (c *AccountsGetCall) Do() (*Account, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["tree"]; ok {
+		params.Set("tree", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Account)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Get information about the selected AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.get",
+	//   "parameterOrder": [
+	//     "accountId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to get information about.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "tree": {
+	//       "description": "Whether the tree of sub accounts should be returned.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}",
+	//   "response": {
+	//     "$ref": "Account"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.list":
+
+type AccountsListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: List all accounts available to this AdSense account.
+func (r *AccountsService) List() *AccountsListCall {
+	c := &AccountsListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of accounts to include in the response, used for paging.
+func (c *AccountsListCall) MaxResults(maxResults int64) *AccountsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through accounts. To retrieve the next page, set
+// this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AccountsListCall) PageToken(pageToken string) *AccountsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsListCall) Do() (*Accounts, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Accounts)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all accounts available to this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.list",
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "The maximum number of accounts to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through accounts. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts",
+	//   "response": {
+	//     "$ref": "Accounts"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.adclients.list":
+
+type AccountsAdclientsListCall struct {
+	s         *Service
+	accountId string
+	opt_      map[string]interface{}
+}
+
+// List: List all ad clients in the specified account.
+func (r *AccountsAdclientsService) List(accountId string) *AccountsAdclientsListCall {
+	c := &AccountsAdclientsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of ad clients to include in the response, used for paging.
+func (c *AccountsAdclientsListCall) MaxResults(maxResults int64) *AccountsAdclientsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through ad clients. To retrieve the next page,
+// set this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AccountsAdclientsListCall) PageToken(pageToken string) *AccountsAdclientsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsAdclientsListCall) Do() (*AdClients, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdClients)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all ad clients in the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.adclients.list",
+	//   "parameterOrder": [
+	//     "accountId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account for which to list ad clients.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of ad clients to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through ad clients. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients",
+	//   "response": {
+	//     "$ref": "AdClients"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.adunits.get":
+
+type AccountsAdunitsGetCall struct {
+	s          *Service
+	accountId  string
+	adClientId string
+	adUnitId   string
+	opt_       map[string]interface{}
+}
+
+// Get: Gets the specified ad unit in the specified ad client for the
+// specified account.
+func (r *AccountsAdunitsService) Get(accountId string, adClientId string, adUnitId string) *AccountsAdunitsGetCall {
+	c := &AccountsAdunitsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	c.adUnitId = adUnitId
+	return c
+}
+
+func (c *AccountsAdunitsGetCall) Do() (*AdUnit, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdUnit)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Gets the specified ad unit in the specified ad client for the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.adunits.get",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId",
+	//     "adUnitId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the ad client belongs.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client for which to get the ad unit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adUnitId": {
+	//       "description": "Ad unit to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}",
+	//   "response": {
+	//     "$ref": "AdUnit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.adunits.getAdCode":
+
+type AccountsAdunitsGetAdCodeCall struct {
+	s          *Service
+	accountId  string
+	adClientId string
+	adUnitId   string
+	opt_       map[string]interface{}
+}
+
+// GetAdCode: Get ad code for the specified ad unit.
+func (r *AccountsAdunitsService) GetAdCode(accountId string, adClientId string, adUnitId string) *AccountsAdunitsGetAdCodeCall {
+	c := &AccountsAdunitsGetAdCodeCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	c.adUnitId = adUnitId
+	return c
+}
+
+func (c *AccountsAdunitsGetAdCodeCall) Do() (*AdCode, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdCode)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Get ad code for the specified ad unit.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.adunits.getAdCode",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId",
+	//     "adUnitId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account which contains the ad client.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client with contains the ad unit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adUnitId": {
+	//       "description": "Ad unit to get the code for.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode",
+	//   "response": {
+	//     "$ref": "AdCode"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.adunits.list":
+
+type AccountsAdunitsListCall struct {
+	s          *Service
+	accountId  string
+	adClientId string
+	opt_       map[string]interface{}
+}
+
+// List: List all ad units in the specified ad client for the specified
+// account.
+func (r *AccountsAdunitsService) List(accountId string, adClientId string) *AccountsAdunitsListCall {
+	c := &AccountsAdunitsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	return c
+}
+
+// IncludeInactive sets the optional parameter "includeInactive":
+// Whether to include inactive ad units. Default: true.
+func (c *AccountsAdunitsListCall) IncludeInactive(includeInactive bool) *AccountsAdunitsListCall {
+	c.opt_["includeInactive"] = includeInactive
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of ad units to include in the response, used for paging.
+func (c *AccountsAdunitsListCall) MaxResults(maxResults int64) *AccountsAdunitsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through ad units. To retrieve the next page, set
+// this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AccountsAdunitsListCall) PageToken(pageToken string) *AccountsAdunitsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsAdunitsListCall) Do() (*AdUnits, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["includeInactive"]; ok {
+		params.Set("includeInactive", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/adunits")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdUnits)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all ad units in the specified ad client for the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.adunits.list",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the ad client belongs.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client for which to list ad units.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "includeInactive": {
+	//       "description": "Whether to include inactive ad units. Default: true.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of ad units to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/adunits",
+	//   "response": {
+	//     "$ref": "AdUnits"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.adunits.customchannels.list":
+
+type AccountsAdunitsCustomchannelsListCall struct {
+	s          *Service
+	accountId  string
+	adClientId string
+	adUnitId   string
+	opt_       map[string]interface{}
+}
+
+// List: List all custom channels which the specified ad unit belongs
+// to.
+func (r *AccountsAdunitsCustomchannelsService) List(accountId string, adClientId string, adUnitId string) *AccountsAdunitsCustomchannelsListCall {
+	c := &AccountsAdunitsCustomchannelsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	c.adUnitId = adUnitId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of custom channels to include in the response, used for
+// paging.
+func (c *AccountsAdunitsCustomchannelsListCall) MaxResults(maxResults int64) *AccountsAdunitsCustomchannelsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through custom channels. To retrieve the next
+// page, set this parameter to the value of "nextPageToken" from the
+// previous response.
+func (c *AccountsAdunitsCustomchannelsListCall) PageToken(pageToken string) *AccountsAdunitsCustomchannelsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsAdunitsCustomchannelsListCall) Do() (*CustomChannels, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(CustomChannels)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all custom channels which the specified ad unit belongs to.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.adunits.customchannels.list",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId",
+	//     "adUnitId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the ad client belongs.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client which contains the ad unit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adUnitId": {
+	//       "description": "Ad unit for which to list custom channels.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of custom channels to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels",
+	//   "response": {
+	//     "$ref": "CustomChannels"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.alerts.list":
+
+type AccountsAlertsListCall struct {
+	s         *Service
+	accountId string
+	opt_      map[string]interface{}
+}
+
+// List: List the alerts for the specified AdSense account.
+func (r *AccountsAlertsService) List(accountId string) *AccountsAlertsListCall {
+	c := &AccountsAlertsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	return c
+}
+
+// Locale sets the optional parameter "locale": The locale to use for
+// translating alert messages. The account locale will be used if this
+// is not supplied. The AdSense default (English) will be used if the
+// supplied locale is invalid or unsupported.
+func (c *AccountsAlertsListCall) Locale(locale string) *AccountsAlertsListCall {
+	c.opt_["locale"] = locale
+	return c
+}
+
+func (c *AccountsAlertsListCall) Do() (*Alerts, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["locale"]; ok {
+		params.Set("locale", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/alerts")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Alerts)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List the alerts for the specified AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.alerts.list",
+	//   "parameterOrder": [
+	//     "accountId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account for which to retrieve the alerts.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "locale": {
+	//       "description": "The locale to use for translating alert messages. The account locale will be used if this is not supplied. The AdSense default (English) will be used if the supplied locale is invalid or unsupported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/alerts",
+	//   "response": {
+	//     "$ref": "Alerts"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.customchannels.get":
+
+type AccountsCustomchannelsGetCall struct {
+	s               *Service
+	accountId       string
+	adClientId      string
+	customChannelId string
+	opt_            map[string]interface{}
+}
+
+// Get: Get the specified custom channel from the specified ad client
+// for the specified account.
+func (r *AccountsCustomchannelsService) Get(accountId string, adClientId string, customChannelId string) *AccountsCustomchannelsGetCall {
+	c := &AccountsCustomchannelsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	c.customChannelId = customChannelId
+	return c
+}
+
+func (c *AccountsCustomchannelsGetCall) Do() (*CustomChannel, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(CustomChannel)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Get the specified custom channel from the specified ad client for the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.customchannels.get",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId",
+	//     "customChannelId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the ad client belongs.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client which contains the custom channel.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "customChannelId": {
+	//       "description": "Custom channel to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}",
+	//   "response": {
+	//     "$ref": "CustomChannel"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.customchannels.list":
+
+type AccountsCustomchannelsListCall struct {
+	s          *Service
+	accountId  string
+	adClientId string
+	opt_       map[string]interface{}
+}
+
+// List: List all custom channels in the specified ad client for the
+// specified account.
+func (r *AccountsCustomchannelsService) List(accountId string, adClientId string) *AccountsCustomchannelsListCall {
+	c := &AccountsCustomchannelsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of custom channels to include in the response, used for
+// paging.
+func (c *AccountsCustomchannelsListCall) MaxResults(maxResults int64) *AccountsCustomchannelsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through custom channels. To retrieve the next
+// page, set this parameter to the value of "nextPageToken" from the
+// previous response.
+func (c *AccountsCustomchannelsListCall) PageToken(pageToken string) *AccountsCustomchannelsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsCustomchannelsListCall) Do() (*CustomChannels, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/customchannels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(CustomChannels)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all custom channels in the specified ad client for the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.customchannels.list",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the ad client belongs.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client for which to list custom channels.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of custom channels to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/customchannels",
+	//   "response": {
+	//     "$ref": "CustomChannels"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.customchannels.adunits.list":
+
+type AccountsCustomchannelsAdunitsListCall struct {
+	s               *Service
+	accountId       string
+	adClientId      string
+	customChannelId string
+	opt_            map[string]interface{}
+}
+
+// List: List all ad units in the specified custom channel.
+func (r *AccountsCustomchannelsAdunitsService) List(accountId string, adClientId string, customChannelId string) *AccountsCustomchannelsAdunitsListCall {
+	c := &AccountsCustomchannelsAdunitsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	c.customChannelId = customChannelId
+	return c
+}
+
+// IncludeInactive sets the optional parameter "includeInactive":
+// Whether to include inactive ad units. Default: true.
+func (c *AccountsCustomchannelsAdunitsListCall) IncludeInactive(includeInactive bool) *AccountsCustomchannelsAdunitsListCall {
+	c.opt_["includeInactive"] = includeInactive
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of ad units to include in the response, used for paging.
+func (c *AccountsCustomchannelsAdunitsListCall) MaxResults(maxResults int64) *AccountsCustomchannelsAdunitsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through ad units. To retrieve the next page, set
+// this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AccountsCustomchannelsAdunitsListCall) PageToken(pageToken string) *AccountsCustomchannelsAdunitsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsCustomchannelsAdunitsListCall) Do() (*AdUnits, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["includeInactive"]; ok {
+		params.Set("includeInactive", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdUnits)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all ad units in the specified custom channel.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.customchannels.adunits.list",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId",
+	//     "customChannelId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the ad client belongs.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client which contains the custom channel.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "customChannelId": {
+	//       "description": "Custom channel for which to list ad units.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "includeInactive": {
+	//       "description": "Whether to include inactive ad units. Default: true.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of ad units to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits",
+	//   "response": {
+	//     "$ref": "AdUnits"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.reports.generate":
+
+type AccountsReportsGenerateCall struct {
+	s         *Service
+	accountId string
+	startDate string
+	endDate   string
+	opt_      map[string]interface{}
+}
+
+// Generate: Generate an AdSense report based on the report request sent
+// in the query parameters. Returns the result as JSON; to retrieve
+// output in CSV format specify "alt=csv" as a query parameter.
+func (r *AccountsReportsService) Generate(accountId string, startDate string, endDate string) *AccountsReportsGenerateCall {
+	c := &AccountsReportsGenerateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.startDate = startDate
+	c.endDate = endDate
+	return c
+}
+
+// Currency sets the optional parameter "currency": Optional currency to
+// use when reporting on monetary metrics. Defaults to the account's
+// currency if not set.
+func (c *AccountsReportsGenerateCall) Currency(currency string) *AccountsReportsGenerateCall {
+	c.opt_["currency"] = currency
+	return c
+}
+
+// Dimension sets the optional parameter "dimension": Dimensions to base
+// the report on.
+func (c *AccountsReportsGenerateCall) Dimension(dimension string) *AccountsReportsGenerateCall {
+	c.opt_["dimension"] = dimension
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filters to be run on the
+// report.
+func (c *AccountsReportsGenerateCall) Filter(filter string) *AccountsReportsGenerateCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// Locale sets the optional parameter "locale": Optional locale to use
+// for translating report output to a local language. Defaults to
+// "en_US" if not specified.
+func (c *AccountsReportsGenerateCall) Locale(locale string) *AccountsReportsGenerateCall {
+	c.opt_["locale"] = locale
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of rows of report data to return.
+func (c *AccountsReportsGenerateCall) MaxResults(maxResults int64) *AccountsReportsGenerateCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// Metric sets the optional parameter "metric": Numeric columns to
+// include in the report.
+func (c *AccountsReportsGenerateCall) Metric(metric string) *AccountsReportsGenerateCall {
+	c.opt_["metric"] = metric
+	return c
+}
+
+// Sort sets the optional parameter "sort": The name of a dimension or
+// metric to sort the resulting report on, optionally prefixed with "+"
+// to sort ascending or "-" to sort descending. If no prefix is
+// specified, the column is sorted ascending.
+func (c *AccountsReportsGenerateCall) Sort(sort string) *AccountsReportsGenerateCall {
+	c.opt_["sort"] = sort
+	return c
+}
+
+// StartIndex sets the optional parameter "startIndex": Index of the
+// first row of report data to return.
+func (c *AccountsReportsGenerateCall) StartIndex(startIndex int64) *AccountsReportsGenerateCall {
+	c.opt_["startIndex"] = startIndex
+	return c
+}
+
+// UseTimezoneReporting sets the optional parameter
+// "useTimezoneReporting": Whether the report should be generated in the
+// AdSense account's local timezone. If false default PST/PDT timezone
+// will be used.
+func (c *AccountsReportsGenerateCall) UseTimezoneReporting(useTimezoneReporting bool) *AccountsReportsGenerateCall {
+	c.opt_["useTimezoneReporting"] = useTimezoneReporting
+	return c
+}
+
+func (c *AccountsReportsGenerateCall) Do() (*AdsenseReportsGenerateResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("endDate", fmt.Sprintf("%v", c.endDate))
+	params.Set("startDate", fmt.Sprintf("%v", c.startDate))
+	if v, ok := c.opt_["currency"]; ok {
+		params.Set("currency", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["dimension"]; ok {
+		params.Set("dimension", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["locale"]; ok {
+		params.Set("locale", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["metric"]; ok {
+		params.Set("metric", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sort"]; ok {
+		params.Set("sort", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["startIndex"]; ok {
+		params.Set("startIndex", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["useTimezoneReporting"]; ok {
+		params.Set("useTimezoneReporting", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/reports")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdsenseReportsGenerateResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Generate an AdSense report based on the report request sent in the query parameters. Returns the result as JSON; to retrieve output in CSV format specify \"alt=csv\" as a query parameter.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.reports.generate",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "startDate",
+	//     "endDate"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account upon which to report.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "currency": {
+	//       "description": "Optional currency to use when reporting on monetary metrics. Defaults to the account's currency if not set.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z]+",
+	//       "type": "string"
+	//     },
+	//     "dimension": {
+	//       "description": "Dimensions to base the report on.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "endDate": {
+	//       "description": "End of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+	//       "location": "query",
+	//       "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "filter": {
+	//       "description": "Filters to be run on the report.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+(==|=@).+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "locale": {
+	//       "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of rows of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "50000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "metric": {
+	//       "description": "Numeric columns to include in the report.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "sort": {
+	//       "description": "The name of a dimension or metric to sort the resulting report on, optionally prefixed with \"+\" to sort ascending or \"-\" to sort descending. If no prefix is specified, the column is sorted ascending.",
+	//       "location": "query",
+	//       "pattern": "(\\+|-)?[a-zA-Z_]+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "startDate": {
+	//       "description": "Start of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+	//       "location": "query",
+	//       "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "startIndex": {
+	//       "description": "Index of the first row of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "5000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "useTimezoneReporting": {
+	//       "description": "Whether the report should be generated in the AdSense account's local timezone. If false default PST/PDT timezone will be used.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/reports",
+	//   "response": {
+	//     "$ref": "AdsenseReportsGenerateResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ],
+	//   "supportsMediaDownload": true
+	// }
+
+}
+
+// method id "adsense.accounts.reports.saved.generate":
+
+type AccountsReportsSavedGenerateCall struct {
+	s             *Service
+	accountId     string
+	savedReportId string
+	opt_          map[string]interface{}
+}
+
+// Generate: Generate an AdSense report based on the saved report ID
+// sent in the query parameters.
+func (r *AccountsReportsSavedService) Generate(accountId string, savedReportId string) *AccountsReportsSavedGenerateCall {
+	c := &AccountsReportsSavedGenerateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.savedReportId = savedReportId
+	return c
+}
+
+// Locale sets the optional parameter "locale": Optional locale to use
+// for translating report output to a local language. Defaults to
+// "en_US" if not specified.
+func (c *AccountsReportsSavedGenerateCall) Locale(locale string) *AccountsReportsSavedGenerateCall {
+	c.opt_["locale"] = locale
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of rows of report data to return.
+func (c *AccountsReportsSavedGenerateCall) MaxResults(maxResults int64) *AccountsReportsSavedGenerateCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// StartIndex sets the optional parameter "startIndex": Index of the
+// first row of report data to return.
+func (c *AccountsReportsSavedGenerateCall) StartIndex(startIndex int64) *AccountsReportsSavedGenerateCall {
+	c.opt_["startIndex"] = startIndex
+	return c
+}
+
+func (c *AccountsReportsSavedGenerateCall) Do() (*AdsenseReportsGenerateResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["locale"]; ok {
+		params.Set("locale", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["startIndex"]; ok {
+		params.Set("startIndex", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/reports/{savedReportId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedReportId}", url.QueryEscape(c.savedReportId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdsenseReportsGenerateResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Generate an AdSense report based on the saved report ID sent in the query parameters.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.reports.saved.generate",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "savedReportId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the saved reports belong.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "locale": {
+	//       "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of rows of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "50000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "savedReportId": {
+	//       "description": "The saved report to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "startIndex": {
+	//       "description": "Index of the first row of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "5000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/reports/{savedReportId}",
+	//   "response": {
+	//     "$ref": "AdsenseReportsGenerateResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.reports.saved.list":
+
+type AccountsReportsSavedListCall struct {
+	s         *Service
+	accountId string
+	opt_      map[string]interface{}
+}
+
+// List: List all saved reports in the specified AdSense account.
+func (r *AccountsReportsSavedService) List(accountId string) *AccountsReportsSavedListCall {
+	c := &AccountsReportsSavedListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of saved reports to include in the response, used for paging.
+func (c *AccountsReportsSavedListCall) MaxResults(maxResults int64) *AccountsReportsSavedListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through saved reports. To retrieve the next page,
+// set this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AccountsReportsSavedListCall) PageToken(pageToken string) *AccountsReportsSavedListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsReportsSavedListCall) Do() (*SavedReports, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/reports/saved")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SavedReports)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all saved reports in the specified AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.reports.saved.list",
+	//   "parameterOrder": [
+	//     "accountId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the saved reports belong.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of saved reports to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through saved reports. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/reports/saved",
+	//   "response": {
+	//     "$ref": "SavedReports"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.savedadstyles.get":
+
+type AccountsSavedadstylesGetCall struct {
+	s              *Service
+	accountId      string
+	savedAdStyleId string
+	opt_           map[string]interface{}
+}
+
+// Get: List a specific saved ad style for the specified account.
+func (r *AccountsSavedadstylesService) Get(accountId string, savedAdStyleId string) *AccountsSavedadstylesGetCall {
+	c := &AccountsSavedadstylesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.savedAdStyleId = savedAdStyleId
+	return c
+}
+
+func (c *AccountsSavedadstylesGetCall) Do() (*SavedAdStyle, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/savedadstyles/{savedAdStyleId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedAdStyleId}", url.QueryEscape(c.savedAdStyleId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SavedAdStyle)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List a specific saved ad style for the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.savedadstyles.get",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "savedAdStyleId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account for which to get the saved ad style.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "savedAdStyleId": {
+	//       "description": "Saved ad style to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/savedadstyles/{savedAdStyleId}",
+	//   "response": {
+	//     "$ref": "SavedAdStyle"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.savedadstyles.list":
+
+type AccountsSavedadstylesListCall struct {
+	s         *Service
+	accountId string
+	opt_      map[string]interface{}
+}
+
+// List: List all saved ad styles in the specified account.
+func (r *AccountsSavedadstylesService) List(accountId string) *AccountsSavedadstylesListCall {
+	c := &AccountsSavedadstylesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of saved ad styles to include in the response, used for
+// paging.
+func (c *AccountsSavedadstylesListCall) MaxResults(maxResults int64) *AccountsSavedadstylesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through saved ad styles. To retrieve the next
+// page, set this parameter to the value of "nextPageToken" from the
+// previous response.
+func (c *AccountsSavedadstylesListCall) PageToken(pageToken string) *AccountsSavedadstylesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsSavedadstylesListCall) Do() (*SavedAdStyles, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/savedadstyles")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SavedAdStyles)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all saved ad styles in the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.savedadstyles.list",
+	//   "parameterOrder": [
+	//     "accountId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account for which to list saved ad styles.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of saved ad styles to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through saved ad styles. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/savedadstyles",
+	//   "response": {
+	//     "$ref": "SavedAdStyles"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.accounts.urlchannels.list":
+
+type AccountsUrlchannelsListCall struct {
+	s          *Service
+	accountId  string
+	adClientId string
+	opt_       map[string]interface{}
+}
+
+// List: List all URL channels in the specified ad client for the
+// specified account.
+func (r *AccountsUrlchannelsService) List(accountId string, adClientId string) *AccountsUrlchannelsListCall {
+	c := &AccountsUrlchannelsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.accountId = accountId
+	c.adClientId = adClientId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of URL channels to include in the response, used for paging.
+func (c *AccountsUrlchannelsListCall) MaxResults(maxResults int64) *AccountsUrlchannelsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through URL channels. To retrieve the next page,
+// set this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AccountsUrlchannelsListCall) PageToken(pageToken string) *AccountsUrlchannelsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AccountsUrlchannelsListCall) Do() (*UrlChannels, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "accounts/{accountId}/adclients/{adClientId}/urlchannels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UrlChannels)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all URL channels in the specified ad client for the specified account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.accounts.urlchannels.list",
+	//   "parameterOrder": [
+	//     "accountId",
+	//     "adClientId"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Account to which the ad client belongs.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adClientId": {
+	//       "description": "Ad client for which to list URL channels.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of URL channels to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through URL channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "accounts/{accountId}/adclients/{adClientId}/urlchannels",
+	//   "response": {
+	//     "$ref": "UrlChannels"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.adclients.list":
+
+type AdclientsListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: List all ad clients in this AdSense account.
+func (r *AdclientsService) List() *AdclientsListCall {
+	c := &AdclientsListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of ad clients to include in the response, used for paging.
+func (c *AdclientsListCall) MaxResults(maxResults int64) *AdclientsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through ad clients. To retrieve the next page,
+// set this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AdclientsListCall) PageToken(pageToken string) *AdclientsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AdclientsListCall) Do() (*AdClients, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdClients)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all ad clients in this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.adclients.list",
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "The maximum number of ad clients to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through ad clients. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients",
+	//   "response": {
+	//     "$ref": "AdClients"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.adunits.get":
+
+type AdunitsGetCall struct {
+	s          *Service
+	adClientId string
+	adUnitId   string
+	opt_       map[string]interface{}
+}
+
+// Get: Gets the specified ad unit in the specified ad client.
+func (r *AdunitsService) Get(adClientId string, adUnitId string) *AdunitsGetCall {
+	c := &AdunitsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	c.adUnitId = adUnitId
+	return c
+}
+
+func (c *AdunitsGetCall) Do() (*AdUnit, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/adunits/{adUnitId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdUnit)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Gets the specified ad unit in the specified ad client.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.adunits.get",
+	//   "parameterOrder": [
+	//     "adClientId",
+	//     "adUnitId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client for which to get the ad unit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adUnitId": {
+	//       "description": "Ad unit to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/adunits/{adUnitId}",
+	//   "response": {
+	//     "$ref": "AdUnit"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.adunits.getAdCode":
+
+type AdunitsGetAdCodeCall struct {
+	s          *Service
+	adClientId string
+	adUnitId   string
+	opt_       map[string]interface{}
+}
+
+// GetAdCode: Get ad code for the specified ad unit.
+func (r *AdunitsService) GetAdCode(adClientId string, adUnitId string) *AdunitsGetAdCodeCall {
+	c := &AdunitsGetAdCodeCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	c.adUnitId = adUnitId
+	return c
+}
+
+func (c *AdunitsGetAdCodeCall) Do() (*AdCode, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/adunits/{adUnitId}/adcode")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdCode)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Get ad code for the specified ad unit.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.adunits.getAdCode",
+	//   "parameterOrder": [
+	//     "adClientId",
+	//     "adUnitId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client with contains the ad unit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adUnitId": {
+	//       "description": "Ad unit to get the code for.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/adunits/{adUnitId}/adcode",
+	//   "response": {
+	//     "$ref": "AdCode"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.adunits.list":
+
+type AdunitsListCall struct {
+	s          *Service
+	adClientId string
+	opt_       map[string]interface{}
+}
+
+// List: List all ad units in the specified ad client for this AdSense
+// account.
+func (r *AdunitsService) List(adClientId string) *AdunitsListCall {
+	c := &AdunitsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	return c
+}
+
+// IncludeInactive sets the optional parameter "includeInactive":
+// Whether to include inactive ad units. Default: true.
+func (c *AdunitsListCall) IncludeInactive(includeInactive bool) *AdunitsListCall {
+	c.opt_["includeInactive"] = includeInactive
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of ad units to include in the response, used for paging.
+func (c *AdunitsListCall) MaxResults(maxResults int64) *AdunitsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through ad units. To retrieve the next page, set
+// this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *AdunitsListCall) PageToken(pageToken string) *AdunitsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AdunitsListCall) Do() (*AdUnits, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["includeInactive"]; ok {
+		params.Set("includeInactive", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/adunits")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdUnits)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all ad units in the specified ad client for this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.adunits.list",
+	//   "parameterOrder": [
+	//     "adClientId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client for which to list ad units.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "includeInactive": {
+	//       "description": "Whether to include inactive ad units. Default: true.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of ad units to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/adunits",
+	//   "response": {
+	//     "$ref": "AdUnits"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.adunits.customchannels.list":
+
+type AdunitsCustomchannelsListCall struct {
+	s          *Service
+	adClientId string
+	adUnitId   string
+	opt_       map[string]interface{}
+}
+
+// List: List all custom channels which the specified ad unit belongs
+// to.
+func (r *AdunitsCustomchannelsService) List(adClientId string, adUnitId string) *AdunitsCustomchannelsListCall {
+	c := &AdunitsCustomchannelsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	c.adUnitId = adUnitId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of custom channels to include in the response, used for
+// paging.
+func (c *AdunitsCustomchannelsListCall) MaxResults(maxResults int64) *AdunitsCustomchannelsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through custom channels. To retrieve the next
+// page, set this parameter to the value of "nextPageToken" from the
+// previous response.
+func (c *AdunitsCustomchannelsListCall) PageToken(pageToken string) *AdunitsCustomchannelsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AdunitsCustomchannelsListCall) Do() (*CustomChannels, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/adunits/{adUnitId}/customchannels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(CustomChannels)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all custom channels which the specified ad unit belongs to.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.adunits.customchannels.list",
+	//   "parameterOrder": [
+	//     "adClientId",
+	//     "adUnitId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client which contains the ad unit.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "adUnitId": {
+	//       "description": "Ad unit for which to list custom channels.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of custom channels to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/adunits/{adUnitId}/customchannels",
+	//   "response": {
+	//     "$ref": "CustomChannels"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.alerts.list":
+
+type AlertsListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: List the alerts for this AdSense account.
+func (r *AlertsService) List() *AlertsListCall {
+	c := &AlertsListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// Locale sets the optional parameter "locale": The locale to use for
+// translating alert messages. The account locale will be used if this
+// is not supplied. The AdSense default (English) will be used if the
+// supplied locale is invalid or unsupported.
+func (c *AlertsListCall) Locale(locale string) *AlertsListCall {
+	c.opt_["locale"] = locale
+	return c
+}
+
+func (c *AlertsListCall) Do() (*Alerts, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["locale"]; ok {
+		params.Set("locale", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "alerts")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Alerts)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List the alerts for this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.alerts.list",
+	//   "parameters": {
+	//     "locale": {
+	//       "description": "The locale to use for translating alert messages. The account locale will be used if this is not supplied. The AdSense default (English) will be used if the supplied locale is invalid or unsupported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "alerts",
+	//   "response": {
+	//     "$ref": "Alerts"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.customchannels.get":
+
+type CustomchannelsGetCall struct {
+	s               *Service
+	adClientId      string
+	customChannelId string
+	opt_            map[string]interface{}
+}
+
+// Get: Get the specified custom channel from the specified ad client.
+func (r *CustomchannelsService) Get(adClientId string, customChannelId string) *CustomchannelsGetCall {
+	c := &CustomchannelsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	c.customChannelId = customChannelId
+	return c
+}
+
+func (c *CustomchannelsGetCall) Do() (*CustomChannel, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/customchannels/{customChannelId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(CustomChannel)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Get the specified custom channel from the specified ad client.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.customchannels.get",
+	//   "parameterOrder": [
+	//     "adClientId",
+	//     "customChannelId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client which contains the custom channel.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "customChannelId": {
+	//       "description": "Custom channel to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/customchannels/{customChannelId}",
+	//   "response": {
+	//     "$ref": "CustomChannel"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.customchannels.list":
+
+type CustomchannelsListCall struct {
+	s          *Service
+	adClientId string
+	opt_       map[string]interface{}
+}
+
+// List: List all custom channels in the specified ad client for this
+// AdSense account.
+func (r *CustomchannelsService) List(adClientId string) *CustomchannelsListCall {
+	c := &CustomchannelsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of custom channels to include in the response, used for
+// paging.
+func (c *CustomchannelsListCall) MaxResults(maxResults int64) *CustomchannelsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through custom channels. To retrieve the next
+// page, set this parameter to the value of "nextPageToken" from the
+// previous response.
+func (c *CustomchannelsListCall) PageToken(pageToken string) *CustomchannelsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *CustomchannelsListCall) Do() (*CustomChannels, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/customchannels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(CustomChannels)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all custom channels in the specified ad client for this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.customchannels.list",
+	//   "parameterOrder": [
+	//     "adClientId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client for which to list custom channels.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of custom channels to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through custom channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/customchannels",
+	//   "response": {
+	//     "$ref": "CustomChannels"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.customchannels.adunits.list":
+
+type CustomchannelsAdunitsListCall struct {
+	s               *Service
+	adClientId      string
+	customChannelId string
+	opt_            map[string]interface{}
+}
+
+// List: List all ad units in the specified custom channel.
+func (r *CustomchannelsAdunitsService) List(adClientId string, customChannelId string) *CustomchannelsAdunitsListCall {
+	c := &CustomchannelsAdunitsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	c.customChannelId = customChannelId
+	return c
+}
+
+// IncludeInactive sets the optional parameter "includeInactive":
+// Whether to include inactive ad units. Default: true.
+func (c *CustomchannelsAdunitsListCall) IncludeInactive(includeInactive bool) *CustomchannelsAdunitsListCall {
+	c.opt_["includeInactive"] = includeInactive
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of ad units to include in the response, used for paging.
+func (c *CustomchannelsAdunitsListCall) MaxResults(maxResults int64) *CustomchannelsAdunitsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through ad units. To retrieve the next page, set
+// this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *CustomchannelsAdunitsListCall) PageToken(pageToken string) *CustomchannelsAdunitsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *CustomchannelsAdunitsListCall) Do() (*AdUnits, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["includeInactive"]; ok {
+		params.Set("includeInactive", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/customchannels/{customChannelId}/adunits")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdUnits)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all ad units in the specified custom channel.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.customchannels.adunits.list",
+	//   "parameterOrder": [
+	//     "adClientId",
+	//     "customChannelId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client which contains the custom channel.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "customChannelId": {
+	//       "description": "Custom channel for which to list ad units.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "includeInactive": {
+	//       "description": "Whether to include inactive ad units. Default: true.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of ad units to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through ad units. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/customchannels/{customChannelId}/adunits",
+	//   "response": {
+	//     "$ref": "AdUnits"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.metadata.dimensions.list":
+
+type MetadataDimensionsListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: List the metadata for the dimensions available to this AdSense
+// account.
+func (r *MetadataDimensionsService) List() *MetadataDimensionsListCall {
+	c := &MetadataDimensionsListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+func (c *MetadataDimensionsListCall) Do() (*Metadata, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "metadata/dimensions")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Metadata)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List the metadata for the dimensions available to this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.metadata.dimensions.list",
+	//   "path": "metadata/dimensions",
+	//   "response": {
+	//     "$ref": "Metadata"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.metadata.metrics.list":
+
+type MetadataMetricsListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: List the metadata for the metrics available to this AdSense
+// account.
+func (r *MetadataMetricsService) List() *MetadataMetricsListCall {
+	c := &MetadataMetricsListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+func (c *MetadataMetricsListCall) Do() (*Metadata, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "metadata/metrics")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Metadata)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List the metadata for the metrics available to this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.metadata.metrics.list",
+	//   "path": "metadata/metrics",
+	//   "response": {
+	//     "$ref": "Metadata"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.reports.generate":
+
+type ReportsGenerateCall struct {
+	s         *Service
+	startDate string
+	endDate   string
+	opt_      map[string]interface{}
+}
+
+// Generate: Generate an AdSense report based on the report request sent
+// in the query parameters. Returns the result as JSON; to retrieve
+// output in CSV format specify "alt=csv" as a query parameter.
+func (r *ReportsService) Generate(startDate string, endDate string) *ReportsGenerateCall {
+	c := &ReportsGenerateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.startDate = startDate
+	c.endDate = endDate
+	return c
+}
+
+// AccountId sets the optional parameter "accountId": Accounts upon
+// which to report.
+func (c *ReportsGenerateCall) AccountId(accountId string) *ReportsGenerateCall {
+	c.opt_["accountId"] = accountId
+	return c
+}
+
+// Currency sets the optional parameter "currency": Optional currency to
+// use when reporting on monetary metrics. Defaults to the account's
+// currency if not set.
+func (c *ReportsGenerateCall) Currency(currency string) *ReportsGenerateCall {
+	c.opt_["currency"] = currency
+	return c
+}
+
+// Dimension sets the optional parameter "dimension": Dimensions to base
+// the report on.
+func (c *ReportsGenerateCall) Dimension(dimension string) *ReportsGenerateCall {
+	c.opt_["dimension"] = dimension
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filters to be run on the
+// report.
+func (c *ReportsGenerateCall) Filter(filter string) *ReportsGenerateCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// Locale sets the optional parameter "locale": Optional locale to use
+// for translating report output to a local language. Defaults to
+// "en_US" if not specified.
+func (c *ReportsGenerateCall) Locale(locale string) *ReportsGenerateCall {
+	c.opt_["locale"] = locale
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of rows of report data to return.
+func (c *ReportsGenerateCall) MaxResults(maxResults int64) *ReportsGenerateCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// Metric sets the optional parameter "metric": Numeric columns to
+// include in the report.
+func (c *ReportsGenerateCall) Metric(metric string) *ReportsGenerateCall {
+	c.opt_["metric"] = metric
+	return c
+}
+
+// Sort sets the optional parameter "sort": The name of a dimension or
+// metric to sort the resulting report on, optionally prefixed with "+"
+// to sort ascending or "-" to sort descending. If no prefix is
+// specified, the column is sorted ascending.
+func (c *ReportsGenerateCall) Sort(sort string) *ReportsGenerateCall {
+	c.opt_["sort"] = sort
+	return c
+}
+
+// StartIndex sets the optional parameter "startIndex": Index of the
+// first row of report data to return.
+func (c *ReportsGenerateCall) StartIndex(startIndex int64) *ReportsGenerateCall {
+	c.opt_["startIndex"] = startIndex
+	return c
+}
+
+// UseTimezoneReporting sets the optional parameter
+// "useTimezoneReporting": Whether the report should be generated in the
+// AdSense account's local timezone. If false default PST/PDT timezone
+// will be used.
+func (c *ReportsGenerateCall) UseTimezoneReporting(useTimezoneReporting bool) *ReportsGenerateCall {
+	c.opt_["useTimezoneReporting"] = useTimezoneReporting
+	return c
+}
+
+func (c *ReportsGenerateCall) Do() (*AdsenseReportsGenerateResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("endDate", fmt.Sprintf("%v", c.endDate))
+	params.Set("startDate", fmt.Sprintf("%v", c.startDate))
+	if v, ok := c.opt_["accountId"]; ok {
+		params.Set("accountId", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["currency"]; ok {
+		params.Set("currency", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["dimension"]; ok {
+		params.Set("dimension", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["locale"]; ok {
+		params.Set("locale", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["metric"]; ok {
+		params.Set("metric", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sort"]; ok {
+		params.Set("sort", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["startIndex"]; ok {
+		params.Set("startIndex", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["useTimezoneReporting"]; ok {
+		params.Set("useTimezoneReporting", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "reports")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdsenseReportsGenerateResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Generate an AdSense report based on the report request sent in the query parameters. Returns the result as JSON; to retrieve output in CSV format specify \"alt=csv\" as a query parameter.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.reports.generate",
+	//   "parameterOrder": [
+	//     "startDate",
+	//     "endDate"
+	//   ],
+	//   "parameters": {
+	//     "accountId": {
+	//       "description": "Accounts upon which to report.",
+	//       "location": "query",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "currency": {
+	//       "description": "Optional currency to use when reporting on monetary metrics. Defaults to the account's currency if not set.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z]+",
+	//       "type": "string"
+	//     },
+	//     "dimension": {
+	//       "description": "Dimensions to base the report on.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "endDate": {
+	//       "description": "End of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+	//       "location": "query",
+	//       "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "filter": {
+	//       "description": "Filters to be run on the report.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+(==|=@).+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "locale": {
+	//       "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of rows of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "50000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "metric": {
+	//       "description": "Numeric columns to include in the report.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "sort": {
+	//       "description": "The name of a dimension or metric to sort the resulting report on, optionally prefixed with \"+\" to sort ascending or \"-\" to sort descending. If no prefix is specified, the column is sorted ascending.",
+	//       "location": "query",
+	//       "pattern": "(\\+|-)?[a-zA-Z_]+",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
+	//     "startDate": {
+	//       "description": "Start of the date range to report on in \"YYYY-MM-DD\" format, inclusive.",
+	//       "location": "query",
+	//       "pattern": "\\d{4}-\\d{2}-\\d{2}|(today|startOfMonth|startOfYear)(([\\-\\+]\\d+[dwmy]){0,2}?)",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "startIndex": {
+	//       "description": "Index of the first row of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "5000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "useTimezoneReporting": {
+	//       "description": "Whether the report should be generated in the AdSense account's local timezone. If false default PST/PDT timezone will be used.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     }
+	//   },
+	//   "path": "reports",
+	//   "response": {
+	//     "$ref": "AdsenseReportsGenerateResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ],
+	//   "supportsMediaDownload": true
+	// }
+
+}
+
+// method id "adsense.reports.saved.generate":
+
+type ReportsSavedGenerateCall struct {
+	s             *Service
+	savedReportId string
+	opt_          map[string]interface{}
+}
+
+// Generate: Generate an AdSense report based on the saved report ID
+// sent in the query parameters.
+func (r *ReportsSavedService) Generate(savedReportId string) *ReportsSavedGenerateCall {
+	c := &ReportsSavedGenerateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.savedReportId = savedReportId
+	return c
+}
+
+// Locale sets the optional parameter "locale": Optional locale to use
+// for translating report output to a local language. Defaults to
+// "en_US" if not specified.
+func (c *ReportsSavedGenerateCall) Locale(locale string) *ReportsSavedGenerateCall {
+	c.opt_["locale"] = locale
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of rows of report data to return.
+func (c *ReportsSavedGenerateCall) MaxResults(maxResults int64) *ReportsSavedGenerateCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// StartIndex sets the optional parameter "startIndex": Index of the
+// first row of report data to return.
+func (c *ReportsSavedGenerateCall) StartIndex(startIndex int64) *ReportsSavedGenerateCall {
+	c.opt_["startIndex"] = startIndex
+	return c
+}
+
+func (c *ReportsSavedGenerateCall) Do() (*AdsenseReportsGenerateResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["locale"]; ok {
+		params.Set("locale", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["startIndex"]; ok {
+		params.Set("startIndex", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "reports/{savedReportId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedReportId}", url.QueryEscape(c.savedReportId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AdsenseReportsGenerateResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Generate an AdSense report based on the saved report ID sent in the query parameters.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.reports.saved.generate",
+	//   "parameterOrder": [
+	//     "savedReportId"
+	//   ],
+	//   "parameters": {
+	//     "locale": {
+	//       "description": "Optional locale to use for translating report output to a local language. Defaults to \"en_US\" if not specified.",
+	//       "location": "query",
+	//       "pattern": "[a-zA-Z_]+",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of rows of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "50000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "savedReportId": {
+	//       "description": "The saved report to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "startIndex": {
+	//       "description": "Index of the first row of report data to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "5000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     }
+	//   },
+	//   "path": "reports/{savedReportId}",
+	//   "response": {
+	//     "$ref": "AdsenseReportsGenerateResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.reports.saved.list":
+
+type ReportsSavedListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: List all saved reports in this AdSense account.
+func (r *ReportsSavedService) List() *ReportsSavedListCall {
+	c := &ReportsSavedListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of saved reports to include in the response, used for paging.
+func (c *ReportsSavedListCall) MaxResults(maxResults int64) *ReportsSavedListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through saved reports. To retrieve the next page,
+// set this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *ReportsSavedListCall) PageToken(pageToken string) *ReportsSavedListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *ReportsSavedListCall) Do() (*SavedReports, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "reports/saved")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SavedReports)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all saved reports in this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.reports.saved.list",
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "The maximum number of saved reports to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through saved reports. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "reports/saved",
+	//   "response": {
+	//     "$ref": "SavedReports"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.savedadstyles.get":
+
+type SavedadstylesGetCall struct {
+	s              *Service
+	savedAdStyleId string
+	opt_           map[string]interface{}
+}
+
+// Get: Get a specific saved ad style from the user's account.
+func (r *SavedadstylesService) Get(savedAdStyleId string) *SavedadstylesGetCall {
+	c := &SavedadstylesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.savedAdStyleId = savedAdStyleId
+	return c
+}
+
+func (c *SavedadstylesGetCall) Do() (*SavedAdStyle, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "savedadstyles/{savedAdStyleId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{savedAdStyleId}", url.QueryEscape(c.savedAdStyleId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SavedAdStyle)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Get a specific saved ad style from the user's account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.savedadstyles.get",
+	//   "parameterOrder": [
+	//     "savedAdStyleId"
+	//   ],
+	//   "parameters": {
+	//     "savedAdStyleId": {
+	//       "description": "Saved ad style to retrieve.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "savedadstyles/{savedAdStyleId}",
+	//   "response": {
+	//     "$ref": "SavedAdStyle"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.savedadstyles.list":
+
+type SavedadstylesListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: List all saved ad styles in the user's account.
+func (r *SavedadstylesService) List() *SavedadstylesListCall {
+	c := &SavedadstylesListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of saved ad styles to include in the response, used for
+// paging.
+func (c *SavedadstylesListCall) MaxResults(maxResults int64) *SavedadstylesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through saved ad styles. To retrieve the next
+// page, set this parameter to the value of "nextPageToken" from the
+// previous response.
+func (c *SavedadstylesListCall) PageToken(pageToken string) *SavedadstylesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *SavedadstylesListCall) Do() (*SavedAdStyles, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "savedadstyles")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SavedAdStyles)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all saved ad styles in the user's account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.savedadstyles.list",
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "The maximum number of saved ad styles to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through saved ad styles. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "savedadstyles",
+	//   "response": {
+	//     "$ref": "SavedAdStyles"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "adsense.urlchannels.list":
+
+type UrlchannelsListCall struct {
+	s          *Service
+	adClientId string
+	opt_       map[string]interface{}
+}
+
+// List: List all URL channels in the specified ad client for this
+// AdSense account.
+func (r *UrlchannelsService) List(adClientId string) *UrlchannelsListCall {
+	c := &UrlchannelsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.adClientId = adClientId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of URL channels to include in the response, used for paging.
+func (c *UrlchannelsListCall) MaxResults(maxResults int64) *UrlchannelsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A continuation
+// token, used to page through URL channels. To retrieve the next page,
+// set this parameter to the value of "nextPageToken" from the previous
+// response.
+func (c *UrlchannelsListCall) PageToken(pageToken string) *UrlchannelsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *UrlchannelsListCall) Do() (*UrlChannels, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1.3/", "adclients/{adClientId}/urlchannels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UrlChannels)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List all URL channels in the specified ad client for this AdSense account.",
+	//   "httpMethod": "GET",
+	//   "id": "adsense.urlchannels.list",
+	//   "parameterOrder": [
+	//     "adClientId"
+	//   ],
+	//   "parameters": {
+	//     "adClientId": {
+	//       "description": "Ad client for which to list URL channels.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "The maximum number of URL channels to include in the response, used for paging.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10000",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A continuation token, used to page through URL channels. To retrieve the next page, set this parameter to the value of \"nextPageToken\" from the previous response.",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "adclients/{adClientId}/urlchannels",
+	//   "response": {
+	//     "$ref": "UrlChannels"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/adsense",
+	//     "https://www.googleapis.com/auth/adsense.readonly"
+	//   ]
+	// }
+
+}
diff --git a/adsense/v1/adsense-api.json b/adsense/v1/adsense-api.json
index a0a9e0b..182d868 100644
--- a/adsense/v1/adsense-api.json
+++ b/adsense/v1/adsense-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/W2JyDkkedieO5Gqh979WmCdINb4\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/PtCDkhKcpJH2CiLQTCceqANWIng\"",
  "discoveryVersion": "v1",
  "id": "adsense:v1",
  "name": "adsense",
  "canonicalName": "AdSense",
  "version": "v1",
- "revision": "20130411",
+ "revision": "20130605",
  "title": "AdSense Management API",
  "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/adsense-16.png",
   "x32": "http://www.google.com/images/icons/product/adsense-32.png"
diff --git a/adsense/v1/adsense-gen.go b/adsense/v1/adsense-gen.go
index 2d2c487..97ad69f 100644
--- a/adsense/v1/adsense-gen.go
+++ b/adsense/v1/adsense-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adsense:v1"
 const apiName = "adsense"
@@ -346,11 +349,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1/", "adclients")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -443,14 +448,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1/", "adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -548,14 +555,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -716,11 +725,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1/", "reports")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -864,14 +875,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsense/v1/", "adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -919,12 +932,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/adsensehost/v4.1/adsensehost-api.json b/adsensehost/v4.1/adsensehost-api.json
index 8ce17e2..02be4c5 100644
--- a/adsensehost/v4.1/adsensehost-api.json
+++ b/adsensehost/v4.1/adsensehost-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/UKRrTSA6OTIiZ0cWS5SiZhIX8ws\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/ySd3oIJbOJH9tFYQ1DypV3IeU6E\"",
  "discoveryVersion": "v1",
  "id": "adsensehost:v4.1",
  "name": "adsensehost",
  "canonicalName": "AdSense Host",
  "version": "v4.1",
- "revision": "20130411",
+ "revision": "20130605",
  "title": "AdSense Host API",
  "description": "Gives AdSense Hosts access to report generation, ad code generation, and publisher management capabilities.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/adsense-16.png",
   "x32": "http://www.google.com/images/icons/product/adsense-32.png"
diff --git a/adsensehost/v4.1/adsensehost-gen.go b/adsensehost/v4.1/adsensehost-gen.go
index 56b8416..723e0d0 100644
--- a/adsensehost/v4.1/adsensehost-gen.go
+++ b/adsensehost/v4.1/adsensehost-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "adsensehost:v4.1"
 const apiName = "adsensehost"
@@ -541,14 +544,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -609,11 +614,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -672,15 +679,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -764,14 +773,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -844,16 +855,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -926,16 +939,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1019,16 +1034,18 @@
 		params.Set("hostCustomChannelId", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{adUnitId}", cleanPathString(c.adUnitId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adUnitId}", url.QueryEscape(c.adUnitId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1113,16 +1130,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1221,15 +1240,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1322,16 +1343,18 @@
 	params.Set("alt", "json")
 	params.Set("adUnitId", fmt.Sprintf("%v", c.adUnitId))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1413,16 +1436,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/adclients/{adClientId}/adunits")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1568,14 +1593,16 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "accounts/{accountId}/reports")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1697,14 +1724,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1781,11 +1810,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1873,11 +1904,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "associationsessions/start")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1968,11 +2001,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "associationsessions/verify")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2030,15 +2065,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/customchannels/{customChannelId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2102,15 +2139,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/customchannels/{customChannelId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{customChannelId}", cleanPathString(c.customChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customChannelId}", url.QueryEscape(c.customChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2179,15 +2218,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2268,14 +2309,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2354,15 +2397,17 @@
 	params.Set("alt", "json")
 	params.Set("customChannelId", fmt.Sprintf("%v", c.customChannelId))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2434,15 +2479,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/customchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2581,11 +2628,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "reports")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2701,15 +2750,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/urlchannels/{urlChannelId}")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
-	urls = strings.Replace(urls, "{urlChannelId}", cleanPathString(c.urlChannelId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{urlChannelId}", url.QueryEscape(c.urlChannelId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2778,15 +2829,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2866,14 +2919,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/adsensehost/v4.1/", "adclients/{adClientId}/urlchannels")
-	urls = strings.Replace(urls, "{adClientId}", cleanPathString(c.adClientId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{adClientId}", url.QueryEscape(c.adClientId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2920,12 +2975,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/analytics/v2.4/analytics-api.json b/analytics/v2.4/analytics-api.json
index aa425e6..115255e 100644
--- a/analytics/v2.4/analytics-api.json
+++ b/analytics/v2.4/analytics-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/P4HUtmcSawnQeRF0bYW9jB-hXVk\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/cERyw9WTzlGNpi8J-92RVpYIgvA\"",
  "discoveryVersion": "v1",
  "id": "analytics:v2.4",
  "name": "analytics",
  "version": "v2.4",
- "revision": "20130404",
+ "revision": "20130516",
  "title": "Google Analytics API",
  "description": "View and manage your Google Analytics data",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/analytics-16.png",
   "x32": "http://www.google.com/images/icons/product/analytics-32.png"
diff --git a/analytics/v2.4/analytics-gen.go b/analytics/v2.4/analytics-gen.go
index dfb52da..c37ad8d 100644
--- a/analytics/v2.4/analytics-gen.go
+++ b/analytics/v2.4/analytics-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "analytics:v2.4"
 const apiName = "analytics"
@@ -236,11 +239,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v2.4/", "data")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -371,11 +376,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v2.4/", "management/accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -453,16 +460,18 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v2.4/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -561,15 +570,17 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v2.4/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -659,11 +670,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v2.4/", "management/segments")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -737,14 +750,16 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v2.4/", "management/accounts/{accountId}/webproperties")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -785,12 +800,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/analytics/v3/analytics-api.json b/analytics/v3/analytics-api.json
index a87a324..fbb7155 100644
--- a/analytics/v3/analytics-api.json
+++ b/analytics/v3/analytics-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/T8OXFhyutidIsEPE3tLBNhfkGsE\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/_leRpUPO5YQPQnkMTbOkhQsK3Xc\"",
  "discoveryVersion": "v1",
  "id": "analytics:v3",
  "name": "analytics",
  "version": "v3",
- "revision": "20130404",
+ "revision": "20130516",
  "title": "Google Analytics API",
  "description": "View and manage your Google Analytics data",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/analytics-16.png",
   "x32": "http://www.google.com/images/icons/product/analytics-32.png"
@@ -235,6 +237,7 @@
     },
     "profilesLinked": {
      "type": "array",
+     "description": "IDs of profiles linked to the custom data source.",
      "items": {
       "type": "string"
      }
@@ -359,10 +362,12 @@
       "type": "object",
       "properties": {
        "change": {
-        "type": "string"
+        "type": "string",
+        "description": "The type of change: APPEND, RESET, or DELETE."
        },
        "time": {
         "type": "string",
+        "description": "The time when the change occurred.",
         "format": "date-time"
        }
       }
@@ -1321,7 +1326,7 @@
     },
     "eCommerceTracking": {
      "type": "boolean",
-     "description": "E-commerce tracking parameter for this profile."
+     "description": "Indicates whether ecommerce tracking is enabled for this profile."
     },
     "excludeQueryParameters": {
      "type": "string",
@@ -1607,6 +1612,11 @@
      "type": "string",
      "description": "Web property ID of the form UA-XXXXX-YY."
     },
+    "industryVertical": {
+     "type": "string",
+     "description": "The industry vertical/category selected for this web property.",
+     "readOnly": true
+    },
     "internalWebPropertyId": {
      "type": "string",
      "description": "Internal ID for this web property."
@@ -1616,6 +1626,10 @@
      "description": "Resource type for Analytics WebProperty.",
      "default": "analytics#webproperty"
     },
+    "level": {
+     "type": "string",
+     "description": "Level for this web property. Possible values are STANDARD or PREMIUM."
+    },
     "name": {
      "type": "string",
      "description": "Name of this web property."
@@ -1635,6 +1649,12 @@
       }
      }
     },
+    "profileCount": {
+     "type": "integer",
+     "description": "Profile count for this web property.",
+     "format": "int32",
+     "readOnly": true
+    },
     "selfLink": {
      "type": "string",
      "description": "Link for this web property."
diff --git a/analytics/v3/analytics-gen.go b/analytics/v3/analytics-gen.go
index 6830bbf..ce68ed8 100644
--- a/analytics/v3/analytics-gen.go
+++ b/analytics/v3/analytics-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "analytics:v3"
 const apiName = "analytics"
@@ -291,6 +294,7 @@
 	// web property to which this custom data source belongs.
 	ParentLink *CustomDataSourceParentLink `json:"parentLink,omitempty"`
 
+	// ProfilesLinked: IDs of profiles linked to the custom data source.
 	ProfilesLinked []string `json:"profilesLinked,omitempty"`
 
 	// SelfLink: Link for this Analytics custom data source.
@@ -401,8 +405,10 @@
 }
 
 type DailyUploadRecentChanges struct {
+	// Change: The type of change: APPEND, RESET, or DELETE.
 	Change string `json:"change,omitempty"`
 
+	// Time: The time when the change occurred.
 	Time string `json:"time,omitempty"`
 }
 
@@ -1128,7 +1134,8 @@
 	// DefaultPage: Default page for this profile.
 	DefaultPage string `json:"defaultPage,omitempty"`
 
-	// ECommerceTracking: E-commerce tracking parameter for this profile.
+	// ECommerceTracking: Indicates whether ecommerce tracking is enabled
+	// for this profile.
 	ECommerceTracking bool `json:"eCommerceTracking,omitempty"`
 
 	// ExcludeQueryParameters: The query parameters that are excluded from
@@ -1331,12 +1338,20 @@
 	// Id: Web property ID of the form UA-XXXXX-YY.
 	Id string `json:"id,omitempty"`
 
+	// IndustryVertical: The industry vertical/category selected for this
+	// web property.
+	IndustryVertical string `json:"industryVertical,omitempty"`
+
 	// InternalWebPropertyId: Internal ID for this web property.
 	InternalWebPropertyId string `json:"internalWebPropertyId,omitempty"`
 
 	// Kind: Resource type for Analytics WebProperty.
 	Kind string `json:"kind,omitempty"`
 
+	// Level: Level for this web property. Possible values are STANDARD or
+	// PREMIUM.
+	Level string `json:"level,omitempty"`
+
 	// Name: Name of this web property.
 	Name string `json:"name,omitempty"`
 
@@ -1344,6 +1359,9 @@
 	// to which this web property belongs.
 	ParentLink *WebpropertyParentLink `json:"parentLink,omitempty"`
 
+	// ProfileCount: Profile count for this web property.
+	ProfileCount int64 `json:"profileCount,omitempty"`
+
 	// SelfLink: Link for this web property.
 	SelfLink string `json:"selfLink,omitempty"`
 
@@ -1465,11 +1483,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "data/ga")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1651,11 +1671,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "data/mcf")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1788,11 +1810,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1875,15 +1899,17 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1971,17 +1997,19 @@
 	params.Set("alt", "json")
 	params.Set("type", fmt.Sprintf("%v", c.type_))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{customDataSourceId}", cleanPathString(c.customDataSourceId), 1)
-	urls = strings.Replace(urls, "{date}", cleanPathString(c.date), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customDataSourceId}", url.QueryEscape(c.customDataSourceId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{date}", url.QueryEscape(c.date), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2097,16 +2125,18 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{customDataSourceId}", cleanPathString(c.customDataSourceId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customDataSourceId}", url.QueryEscape(c.customDataSourceId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2241,15 +2271,16 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{customDataSourceId}", cleanPathString(c.customDataSourceId), 1)
-	urls = strings.Replace(urls, "{date}", cleanPathString(c.date), 1)
 	urls += "?" + params.Encode()
 	body = new(bytes.Buffer)
 	ctype := "application/json"
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customDataSourceId}", url.QueryEscape(c.customDataSourceId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{date}", url.QueryEscape(c.date), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -2259,6 +2290,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2389,17 +2421,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
-	urls = strings.Replace(urls, "{experimentId}", cleanPathString(c.experimentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{experimentId}", url.QueryEscape(c.experimentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2474,17 +2508,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
-	urls = strings.Replace(urls, "{experimentId}", cleanPathString(c.experimentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{experimentId}", url.QueryEscape(c.experimentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2572,17 +2608,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2679,16 +2717,18 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2788,18 +2828,20 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
-	urls = strings.Replace(urls, "{experimentId}", cleanPathString(c.experimentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{experimentId}", url.QueryEscape(c.experimentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2891,18 +2933,20 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
-	urls = strings.Replace(urls, "{experimentId}", cleanPathString(c.experimentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{experimentId}", url.QueryEscape(c.experimentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3006,16 +3050,18 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
-	urls = strings.Replace(urls, "{profileId}", cleanPathString(c.profileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", url.QueryEscape(c.profileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3121,15 +3167,17 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
-	urls = strings.Replace(urls, "{webPropertyId}", cleanPathString(c.webPropertyId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{webPropertyId}", url.QueryEscape(c.webPropertyId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3226,11 +3274,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/segments")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3311,14 +3361,16 @@
 		params.Set("start-index", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/analytics/v3/", "management/accounts/{accountId}/webproperties")
-	urls = strings.Replace(urls, "{accountId}", cleanPathString(c.accountId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", url.QueryEscape(c.accountId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3366,12 +3418,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/androidpublisher/v1.1/androidpublisher-api.json b/androidpublisher/v1.1/androidpublisher-api.json
new file mode 100644
index 0000000..375b58a
--- /dev/null
+++ b/androidpublisher/v1.1/androidpublisher-api.json
@@ -0,0 +1,238 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/7oboFBZ6PdaMhtxsW3J1p7D1DcQ\"",
+ "discoveryVersion": "v1",
+ "id": "androidpublisher:v1.1",
+ "name": "androidpublisher",
+ "canonicalName": "Android Publisher",
+ "version": "v1.1",
+ "revision": "20130610",
+ "title": "Google Play Android Developer API",
+ "description": "Lets Android application developers access their Google Play accounts.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/android-16.png",
+  "x32": "http://www.google.com/images/icons/product/android-32.png"
+ },
+ "documentationLink": "https://developers.google.com/android-publisher",
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/androidpublisher/v1.1/applications/",
+ "basePath": "/androidpublisher/v1.1/applications/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "androidpublisher/v1.1/applications/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "schemas": {
+  "InappPurchase": {
+   "id": "InappPurchase",
+   "type": "object",
+   "description": "A Purchase resource indicates the status of a user's subscription purchase.",
+   "properties": {
+    "consumptionState": {
+     "type": "integer",
+     "description": "The consumption state of the inapp product. Possible values are:  \n- - Consumed \n- - Yet to be consumed",
+     "format": "int32"
+    },
+    "developerPayload": {
+     "type": "string",
+     "description": "A developer-specified string that contains supplemental information about an order."
+    },
+    "kind": {
+     "type": "string",
+     "description": "This kind represents a inappPurchase object in the androidpublisher service.",
+     "default": "androidpublisher#inappPurchase"
+    },
+    "purchaseState": {
+     "type": "integer",
+     "description": "The purchase state of the order. Possible values are:  \n- - Purchased \n- - Cancelled",
+     "format": "int32"
+    },
+    "purchaseTime": {
+     "type": "string",
+     "description": "The time the product was purchased, in milliseconds since the epoch (Jan 1, 1970).",
+     "format": "int64"
+    }
+   }
+  },
+  "SubscriptionPurchase": {
+   "id": "SubscriptionPurchase",
+   "type": "object",
+   "description": "A Purchase resource indicates the status of a user's subscription purchase.",
+   "properties": {
+    "autoRenewing": {
+     "type": "boolean",
+     "description": "Whether the subscription will automatically be renewed when it reaches its current expiry time."
+    },
+    "initiationTimestampMsec": {
+     "type": "string",
+     "description": "Time at which the subscription was granted, in milliseconds since Epoch.",
+     "format": "int64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "This kind represents a subscriptionPurchase object in the androidpublisher service.",
+     "default": "androidpublisher#subscriptionPurchase"
+    },
+    "validUntilTimestampMsec": {
+     "type": "string",
+     "description": "Time at which the subscription will expire, in milliseconds since Epoch.",
+     "format": "int64"
+    }
+   }
+  }
+ },
+ "resources": {
+  "inapppurchases": {
+   "methods": {
+    "get": {
+     "id": "androidpublisher.inapppurchases.get",
+     "path": "{packageName}/inapp/{productId}/purchases/{token}",
+     "httpMethod": "GET",
+     "description": "Checks the purchase and consumption status of an inapp item.",
+     "parameters": {
+      "packageName": {
+       "type": "string",
+       "description": "The package name of the application the inapp product was sold in (for example, 'com.some.thing').",
+       "required": true,
+       "location": "path"
+      },
+      "productId": {
+       "type": "string",
+       "description": "The inapp product SKU (for example, 'com.some.thing.inapp1').",
+       "required": true,
+       "location": "path"
+      },
+      "token": {
+       "type": "string",
+       "description": "The token provided to the user's device when the inapp product was purchased.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "packageName",
+      "productId",
+      "token"
+     ],
+     "response": {
+      "$ref": "InappPurchase"
+     }
+    }
+   }
+  },
+  "purchases": {
+   "methods": {
+    "cancel": {
+     "id": "androidpublisher.purchases.cancel",
+     "path": "{packageName}/subscriptions/{subscriptionId}/purchases/{token}/cancel",
+     "httpMethod": "POST",
+     "description": "Cancels a user's subscription purchase. The subscription remains valid until its expiration time.",
+     "parameters": {
+      "packageName": {
+       "type": "string",
+       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+       "required": true,
+       "location": "path"
+      },
+      "subscriptionId": {
+       "type": "string",
+       "description": "The purchased subscription ID (for example, 'monthly001').",
+       "required": true,
+       "location": "path"
+      },
+      "token": {
+       "type": "string",
+       "description": "The token provided to the user's device when the subscription was purchased.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "packageName",
+      "subscriptionId",
+      "token"
+     ]
+    },
+    "get": {
+     "id": "androidpublisher.purchases.get",
+     "path": "{packageName}/subscriptions/{subscriptionId}/purchases/{token}",
+     "httpMethod": "GET",
+     "description": "Checks whether a user's subscription purchase is valid and returns its expiry time.",
+     "parameters": {
+      "packageName": {
+       "type": "string",
+       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+       "required": true,
+       "location": "path"
+      },
+      "subscriptionId": {
+       "type": "string",
+       "description": "The purchased subscription ID (for example, 'monthly001').",
+       "required": true,
+       "location": "path"
+      },
+      "token": {
+       "type": "string",
+       "description": "The token provided to the user's device when the subscription was purchased.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "packageName",
+      "subscriptionId",
+      "token"
+     ],
+     "response": {
+      "$ref": "SubscriptionPurchase"
+     }
+    }
+   }
+  }
+ }
+}
diff --git a/androidpublisher/v1.1/androidpublisher-gen.go b/androidpublisher/v1.1/androidpublisher-gen.go
new file mode 100644
index 0000000..52f3c12
--- /dev/null
+++ b/androidpublisher/v1.1/androidpublisher-gen.go
@@ -0,0 +1,358 @@
+// Package androidpublisher provides access to the Google Play Android Developer API.
+//
+// See https://developers.google.com/android-publisher
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/androidpublisher/v1.1"
+//   ...
+//   androidpublisherService, err := androidpublisher.New(oauthHttpClient)
+package androidpublisher
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "androidpublisher:v1.1"
+const apiName = "androidpublisher"
+const apiVersion = "v1.1"
+const basePath = "https://www.googleapis.com/androidpublisher/v1.1/applications/"
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.Inapppurchases = NewInapppurchasesService(s)
+	s.Purchases = NewPurchasesService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	Inapppurchases *InapppurchasesService
+
+	Purchases *PurchasesService
+}
+
+func NewInapppurchasesService(s *Service) *InapppurchasesService {
+	rs := &InapppurchasesService{s: s}
+	return rs
+}
+
+type InapppurchasesService struct {
+	s *Service
+}
+
+func NewPurchasesService(s *Service) *PurchasesService {
+	rs := &PurchasesService{s: s}
+	return rs
+}
+
+type PurchasesService struct {
+	s *Service
+}
+
+type InappPurchase struct {
+	// ConsumptionState: The consumption state of the inapp product.
+	// Possible values are:
+	// - - Consumed
+	// - - Yet to be consumed
+	ConsumptionState int64 `json:"consumptionState,omitempty"`
+
+	// DeveloperPayload: A developer-specified string that contains
+	// supplemental information about an order.
+	DeveloperPayload string `json:"developerPayload,omitempty"`
+
+	// Kind: This kind represents a inappPurchase object in the
+	// androidpublisher service.
+	Kind string `json:"kind,omitempty"`
+
+	// PurchaseState: The purchase state of the order. Possible values are:
+	//
+	// - - Purchased
+	// - - Cancelled
+	PurchaseState int64 `json:"purchaseState,omitempty"`
+
+	// PurchaseTime: The time the product was purchased, in milliseconds
+	// since the epoch (Jan 1, 1970).
+	PurchaseTime int64 `json:"purchaseTime,omitempty,string"`
+}
+
+type SubscriptionPurchase struct {
+	// AutoRenewing: Whether the subscription will automatically be renewed
+	// when it reaches its current expiry time.
+	AutoRenewing bool `json:"autoRenewing,omitempty"`
+
+	// InitiationTimestampMsec: Time at which the subscription was granted,
+	// in milliseconds since Epoch.
+	InitiationTimestampMsec int64 `json:"initiationTimestampMsec,omitempty,string"`
+
+	// Kind: This kind represents a subscriptionPurchase object in the
+	// androidpublisher service.
+	Kind string `json:"kind,omitempty"`
+
+	// ValidUntilTimestampMsec: Time at which the subscription will expire,
+	// in milliseconds since Epoch.
+	ValidUntilTimestampMsec int64 `json:"validUntilTimestampMsec,omitempty,string"`
+}
+
+// method id "androidpublisher.inapppurchases.get":
+
+type InapppurchasesGetCall struct {
+	s           *Service
+	packageName string
+	productId   string
+	token       string
+	opt_        map[string]interface{}
+}
+
+// Get: Checks the purchase and consumption status of an inapp item.
+func (r *InapppurchasesService) Get(packageName string, productId string, token string) *InapppurchasesGetCall {
+	c := &InapppurchasesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.packageName = packageName
+	c.productId = productId
+	c.token = token
+	return c
+}
+
+func (c *InapppurchasesGetCall) Do() (*InappPurchase, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/androidpublisher/v1.1/applications/", "{packageName}/inapp/{productId}/purchases/{token}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{packageName}", url.QueryEscape(c.packageName), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{token}", url.QueryEscape(c.token), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InappPurchase)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Checks the purchase and consumption status of an inapp item.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.inapppurchases.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "productId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application the inapp product was sold in (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "productId": {
+	//       "description": "The inapp product SKU (for example, 'com.some.thing.inapp1').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the inapp product was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/inapp/{productId}/purchases/{token}",
+	//   "response": {
+	//     "$ref": "InappPurchase"
+	//   }
+	// }
+
+}
+
+// method id "androidpublisher.purchases.cancel":
+
+type PurchasesCancelCall struct {
+	s              *Service
+	packageName    string
+	subscriptionId string
+	token          string
+	opt_           map[string]interface{}
+}
+
+// Cancel: Cancels a user's subscription purchase. The subscription
+// remains valid until its expiration time.
+func (r *PurchasesService) Cancel(packageName string, subscriptionId string, token string) *PurchasesCancelCall {
+	c := &PurchasesCancelCall{s: r.s, opt_: make(map[string]interface{})}
+	c.packageName = packageName
+	c.subscriptionId = subscriptionId
+	c.token = token
+	return c
+}
+
+func (c *PurchasesCancelCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/androidpublisher/v1.1/applications/", "{packageName}/subscriptions/{subscriptionId}/purchases/{token}/cancel")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{packageName}", url.QueryEscape(c.packageName), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{token}", url.QueryEscape(c.token), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Cancels a user's subscription purchase. The subscription remains valid until its expiration time.",
+	//   "httpMethod": "POST",
+	//   "id": "androidpublisher.purchases.cancel",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "subscriptionId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "subscriptionId": {
+	//       "description": "The purchased subscription ID (for example, 'monthly001').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the subscription was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/subscriptions/{subscriptionId}/purchases/{token}/cancel"
+	// }
+
+}
+
+// method id "androidpublisher.purchases.get":
+
+type PurchasesGetCall struct {
+	s              *Service
+	packageName    string
+	subscriptionId string
+	token          string
+	opt_           map[string]interface{}
+}
+
+// Get: Checks whether a user's subscription purchase is valid and
+// returns its expiry time.
+func (r *PurchasesService) Get(packageName string, subscriptionId string, token string) *PurchasesGetCall {
+	c := &PurchasesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.packageName = packageName
+	c.subscriptionId = subscriptionId
+	c.token = token
+	return c
+}
+
+func (c *PurchasesGetCall) Do() (*SubscriptionPurchase, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/androidpublisher/v1.1/applications/", "{packageName}/subscriptions/{subscriptionId}/purchases/{token}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{packageName}", url.QueryEscape(c.packageName), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{token}", url.QueryEscape(c.token), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SubscriptionPurchase)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Checks whether a user's subscription purchase is valid and returns its expiry time.",
+	//   "httpMethod": "GET",
+	//   "id": "androidpublisher.purchases.get",
+	//   "parameterOrder": [
+	//     "packageName",
+	//     "subscriptionId",
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "packageName": {
+	//       "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "subscriptionId": {
+	//       "description": "The purchased subscription ID (for example, 'monthly001').",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "token": {
+	//       "description": "The token provided to the user's device when the subscription was purchased.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{packageName}/subscriptions/{subscriptionId}/purchases/{token}",
+	//   "response": {
+	//     "$ref": "SubscriptionPurchase"
+	//   }
+	// }
+
+}
diff --git a/androidpublisher/v1/androidpublisher-api.json b/androidpublisher/v1/androidpublisher-api.json
index b274b87..ce4a56a 100644
--- a/androidpublisher/v1/androidpublisher-api.json
+++ b/androidpublisher/v1/androidpublisher-api.json
@@ -1,13 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/GtPQFgpLdpH448C18uk-K20eQks\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/9vBeugy3koKjDJnOzZhCsk8QxwM\"",
  "discoveryVersion": "v1",
  "id": "androidpublisher:v1",
  "name": "androidpublisher",
+ "canonicalName": "Android Publisher",
  "version": "v1",
- "revision": "20130412",
+ "revision": "20130610",
  "title": "Google Play Android Developer API",
  "description": "Lets Android application developers access their Google Play accounts.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/android-16.png",
   "x32": "http://www.google.com/images/icons/product/android-32.png"
diff --git a/androidpublisher/v1/androidpublisher-gen.go b/androidpublisher/v1/androidpublisher-gen.go
index fddb3dc..ad6adab 100644
--- a/androidpublisher/v1/androidpublisher-gen.go
+++ b/androidpublisher/v1/androidpublisher-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "androidpublisher:v1"
 const apiName = "androidpublisher"
@@ -103,16 +106,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/androidpublisher/v1/applications/", "{packageName}/subscriptions/{subscriptionId}/purchases/{token}/cancel")
-	urls = strings.Replace(urls, "{packageName}", cleanPathString(c.packageName), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
-	urls = strings.Replace(urls, "{token}", cleanPathString(c.token), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{packageName}", url.QueryEscape(c.packageName), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{token}", url.QueryEscape(c.token), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -176,16 +181,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/androidpublisher/v1/applications/", "{packageName}/subscriptions/{subscriptionId}/purchases/{token}")
-	urls = strings.Replace(urls, "{packageName}", cleanPathString(c.packageName), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
-	urls = strings.Replace(urls, "{token}", cleanPathString(c.token), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{packageName}", url.QueryEscape(c.packageName), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{token}", url.QueryEscape(c.token), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -230,12 +237,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/audit/v1/audit-api.json b/audit/v1/audit-api.json
index 93ecf2a..c338869 100644
--- a/audit/v1/audit-api.json
+++ b/audit/v1/audit-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/pRqLDJWspXWugHaPswYs8GqtG74\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/WETM6oPOB_u6tVJCuBP1DDIWlEg\"",
  "discoveryVersion": "v1",
  "id": "audit:v1",
  "name": "audit",
@@ -8,6 +8,8 @@
  "revision": "20130108",
  "title": "Enterprise Audit API",
  "description": "Lets you access user activities in your enterprise made through various applications.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/audit/v1/audit-gen.go b/audit/v1/audit-gen.go
index 36736b7..ac9cfd0 100644
--- a/audit/v1/audit-gen.go
+++ b/audit/v1/audit-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "audit:v1"
 const apiName = "audit"
@@ -254,15 +257,17 @@
 		params.Set("startTime", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reporting/audit/v1/", "{customerId}/{applicationId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{applicationId}", strconv.FormatInt(c.applicationId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{applicationId}", strconv.FormatInt(c.applicationId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -359,12 +364,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/bigquery/v2/bigquery-api.json b/bigquery/v2/bigquery-api.json
index ee494ed..e0005ce 100644
--- a/bigquery/v2/bigquery-api.json
+++ b/bigquery/v2/bigquery-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/emS2GNIl_c-LGa5TS3ajAbBWSVo\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/IQOfEDnWFAg_eI81by1rSHAw6oc\"",
  "discoveryVersion": "v1",
  "id": "bigquery:v2",
  "name": "bigquery",
  "version": "v2",
- "revision": "20130412",
+ "revision": "20130606",
  "title": "BigQuery API",
  "description": "A data platform for customers to create, manage, share and query data.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -72,6 +74,9 @@
     "https://www.googleapis.com/auth/bigquery": {
      "description": "View and manage your data in Google BigQuery"
     },
+    "https://www.googleapis.com/auth/cloud-platform": {
+     "description": "MESSAGE UNDER CONSTRUCTION View and manage your data across Google Cloud Platform services"
+    },
     "https://www.googleapis.com/auth/devstorage.full_control": {
      "description": "Manage your data and permissions in Google Cloud Storage"
     },
@@ -254,6 +259,10 @@
    "id": "GetQueryResultsResponse",
    "type": "object",
    "properties": {
+    "cacheHit": {
+     "type": "boolean",
+     "description": "Whether the query result was fetched from the query cache."
+    },
     "etag": {
      "type": "string",
      "description": "A hash of this response."
@@ -417,6 +426,10 @@
    "id": "JobConfigurationLoad",
    "type": "object",
    "properties": {
+    "allowJaggedRows": {
+     "type": "boolean",
+     "description": "[Optional] Accept rows that are missing trailing optional columns. The missing values are treated as nulls. Default is false which treats short rows as errors. Only applicable to CSV, ignored for other formats."
+    },
     "allowQuotedNewlines": {
      "type": "boolean",
      "description": "Indicates if BigQuery should allow quoted data sections that contain newline characters in a CSV file. The default value is false."
@@ -512,6 +525,10 @@
      "type": "string",
      "description": "[Required] BigQuery SQL query to execute."
     },
+    "useQueryCache": {
+     "type": "boolean",
+     "description": "[Optional] Whether to look for the result in the query cache. The query cache is a best-effort cache that will be flushed whenever tables in the query are modified. Moreover, the query cache is only available when a query does not have a destination table specified."
+    },
     "writeDisposition": {
      "type": "string",
      "description": "[Optional] Whether to overwrite an existing table (WRITE_TRUNCATE), append to an existing table (WRITE_APPEND), or require that the the table is empty (WRITE_EMPTY). Default is WRITE_EMPTY."
@@ -663,6 +680,10 @@
    "id": "JobStatistics2",
    "type": "object",
    "properties": {
+    "cacheHit": {
+     "type": "boolean",
+     "description": "[Output-only] Whether the query result was fetched from the query cache."
+    },
     "totalBytesProcessed": {
      "type": "string",
      "description": "[Output-only] Total bytes processed for this job.",
@@ -821,6 +842,10 @@
      "type": "integer",
      "description": "[Optional] How long to wait for the query to complete, in milliseconds, before returning. Default is to return immediately. If the timeout passes before the job completes, the request will fail with a TIMEOUT error.",
      "format": "uint32"
+    },
+    "useQueryCache": {
+     "type": "boolean",
+     "description": "[Optional] Whether to look for the result in the query cache. The query cache is a best-effort cache that will be flushed whenever tables in the query are modified."
     }
    }
   },
@@ -828,6 +853,10 @@
    "id": "QueryResponse",
    "type": "object",
    "properties": {
+    "cacheHit": {
+     "type": "boolean",
+     "description": "Whether the query result was fetched from the query cache."
+    },
     "jobComplete": {
      "type": "boolean",
      "description": "Whether the query has completed or not. If rows or totalRows are present, this will always be true. If this is false, totalRows will not be available."
@@ -1410,6 +1439,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/bigquery",
+      "https://www.googleapis.com/auth/cloud-platform",
       "https://www.googleapis.com/auth/devstorage.full_control",
       "https://www.googleapis.com/auth/devstorage.read_only",
       "https://www.googleapis.com/auth/devstorage.read_write"
diff --git a/bigquery/v2/bigquery-gen.go b/bigquery/v2/bigquery-gen.go
index d9a3539..7f67db5 100644
--- a/bigquery/v2/bigquery-gen.go
+++ b/bigquery/v2/bigquery-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "bigquery:v2"
 const apiName = "bigquery"
@@ -41,6 +44,10 @@
 	// View and manage your data in Google BigQuery
 	BigqueryScope = "https://www.googleapis.com/auth/bigquery"
 
+	// MESSAGE UNDER CONSTRUCTION View and manage your data across Google
+	// Cloud Platform services
+	CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform"
+
 	// Manage your data and permissions in Google Cloud Storage
 	DevstorageFull_controlScope = "https://www.googleapis.com/auth/devstorage.full_control"
 
@@ -272,6 +279,9 @@
 }
 
 type GetQueryResultsResponse struct {
+	// CacheHit: Whether the query result was fetched from the query cache.
+	CacheHit bool `json:"cacheHit,omitempty"`
+
 	// Etag: A hash of this response.
 	Etag string `json:"etag,omitempty"`
 
@@ -406,6 +416,12 @@
 }
 
 type JobConfigurationLoad struct {
+	// AllowJaggedRows: [Optional] Accept rows that are missing trailing
+	// optional columns. The missing values are treated as nulls. Default is
+	// false which treats short rows as errors. Only applicable to CSV,
+	// ignored for other formats.
+	AllowJaggedRows bool `json:"allowJaggedRows,omitempty"`
+
 	// AllowQuotedNewlines: Indicates if BigQuery should allow quoted data
 	// sections that contain newline characters in a CSV file. The default
 	// value is false.
@@ -530,6 +546,13 @@
 	// Query: [Required] BigQuery SQL query to execute.
 	Query string `json:"query,omitempty"`
 
+	// UseQueryCache: [Optional] Whether to look for the result in the query
+	// cache. The query cache is a best-effort cache that will be flushed
+	// whenever tables in the query are modified. Moreover, the query cache
+	// is only available when a query does not have a destination table
+	// specified.
+	UseQueryCache bool `json:"useQueryCache,omitempty"`
+
 	// WriteDisposition: [Optional] Whether to overwrite an existing table
 	// (WRITE_TRUNCATE), append to an existing table (WRITE_APPEND), or
 	// require that the the table is empty (WRITE_EMPTY). Default is
@@ -629,6 +652,10 @@
 }
 
 type JobStatistics2 struct {
+	// CacheHit: [Output-only] Whether the query result was fetched from the
+	// query cache.
+	CacheHit bool `json:"cacheHit,omitempty"`
+
 	// TotalBytesProcessed: [Output-only] Total bytes processed for this
 	// job.
 	TotalBytesProcessed int64 `json:"totalBytesProcessed,omitempty,string"`
@@ -749,9 +776,17 @@
 	// the timeout passes before the job completes, the request will fail
 	// with a TIMEOUT error.
 	TimeoutMs int64 `json:"timeoutMs,omitempty"`
+
+	// UseQueryCache: [Optional] Whether to look for the result in the query
+	// cache. The query cache is a best-effort cache that will be flushed
+	// whenever tables in the query are modified.
+	UseQueryCache bool `json:"useQueryCache,omitempty"`
 }
 
 type QueryResponse struct {
+	// CacheHit: Whether the query result was fetched from the query cache.
+	CacheHit bool `json:"cacheHit,omitempty"`
+
 	// JobComplete: Whether the query has completed or not. If rows or
 	// totalRows are present, this will always be true. If this is false,
 	// totalRows will not be available.
@@ -967,15 +1002,17 @@
 		params.Set("deleteContents", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1037,15 +1074,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1114,15 +1153,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1202,14 +1243,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1288,16 +1331,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1375,16 +1420,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1451,15 +1498,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/jobs/{jobId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{jobId}", cleanPathString(c.jobId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", url.QueryEscape(c.jobId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1565,15 +1614,17 @@
 		params.Set("timeoutMs", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/queries/{jobId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{jobId}", cleanPathString(c.jobId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", url.QueryEscape(c.jobId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1674,10 +1725,11 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -1687,6 +1739,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1734,6 +1787,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/bigquery",
+	//     "https://www.googleapis.com/auth/cloud-platform",
 	//     "https://www.googleapis.com/auth/devstorage.full_control",
 	//     "https://www.googleapis.com/auth/devstorage.read_only",
 	//     "https://www.googleapis.com/auth/devstorage.read_write"
@@ -1814,14 +1868,16 @@
 		params.Set("stateFilter", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/jobs")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1929,15 +1985,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/queries")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2015,11 +2073,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2110,16 +2170,18 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}/tables/{tableId}/data")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
-	urls = strings.Replace(urls, "{tableId}", cleanPathString(c.tableId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tableId}", url.QueryEscape(c.tableId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2210,16 +2272,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}/tables/{tableId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
-	urls = strings.Replace(urls, "{tableId}", cleanPathString(c.tableId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tableId}", url.QueryEscape(c.tableId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2287,16 +2351,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}/tables/{tableId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
-	urls = strings.Replace(urls, "{tableId}", cleanPathString(c.tableId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tableId}", url.QueryEscape(c.tableId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2374,16 +2440,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}/tables")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2470,15 +2538,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}/tables")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2563,17 +2633,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}/tables/{tableId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
-	urls = strings.Replace(urls, "{tableId}", cleanPathString(c.tableId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tableId}", url.QueryEscape(c.tableId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2657,17 +2729,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/bigquery/v2/", "projects/{projectId}/datasets/{datasetId}/tables/{tableId}")
-	urls = strings.Replace(urls, "{projectId}", cleanPathString(c.projectId), 1)
-	urls = strings.Replace(urls, "{datasetId}", cleanPathString(c.datasetId), 1)
-	urls = strings.Replace(urls, "{tableId}", cleanPathString(c.tableId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{projectId}", url.QueryEscape(c.projectId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tableId}", url.QueryEscape(c.tableId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2718,12 +2792,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/blogger/v2/blogger-api.json b/blogger/v2/blogger-api.json
index 69eb780..a5f682d 100644
--- a/blogger/v2/blogger-api.json
+++ b/blogger/v2/blogger-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/4g7STJGy9Usxf96JxYgTnRsDwuE\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/RgKglWdu2QLnxhoiMqx3q2WkDso\"",
  "discoveryVersion": "v1",
  "id": "blogger:v2",
  "name": "blogger",
@@ -8,6 +8,8 @@
  "revision": "20130122",
  "title": "Blogger API",
  "description": "API for access to the data within Blogger.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/blogger-16.png",
   "x32": "http://www.google.com/images/icons/product/blogger-32.png"
diff --git a/blogger/v2/blogger-gen.go b/blogger/v2/blogger-gen.go
index 007f77e..fb47511 100644
--- a/blogger/v2/blogger-gen.go
+++ b/blogger/v2/blogger-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "blogger:v2"
 const apiName = "blogger"
@@ -497,14 +500,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "blogs/{blogId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -563,16 +568,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "blogs/{blogId}/posts/{postId}/comments/{commentId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -683,15 +690,17 @@
 		params.Set("startDate", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "blogs/{blogId}/posts/{postId}/comments")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -777,15 +786,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "blogs/{blogId}/pages/{pageId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{pageId}", cleanPathString(c.pageId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{pageId}", url.QueryEscape(c.pageId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -857,14 +868,16 @@
 		params.Set("fetchBodies", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "blogs/{blogId}/pages")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -926,15 +939,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "blogs/{blogId}/posts/{postId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1036,14 +1051,16 @@
 		params.Set("startDate", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "blogs/{blogId}/posts")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1120,14 +1137,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "users/{userId}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1182,14 +1201,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v2/", "users/{userId}/blogs")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1223,12 +1244,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/blogger/v3/blogger-api.json b/blogger/v3/blogger-api.json
index f382d9b..604fa60 100644
--- a/blogger/v3/blogger-api.json
+++ b/blogger/v3/blogger-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/4TzmHmCioW0Yj5cHXD-Z6OzkM6s\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/JIw1ulqf0p0ExAXb3O32d8TmLjE\"",
  "discoveryVersion": "v1",
  "id": "blogger:v3",
  "name": "blogger",
@@ -8,6 +8,8 @@
  "revision": "20130122",
  "title": "Blogger API",
  "description": "API for access to the data within Blogger.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/blogger-16.png",
   "x32": "http://www.google.com/images/icons/product/blogger-32.png"
diff --git a/blogger/v3/blogger-gen.go b/blogger/v3/blogger-gen.go
index 72c567d..a079d08 100644
--- a/blogger/v3/blogger-gen.go
+++ b/blogger/v3/blogger-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "blogger:v3"
 const apiName = "blogger"
@@ -528,14 +531,16 @@
 		params.Set("maxPosts", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -600,11 +605,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/byurl")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -660,14 +667,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "users/{userId}/blogs")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -727,16 +736,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/{postId}/comments/{commentId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -858,15 +869,17 @@
 		params.Set("startDate", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/{postId}/comments")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -959,15 +972,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/pages/{pageId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{pageId}", cleanPathString(c.pageId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{pageId}", url.QueryEscape(c.pageId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1040,14 +1055,16 @@
 		params.Set("fetchBodies", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/pages")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1110,15 +1127,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/{postId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1185,15 +1204,17 @@
 		params.Set("maxComments", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/{postId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1275,14 +1296,16 @@
 		params.Set("maxComments", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/bypath")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1358,15 +1381,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1484,14 +1509,16 @@
 		params.Set("startDate", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1589,16 +1616,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/{postId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1666,14 +1695,16 @@
 	params.Set("alt", "json")
 	params.Set("q", fmt.Sprintf("%v", c.q))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/search")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1745,16 +1776,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "blogs/{blogId}/posts/{postId}")
-	urls = strings.Replace(urls, "{blogId}", cleanPathString(c.blogId), 1)
-	urls = strings.Replace(urls, "{postId}", cleanPathString(c.postId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{blogId}", url.QueryEscape(c.blogId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{postId}", url.QueryEscape(c.postId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1819,14 +1852,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/blogger/v3/", "users/{userId}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1861,12 +1896,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/books/v1/books-api.json b/books/v1/books-api.json
index 6a06751..afa1139 100644
--- a/books/v1/books-api.json
+++ b/books/v1/books-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/mmD2e3rvoGxDQirJeNWdzi29lZg\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/VtjIAIh0AiKwRphMJPlW5YhrfBw\"",
  "discoveryVersion": "v1",
  "id": "books:v1",
  "name": "books",
  "version": "v1",
- "revision": "20130409",
+ "revision": "20130507",
  "title": "Books API",
  "description": "Lets you search for books and manage your Google Books library.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/ebooks-16.png",
   "x32": "http://www.google.com/images/icons/product/ebooks-32.png"
@@ -1765,6 +1767,21 @@
      "scopes": [
       "https://www.googleapis.com/auth/books"
      ]
+    },
+    "updateBook": {
+     "id": "books.cloudloading.updateBook",
+     "path": "cloudloading/updateBook",
+     "httpMethod": "POST",
+     "description": "",
+     "request": {
+      "$ref": "BooksCloudloadingResource"
+     },
+     "response": {
+      "$ref": "BooksCloudloadingResource"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/books"
+     ]
     }
    }
   },
@@ -3163,6 +3180,22 @@
          "maximum": "100",
          "location": "query"
         },
+        "processingState": {
+         "type": "string",
+         "description": "The processing state of the user uploaded volumes to be returned. Applicable only if the UPLOADED is specified in the acquireMethod.",
+         "enum": [
+          "COMPLETED_FAILED",
+          "COMPLETED_SUCCESS",
+          "RUNNING"
+         ],
+         "enumDescriptions": [
+          "The volume processing hase failed.",
+          "The volume processing was completed.",
+          "The volume processing is not completed."
+         ],
+         "repeated": true,
+         "location": "query"
+        },
         "source": {
          "type": "string",
          "description": "String to identify the originator of this request.",
@@ -3261,6 +3294,12 @@
          "format": "uint32",
          "minimum": "0",
          "location": "query"
+        },
+        "volumeId": {
+         "type": "string",
+         "description": "The ids of the volumes to be returned. If not specified all that match the processingState are returned.",
+         "repeated": true,
+         "location": "query"
         }
        },
        "response": {
diff --git a/books/v1/books-gen.go b/books/v1/books-gen.go
index c49f8b1..25d2545 100644
--- a/books/v1/books-gen.go
+++ b/books/v1/books-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "books:v1"
 const apiName = "books"
@@ -1409,15 +1412,17 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "users/{userId}/bookshelves/{shelf}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1494,14 +1499,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "users/{userId}/bookshelves")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1604,15 +1611,17 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "users/{userId}/bookshelves/{shelf}/volumes")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1738,11 +1747,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "cloudloading/addBook")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1810,11 +1821,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "cloudloading/deleteBook")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1842,6 +1855,67 @@
 
 }
 
+// method id "books.cloudloading.updateBook":
+
+type CloudloadingUpdateBookCall struct {
+	s                         *Service
+	bookscloudloadingresource *BooksCloudloadingResource
+	opt_                      map[string]interface{}
+}
+
+// UpdateBook:
+func (r *CloudloadingService) UpdateBook(bookscloudloadingresource *BooksCloudloadingResource) *CloudloadingUpdateBookCall {
+	c := &CloudloadingUpdateBookCall{s: r.s, opt_: make(map[string]interface{})}
+	c.bookscloudloadingresource = bookscloudloadingresource
+	return c
+}
+
+func (c *CloudloadingUpdateBookCall) Do() (*BooksCloudloadingResource, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bookscloudloadingresource)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "cloudloading/updateBook")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(BooksCloudloadingResource)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "",
+	//   "httpMethod": "POST",
+	//   "id": "books.cloudloading.updateBook",
+	//   "path": "cloudloading/updateBook",
+	//   "request": {
+	//     "$ref": "BooksCloudloadingResource"
+	//   },
+	//   "response": {
+	//     "$ref": "BooksCloudloadingResource"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/books"
+	//   ]
+	// }
+
+}
+
 // method id "books.layers.get":
 
 type LayersGetCall struct {
@@ -1884,15 +1958,17 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}/layersummary/{summaryId}")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
-	urls = strings.Replace(urls, "{summaryId}", cleanPathString(c.summaryId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{summaryId}", url.QueryEscape(c.summaryId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2004,14 +2080,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}/layersummary")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2147,16 +2225,18 @@
 		params.Set("w", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}/layers/{layerId}/data/{annotationDataId}")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
-	urls = strings.Replace(urls, "{layerId}", cleanPathString(c.layerId), 1)
-	urls = strings.Replace(urls, "{annotationDataId}", cleanPathString(c.annotationDataId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{layerId}", url.QueryEscape(c.layerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{annotationDataId}", url.QueryEscape(c.annotationDataId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2370,15 +2450,17 @@
 		params.Set("w", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}/layers/{layerId}/data")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
-	urls = strings.Replace(urls, "{layerId}", cleanPathString(c.layerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{layerId}", url.QueryEscape(c.layerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2530,16 +2612,18 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}/layers/{layerId}/annotations/{annotationId}")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
-	urls = strings.Replace(urls, "{layerId}", cleanPathString(c.layerId), 1)
-	urls = strings.Replace(urls, "{annotationId}", cleanPathString(c.annotationId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{layerId}", url.QueryEscape(c.layerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{annotationId}", url.QueryEscape(c.annotationId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2748,15 +2832,17 @@
 		params.Set("volumeAnnotationsVersion", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}/layers/{layerId}")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
-	urls = strings.Replace(urls, "{layerId}", cleanPathString(c.layerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{layerId}", url.QueryEscape(c.layerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2916,11 +3002,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "myconfig/releaseDownloadAccess")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3015,11 +3103,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "myconfig/requestAccess")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3140,11 +3230,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "myconfig/syncVolumeLicenses")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3239,14 +3331,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/annotations/{annotationId}")
-	urls = strings.Replace(urls, "{annotationId}", cleanPathString(c.annotationId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{annotationId}", url.QueryEscape(c.annotationId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3309,14 +3403,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/annotations/{annotationId}")
-	urls = strings.Replace(urls, "{annotationId}", cleanPathString(c.annotationId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{annotationId}", url.QueryEscape(c.annotationId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3393,12 +3489,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/annotations")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3555,11 +3653,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/annotations")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3676,15 +3776,17 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/annotations/{annotationId}")
-	urls = strings.Replace(urls, "{annotationId}", cleanPathString(c.annotationId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{annotationId}", url.QueryEscape(c.annotationId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3760,14 +3862,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/bookshelves/{shelf}/addVolume")
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3837,14 +3941,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/bookshelves/{shelf}/clearVolumes")
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3908,14 +4014,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/bookshelves/{shelf}")
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3986,11 +4094,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/bookshelves")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4057,14 +4167,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/bookshelves/{shelf}/moveVolume")
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -4145,14 +4257,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/bookshelves/{shelf}/removeVolume")
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -4282,14 +4396,16 @@
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/bookshelves/{shelf}/volumes")
-	urls = strings.Replace(urls, "{shelf}", cleanPathString(c.shelf), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{shelf}", url.QueryEscape(c.shelf), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4411,14 +4527,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/readingpositions/{volumeId}")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4529,14 +4647,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "mylibrary/readingpositions/{volumeId}/setPosition")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -4674,14 +4794,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4885,11 +5007,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5094,14 +5218,16 @@
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/{volumeId}/associated")
-	urls = strings.Replace(urls, "{volumeId}", cleanPathString(c.volumeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{volumeId}", url.QueryEscape(c.volumeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5194,6 +5320,14 @@
 	return c
 }
 
+// ProcessingState sets the optional parameter "processingState": The
+// processing state of the user uploaded volumes to be returned.
+// Applicable only if the UPLOADED is specified in the acquireMethod.
+func (c *VolumesMybooksListCall) ProcessingState(processingState string) *VolumesMybooksListCall {
+	c.opt_["processingState"] = processingState
+	return c
+}
+
 // Source sets the optional parameter "source": String to identify the
 // originator of this request.
 func (c *VolumesMybooksListCall) Source(source string) *VolumesMybooksListCall {
@@ -5221,6 +5355,9 @@
 	if v, ok := c.opt_["maxResults"]; ok {
 		params.Set("maxResults", fmt.Sprintf("%v", v))
 	}
+	if v, ok := c.opt_["processingState"]; ok {
+		params.Set("processingState", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["source"]; ok {
 		params.Set("source", fmt.Sprintf("%v", v))
 	}
@@ -5230,11 +5367,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/mybooks")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5281,6 +5420,22 @@
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
+	//     "processingState": {
+	//       "description": "The processing state of the user uploaded volumes to be returned. Applicable only if the UPLOADED is specified in the acquireMethod.",
+	//       "enum": [
+	//         "COMPLETED_FAILED",
+	//         "COMPLETED_SUCCESS",
+	//         "RUNNING"
+	//       ],
+	//       "enumDescriptions": [
+	//         "The volume processing hase failed.",
+	//         "The volume processing was completed.",
+	//         "The volume processing is not completed."
+	//       ],
+	//       "location": "query",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
 	//     "source": {
 	//       "description": "String to identify the originator of this request.",
 	//       "location": "query",
@@ -5346,11 +5501,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/recommended")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5435,6 +5592,14 @@
 	return c
 }
 
+// VolumeId sets the optional parameter "volumeId": The ids of the
+// volumes to be returned. If not specified all that match the
+// processingState are returned.
+func (c *VolumesUseruploadedListCall) VolumeId(volumeId string) *VolumesUseruploadedListCall {
+	c.opt_["volumeId"] = volumeId
+	return c
+}
+
 func (c *VolumesUseruploadedListCall) Do() (*Volumes, error) {
 	var body io.Reader = nil
 	params := make(url.Values)
@@ -5454,14 +5619,19 @@
 	if v, ok := c.opt_["startIndex"]; ok {
 		params.Set("startIndex", fmt.Sprintf("%v", v))
 	}
+	if v, ok := c.opt_["volumeId"]; ok {
+		params.Set("volumeId", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/books/v1/", "volumes/useruploaded")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5515,6 +5685,12 @@
 	//       "location": "query",
 	//       "minimum": "0",
 	//       "type": "integer"
+	//     },
+	//     "volumeId": {
+	//       "description": "The ids of the volumes to be returned. If not specified all that match the processingState are returned.",
+	//       "location": "query",
+	//       "repeated": true,
+	//       "type": "string"
 	//     }
 	//   },
 	//   "path": "volumes/useruploaded",
@@ -5527,12 +5703,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/calendar/v3/calendar-api.json b/calendar/v3/calendar-api.json
index a188ec6..ee8b5a0 100644
--- a/calendar/v3/calendar-api.json
+++ b/calendar/v3/calendar-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/LvxKqfPQwgIcVWyVXMoRIXUq5CI\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/N5koR8ISqSns0dUQqOHcL9QxkgM\"",
  "discoveryVersion": "v1",
  "id": "calendar:v3",
  "name": "calendar",
  "version": "v3",
- "revision": "20130411",
+ "revision": "20130605",
  "title": "Calendar API",
  "description": "Lets you manipulate events and other calendar data.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/calendar-16.png",
   "x32": "http://www.google.com/images/icons/product/calendar-32.png"
@@ -986,54 +988,6 @@
     }
    }
   },
-  "Subscription": {
-   "id": "Subscription",
-   "type": "object",
-   "properties": {
-    "address": {
-     "type": "string",
-     "description": "The address of the receiving entity where notifications are delivered. Specific to the channel mechanism."
-    },
-    "channel": {
-     "type": "string",
-     "description": "The delivery channel mechanism to use for notifications"
-    },
-    "channelParams": {
-     "type": "object",
-     "description": "Additional parameters controlling delivery channel behavior",
-     "additionalProperties": {
-      "type": "string",
-      "description": "Declares a new parameter by name."
-     }
-    },
-    "clientToken": {
-     "type": "string",
-     "description": "An arbitrary string associated with the subscription that is delivered to the target address with each notification for this subscription."
-    },
-    "expiration": {
-     "type": "string",
-     "description": "The expiration instant for this subscription if it is defined.",
-     "format": "int64"
-    },
-    "id": {
-     "type": "string",
-     "description": "A UUID for the subscription"
-    },
-    "kind": {
-     "type": "string",
-     "description": "A subscription to an API resource",
-     "default": "api#subscription"
-    },
-    "topicId": {
-     "type": "string",
-     "description": "An opaque topic id that identifies the backend resource which has been subscribed to. Stable across different API versions"
-    },
-    "topicUri": {
-     "type": "string",
-     "description": "The canonicalized URI of the subscribed-to resource."
-    }
-   }
-  },
   "TimePeriod": {
    "id": "TimePeriod",
    "type": "object",
@@ -2140,22 +2094,6 @@
      ]
     }
    }
-  },
-  "subscriptions": {
-   "methods": {
-    "unsubscribe": {
-     "id": "calendar.subscriptions.unsubscribe",
-     "path": "subscriptions/unsubscribe",
-     "httpMethod": "POST",
-     "request": {
-      "$ref": "Subscription"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/calendar",
-      "https://www.googleapis.com/auth/calendar.readonly"
-     ]
-    }
-   }
   }
  }
 }
diff --git a/calendar/v3/calendar-gen.go b/calendar/v3/calendar-gen.go
index 49e5e74..ef23d2d 100644
--- a/calendar/v3/calendar-gen.go
+++ b/calendar/v3/calendar-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "calendar:v3"
 const apiName = "calendar"
@@ -57,7 +60,6 @@
 	s.Events = NewEventsService(s)
 	s.Freebusy = NewFreebusyService(s)
 	s.Settings = NewSettingsService(s)
-	s.Subscriptions = NewSubscriptionsService(s)
 	return s, nil
 }
 
@@ -77,8 +79,6 @@
 	Freebusy *FreebusyService
 
 	Settings *SettingsService
-
-	Subscriptions *SubscriptionsService
 }
 
 func NewAclService(s *Service) *AclService {
@@ -144,15 +144,6 @@
 	s *Service
 }
 
-func NewSubscriptionsService(s *Service) *SubscriptionsService {
-	rs := &SubscriptionsService{s: s}
-	return rs
-}
-
-type SubscriptionsService struct {
-	s *Service
-}
-
 type Acl struct {
 	// Etag: ETag of the collection.
 	Etag string `json:"etag,omitempty"`
@@ -874,44 +865,6 @@
 	Kind string `json:"kind,omitempty"`
 }
 
-type Subscription struct {
-	// Address: The address of the receiving entity where notifications are
-	// delivered. Specific to the channel mechanism.
-	Address string `json:"address,omitempty"`
-
-	// Channel: The delivery channel mechanism to use for notifications
-	Channel string `json:"channel,omitempty"`
-
-	// ChannelParams: Additional parameters controlling delivery channel
-	// behavior
-	ChannelParams *SubscriptionChannelParams `json:"channelParams,omitempty"`
-
-	// ClientToken: An arbitrary string associated with the subscription
-	// that is delivered to the target address with each notification for
-	// this subscription.
-	ClientToken string `json:"clientToken,omitempty"`
-
-	// Expiration: The expiration instant for this subscription if it is
-	// defined.
-	Expiration int64 `json:"expiration,omitempty,string"`
-
-	// Id: A UUID for the subscription
-	Id string `json:"id,omitempty"`
-
-	// Kind: A subscription to an API resource
-	Kind string `json:"kind,omitempty"`
-
-	// TopicId: An opaque topic id that identifies the backend resource
-	// which has been subscribed to. Stable across different API versions
-	TopicId string `json:"topicId,omitempty"`
-
-	// TopicUri: The canonicalized URI of the subscribed-to resource.
-	TopicUri string `json:"topicUri,omitempty"`
-}
-
-type SubscriptionChannelParams struct {
-}
-
 type TimePeriod struct {
 	// End: The (exclusive) end of the time period.
 	End string `json:"end,omitempty"`
@@ -942,15 +895,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/acl/{ruleId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{ruleId}", cleanPathString(c.ruleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{ruleId}", url.QueryEscape(c.ruleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1007,15 +962,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/acl/{ruleId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{ruleId}", cleanPathString(c.ruleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{ruleId}", url.QueryEscape(c.ruleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1085,15 +1042,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/acl")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1151,14 +1110,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/acl")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1223,16 +1184,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/acl/{ruleId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{ruleId}", cleanPathString(c.ruleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{ruleId}", url.QueryEscape(c.ruleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1306,16 +1269,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/acl/{ruleId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{ruleId}", cleanPathString(c.ruleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{ruleId}", url.QueryEscape(c.ruleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1380,14 +1345,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/calendarList/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1435,14 +1402,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/calendarList/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1518,12 +1487,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/calendarList")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1618,11 +1589,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/calendarList")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1724,15 +1697,17 @@
 		params.Set("colorRgbFormat", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/calendarList/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1815,15 +1790,17 @@
 		params.Set("colorRgbFormat", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/calendarList/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1888,14 +1865,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/clear")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1943,14 +1922,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1998,14 +1979,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2068,12 +2051,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2128,15 +2113,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2201,15 +2188,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2267,11 +2256,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "colors")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2329,15 +2320,17 @@
 		params.Set("sendNotifications", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/{eventId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{eventId}", cleanPathString(c.eventId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{eventId}", url.QueryEscape(c.eventId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2436,15 +2429,17 @@
 		params.Set("timeZone", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/{eventId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{eventId}", cleanPathString(c.eventId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{eventId}", url.QueryEscape(c.eventId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2531,15 +2526,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/import")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2627,15 +2624,17 @@
 		params.Set("sendNotifications", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2808,15 +2807,17 @@
 		params.Set("timeZone", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/{eventId}/instances")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{eventId}", cleanPathString(c.eventId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{eventId}", url.QueryEscape(c.eventId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3092,14 +3093,16 @@
 		params.Set("updatedMin", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3258,15 +3261,17 @@
 		params.Set("sendNotifications", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/{eventId}/move")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{eventId}", cleanPathString(c.eventId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{eventId}", url.QueryEscape(c.eventId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3387,16 +3392,18 @@
 		params.Set("sendNotifications", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/{eventId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{eventId}", cleanPathString(c.eventId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{eventId}", url.QueryEscape(c.eventId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3492,14 +3499,16 @@
 		params.Set("sendNotifications", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/quickAdd")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3613,16 +3622,18 @@
 		params.Set("sendNotifications", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "calendars/{calendarId}/events/{eventId}")
-	urls = strings.Replace(urls, "{calendarId}", cleanPathString(c.calendarId), 1)
-	urls = strings.Replace(urls, "{eventId}", cleanPathString(c.eventId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{calendarId}", url.QueryEscape(c.calendarId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{eventId}", url.QueryEscape(c.eventId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3711,12 +3722,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "freeBusy")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3764,14 +3777,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/settings/{setting}")
-	urls = strings.Replace(urls, "{setting}", cleanPathString(c.setting), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{setting}", url.QueryEscape(c.setting), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3827,11 +3842,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "users/me/settings")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3855,64 +3872,3 @@
 	// }
 
 }
-
-// method id "calendar.subscriptions.unsubscribe":
-
-type SubscriptionsUnsubscribeCall struct {
-	s            *Service
-	subscription *Subscription
-	opt_         map[string]interface{}
-}
-
-// Unsubscribe:
-func (r *SubscriptionsService) Unsubscribe(subscription *Subscription) *SubscriptionsUnsubscribeCall {
-	c := &SubscriptionsUnsubscribeCall{s: r.s, opt_: make(map[string]interface{})}
-	c.subscription = subscription
-	return c
-}
-
-func (c *SubscriptionsUnsubscribeCall) Do() error {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
-	if err != nil {
-		return err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	urls := googleapi.ResolveRelative("https://www.googleapis.com/calendar/v3/", "subscriptions/unsubscribe")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "httpMethod": "POST",
-	//   "id": "calendar.subscriptions.unsubscribe",
-	//   "path": "subscriptions/unsubscribe",
-	//   "request": {
-	//     "$ref": "Subscription"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/calendar",
-	//     "https://www.googleapis.com/auth/calendar.readonly"
-	//   ]
-	// }
-
-}
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/civicinfo/us_v1/civicinfo-api.json b/civicinfo/us_v1/civicinfo-api.json
index d311dc4..5df6517 100644
--- a/civicinfo/us_v1/civicinfo-api.json
+++ b/civicinfo/us_v1/civicinfo-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/YuJiktLErFlXC2SwOVNqpA7Ot3I\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/biP5fTndK6d1Dtjkz3NMgX5eztk\"",
  "discoveryVersion": "v1",
  "id": "civicinfo:us_v1",
  "name": "civicinfo",
  "canonicalName": "Civic Info",
  "version": "us_v1",
- "revision": "20130103",
+ "revision": "20130525",
  "title": "Google Civic Information API",
  "description": "An API for accessing civic information.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -384,6 +386,120 @@
     }
    }
   },
+  "GeographicDivision": {
+   "id": "GeographicDivision",
+   "type": "object",
+   "description": "Describes a political geography.",
+   "properties": {
+    "confidence": {
+     "type": "number",
+     "description": "Numerical value between 0 and 1 that expresses level of confidence that a given district is relevant to the request.",
+     "format": "float"
+    },
+    "name": {
+     "type": "string",
+     "description": "The name of the division."
+    },
+    "ocdId": {
+     "type": "string",
+     "description": "The unique Open Civic Data identifier for this division."
+    },
+    "offices": {
+     "type": "array",
+     "description": "List of offices elected from this division.",
+     "items": {
+      "$ref": "Office"
+     }
+    },
+    "type": {
+     "type": "string",
+     "description": "The type of this division. If unspecified the division's geography is not known."
+    }
+   }
+  },
+  "Office": {
+   "id": "Office",
+   "type": "object",
+   "description": "Information about an Office held by one or more Officials.",
+   "properties": {
+    "name": {
+     "type": "string",
+     "description": "The human-readable name of the office."
+    },
+    "officials": {
+     "type": "array",
+     "description": "A list of people who presently hold the office.",
+     "items": {
+      "$ref": "Official"
+     }
+    },
+    "sources": {
+     "type": "array",
+     "description": "A list of sources for this contest. If multiple sources are listed, the data has been aggregated from those sources.",
+     "items": {
+      "$ref": "Source"
+     }
+    }
+   }
+  },
+  "Official": {
+   "id": "Official",
+   "type": "object",
+   "description": "Information about a official holding an elected office.",
+   "properties": {
+    "address": {
+     "type": "array",
+     "description": "Addresses at which to contact the official.",
+     "items": {
+      "$ref": "SimpleAddressType"
+     }
+    },
+    "channels": {
+     "type": "array",
+     "description": "A list of known (social) media channels for this official.",
+     "items": {
+      "$ref": "Channel"
+     }
+    },
+    "emails": {
+     "type": "array",
+     "description": "The direct email addresses for the official.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "A unique identifier for this official."
+    },
+    "name": {
+     "type": "string",
+     "description": "The official's name."
+    },
+    "party": {
+     "type": "string",
+     "description": "The full name of the party the official belongs to."
+    },
+    "phones": {
+     "type": "array",
+     "description": "The official's public contact phone numbers.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "photoUrl": {
+     "type": "string",
+     "description": "A URL for a photo of the official."
+    },
+    "urls": {
+     "type": "array",
+     "description": "The official's public website URLs.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
   "PollingLocation": {
    "id": "PollingLocation",
    "type": "object",
@@ -430,6 +546,57 @@
     }
    }
   },
+  "RepresentativeInfoRequest": {
+   "id": "RepresentativeInfoRequest",
+   "type": "object",
+   "description": "A request for political geography and representative information for an address.",
+   "properties": {
+    "address": {
+     "type": "string"
+    }
+   }
+  },
+  "RepresentativeInfoResponse": {
+   "id": "RepresentativeInfoResponse",
+   "type": "object",
+   "description": "The result of a representative info lookup query.",
+   "properties": {
+    "divisions": {
+     "type": "array",
+     "description": "Political geographic divisions that contain the requested address.",
+     "items": {
+      "$ref": "GeographicDivision"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"civicinfo#representativeInfoResponse\".",
+     "default": "civicinfo#representativeInfoResponse"
+    },
+    "normalizedInput": {
+     "$ref": "SimpleAddressType",
+     "description": "The normalized version of the requested address"
+    },
+    "offices": {
+     "type": "array",
+     "description": "Elected offices referenced by the divisions listed above. Will only be present if \"offices\" was true in the request.",
+     "items": {
+      "$ref": "Office"
+     }
+    },
+    "officials": {
+     "type": "array",
+     "description": "Officials holding the offices listed above. Will only be present if \"offices\" was true in the request.",
+     "items": {
+      "$ref": "Official"
+     }
+    },
+    "status": {
+     "type": "string",
+     "description": "The result of the request. One of: success, noStreetSegmentFound, addressUnparseable, noAddressParameter, multipleStreetSegmentsFound, electionOver, electionUnknown, internalLookupFailure"
+    }
+   }
+  },
   "SimpleAddressType": {
    "id": "SimpleAddressType",
    "type": "object",
@@ -587,6 +754,30 @@
      }
     }
    }
+  },
+  "representatives": {
+   "methods": {
+    "representativeInfoQuery": {
+     "id": "civicinfo.representatives.representativeInfoQuery",
+     "path": "representatives/lookup",
+     "httpMethod": "POST",
+     "description": "Looks up political geography and (optionally) representative information based on an address.",
+     "parameters": {
+      "includeOffices": {
+       "type": "boolean",
+       "description": "Whether to return information about offices and officials. If false, only the top-level district information will be returned.",
+       "default": "true",
+       "location": "query"
+      }
+     },
+     "request": {
+      "$ref": "RepresentativeInfoRequest"
+     },
+     "response": {
+      "$ref": "RepresentativeInfoResponse"
+     }
+    }
+   }
   }
  }
 }
diff --git a/civicinfo/us_v1/civicinfo-gen.go b/civicinfo/us_v1/civicinfo-gen.go
index e4ac6a9..8c2694b 100644
--- a/civicinfo/us_v1/civicinfo-gen.go
+++ b/civicinfo/us_v1/civicinfo-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "civicinfo:us_v1"
 const apiName = "civicinfo"
@@ -42,6 +45,7 @@
 	}
 	s := &Service{client: client}
 	s.Elections = NewElectionsService(s)
+	s.Representatives = NewRepresentativesService(s)
 	return s, nil
 }
 
@@ -49,6 +53,8 @@
 	client *http.Client
 
 	Elections *ElectionsService
+
+	Representatives *RepresentativesService
 }
 
 func NewElectionsService(s *Service) *ElectionsService {
@@ -60,6 +66,15 @@
 	s *Service
 }
 
+func NewRepresentativesService(s *Service) *RepresentativesService {
+	rs := &RepresentativesService{s: s}
+	return rs
+}
+
+type RepresentativesService struct {
+	s *Service
+}
+
 type AdministrationRegion struct {
 	// ElectionAdministrationBody: The election administration body for this
 	// area.
@@ -291,6 +306,66 @@
 	Scope string `json:"scope,omitempty"`
 }
 
+type GeographicDivision struct {
+	// Confidence: Numerical value between 0 and 1 that expresses level of
+	// confidence that a given district is relevant to the request.
+	Confidence float64 `json:"confidence,omitempty"`
+
+	// Name: The name of the division.
+	Name string `json:"name,omitempty"`
+
+	// OcdId: The unique Open Civic Data identifier for this division.
+	OcdId string `json:"ocdId,omitempty"`
+
+	// Offices: List of offices elected from this division.
+	Offices []*Office `json:"offices,omitempty"`
+
+	// Type: The type of this division. If unspecified the division's
+	// geography is not known.
+	Type string `json:"type,omitempty"`
+}
+
+type Office struct {
+	// Name: The human-readable name of the office.
+	Name string `json:"name,omitempty"`
+
+	// Officials: A list of people who presently hold the office.
+	Officials []*Official `json:"officials,omitempty"`
+
+	// Sources: A list of sources for this contest. If multiple sources are
+	// listed, the data has been aggregated from those sources.
+	Sources []*Source `json:"sources,omitempty"`
+}
+
+type Official struct {
+	// Address: Addresses at which to contact the official.
+	Address []*SimpleAddressType `json:"address,omitempty"`
+
+	// Channels: A list of known (social) media channels for this official.
+	Channels []*Channel `json:"channels,omitempty"`
+
+	// Emails: The direct email addresses for the official.
+	Emails []string `json:"emails,omitempty"`
+
+	// Id: A unique identifier for this official.
+	Id string `json:"id,omitempty"`
+
+	// Name: The official's name.
+	Name string `json:"name,omitempty"`
+
+	// Party: The full name of the party the official belongs to.
+	Party string `json:"party,omitempty"`
+
+	// Phones: The official's public contact phone numbers.
+	Phones []string `json:"phones,omitempty"`
+
+	// PhotoUrl: A URL for a photo of the official.
+	PhotoUrl string `json:"photoUrl,omitempty"`
+
+	// Urls: The official's public website URLs.
+	Urls []string `json:"urls,omitempty"`
+}
+
 type PollingLocation struct {
 	// Address: The address of the location
 	Address *SimpleAddressType `json:"address,omitempty"`
@@ -328,6 +403,36 @@
 	VoterServices string `json:"voterServices,omitempty"`
 }
 
+type RepresentativeInfoRequest struct {
+	Address string `json:"address,omitempty"`
+}
+
+type RepresentativeInfoResponse struct {
+	// Divisions: Political geographic divisions that contain the requested
+	// address.
+	Divisions []*GeographicDivision `json:"divisions,omitempty"`
+
+	// Kind: The kind, fixed to "civicinfo#representativeInfoResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// NormalizedInput: The normalized version of the requested address
+	NormalizedInput *SimpleAddressType `json:"normalizedInput,omitempty"`
+
+	// Offices: Elected offices referenced by the divisions listed above.
+	// Will only be present if "offices" was true in the request.
+	Offices []*Office `json:"offices,omitempty"`
+
+	// Officials: Officials holding the offices listed above. Will only be
+	// present if "offices" was true in the request.
+	Officials []*Official `json:"officials,omitempty"`
+
+	// Status: The result of the request. One of: success,
+	// noStreetSegmentFound, addressUnparseable, noAddressParameter,
+	// multipleStreetSegmentsFound, electionOver, electionUnknown,
+	// internalLookupFailure
+	Status string `json:"status,omitempty"`
+}
+
 type SimpleAddressType struct {
 	// City: The city or town for the address.
 	City string `json:"city,omitempty"`
@@ -418,11 +523,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/civicinfo/us_v1/", "elections")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -481,15 +588,17 @@
 		params.Set("officialOnly", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/civicinfo/us_v1/", "voterinfo/{electionId}/lookup")
-	urls = strings.Replace(urls, "{electionId}", strconv.FormatInt(c.electionId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{electionId}", strconv.FormatInt(c.electionId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -531,11 +640,80 @@
 
 }
 
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
+// method id "civicinfo.representatives.representativeInfoQuery":
+
+type RepresentativesRepresentativeInfoQueryCall struct {
+	s                         *Service
+	representativeinforequest *RepresentativeInfoRequest
+	opt_                      map[string]interface{}
+}
+
+// RepresentativeInfoQuery: Looks up political geography and
+// (optionally) representative information based on an address.
+func (r *RepresentativesService) RepresentativeInfoQuery(representativeinforequest *RepresentativeInfoRequest) *RepresentativesRepresentativeInfoQueryCall {
+	c := &RepresentativesRepresentativeInfoQueryCall{s: r.s, opt_: make(map[string]interface{})}
+	c.representativeinforequest = representativeinforequest
+	return c
+}
+
+// IncludeOffices sets the optional parameter "includeOffices": Whether
+// to return information about offices and officials. If false, only the
+// top-level district information will be returned.
+func (c *RepresentativesRepresentativeInfoQueryCall) IncludeOffices(includeOffices bool) *RepresentativesRepresentativeInfoQueryCall {
+	c.opt_["includeOffices"] = includeOffices
+	return c
+}
+
+func (c *RepresentativesRepresentativeInfoQueryCall) Do() (*RepresentativeInfoResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.representativeinforequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["includeOffices"]; ok {
+		params.Set("includeOffices", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/civicinfo/us_v1/", "representatives/lookup")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(RepresentativeInfoResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Looks up political geography and (optionally) representative information based on an address.",
+	//   "httpMethod": "POST",
+	//   "id": "civicinfo.representatives.representativeInfoQuery",
+	//   "parameters": {
+	//     "includeOffices": {
+	//       "default": "true",
+	//       "description": "Whether to return information about offices and officials. If false, only the top-level district information will be returned.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     }
+	//   },
+	//   "path": "representatives/lookup",
+	//   "request": {
+	//     "$ref": "RepresentativeInfoRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "RepresentativeInfoResponse"
+	//   }
+	// }
+
 }
diff --git a/compute/v1beta14/compute-api.json b/compute/v1beta14/compute-api.json
index a60cdd8..b1985bf 100644
--- a/compute/v1beta14/compute-api.json
+++ b/compute/v1beta14/compute-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/RZz1s1ZlX5Ol7GBgHPQgqgiP88o\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/V8AmZ-xbzH1BU2brhm-oIgTsH7w\"",
  "discoveryVersion": "v1",
  "id": "compute:v1beta14",
  "name": "compute",
  "version": "v1beta14",
- "revision": "20130403",
+ "revision": "20130320",
  "title": "Compute Engine API",
  "description": "API for the Google Compute Engine service.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/compute_engine-16.png",
   "x32": "http://www.google.com/images/icons/product/compute_engine-32.png"
@@ -519,7 +521,7 @@
    "properties": {
     "canIpForward": {
      "type": "boolean",
-     "description": "Reserved for future use."
+     "description": "Allows this instance to send packets with source IP addresses other than its own and receive packets with destination IP addresses other than its own. If this instance will be used as an IP gateway or it will be set as the next-hop in a Route resource, say true. If unsure, leave this set to false."
     },
     "creationTimestamp": {
      "type": "string",
@@ -586,7 +588,7 @@
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "Server defined URL for this resource (output only)."
     },
     "serviceAccounts": {
      "type": "array",
@@ -1243,6 +1245,132 @@
     }
    }
   },
+  "Route": {
+   "id": "Route",
+   "type": "object",
+   "description": "The route resource. A Route is a rule that specifies how certain packets should be handled by the virtual network. Routes are associated with VMs by tag and the set of Routes for a particular VM is called its routing table. For each packet leaving a VM, the system searches that VM's routing table for a single best matching Route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the Route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching Routes. The packet is then forwarded as specified by the next_hop field of the winning Route -- either to another VM destination, a VM gateway or a GCE operated gateway. Packets that do not match any Route in the sending VM's routing table will be dropped.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "destRange": {
+     "type": "string",
+     "description": "Which packets does this route apply to?",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#route"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "network": {
+     "type": "string",
+     "description": "URL of the network to which this route is applied; provided by the client when the route is created.",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "nextHopGateway": {
+     "type": "string",
+     "description": "The URL to a gateway that should handle matching packets."
+    },
+    "nextHopInstance": {
+     "type": "string",
+     "description": "The URL to an instance that should handle matching packets."
+    },
+    "nextHopIp": {
+     "type": "string",
+     "description": "The network IP address of an instance that should handle matching packets."
+    },
+    "nextHopNetwork": {
+     "type": "string",
+     "description": "The URL of the local network if it should handle matching packets."
+    },
+    "priority": {
+     "type": "integer",
+     "description": "Breaks ties between Routes of equal specificity. Routes with smaller values win when tied with routes with larger values.",
+     "format": "uint32",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "tags": {
+     "type": "array",
+     "description": "A list of instance tags to which this route applies.",
+     "items": {
+      "type": "string"
+     },
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    }
+   }
+  },
+  "RouteList": {
+   "id": "RouteList",
+   "type": "object",
+   "description": "Contains a list of route resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The route resources.",
+     "items": {
+      "$ref": "Route"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#routeList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
   "SerialPortOutput": {
    "id": "SerialPortOutput",
    "type": "object",
@@ -3025,6 +3153,146 @@
     }
    }
   },
+  "routes": {
+   "methods": {
+    "delete": {
+     "id": "compute.routes.delete",
+     "path": "{project}/global/routes/{route}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified route resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "route": {
+       "type": "string",
+       "description": "Name of the route resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "route"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.routes.get",
+     "path": "{project}/global/routes/{route}",
+     "httpMethod": "GET",
+     "description": "Returns the specified route resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "route": {
+       "type": "string",
+       "description": "Name of the route resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "route"
+     ],
+     "response": {
+      "$ref": "Route"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.routes.insert",
+     "path": "{project}/global/routes",
+     "httpMethod": "POST",
+     "description": "Creates a route resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "request": {
+      "$ref": "Route"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "list": {
+     "id": "compute.routes.list",
+     "path": "{project}/global/routes",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of route resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "RouteList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
   "snapshots": {
    "methods": {
     "delete": {
diff --git a/compute/v1beta14/compute-gen.go b/compute/v1beta14/compute-gen.go
index eb69d21..6959430 100644
--- a/compute/v1beta14/compute-gen.go
+++ b/compute/v1beta14/compute-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "compute:v1beta14"
 const apiName = "compute"
@@ -62,6 +65,7 @@
 	s.MachineTypes = NewMachineTypesService(s)
 	s.Networks = NewNetworksService(s)
 	s.Projects = NewProjectsService(s)
+	s.Routes = NewRoutesService(s)
 	s.Snapshots = NewSnapshotsService(s)
 	s.ZoneOperations = NewZoneOperationsService(s)
 	s.Zones = NewZonesService(s)
@@ -89,6 +93,8 @@
 
 	Projects *ProjectsService
 
+	Routes *RoutesService
+
 	Snapshots *SnapshotsService
 
 	ZoneOperations *ZoneOperationsService
@@ -177,6 +183,15 @@
 	s *Service
 }
 
+func NewRoutesService(s *Service) *RoutesService {
+	rs := &RoutesService{s: s}
+	return rs
+}
+
+type RoutesService struct {
+	s *Service
+}
+
 func NewSnapshotsService(s *Service) *SnapshotsService {
 	rs := &SnapshotsService{s: s}
 	return rs
@@ -515,7 +530,11 @@
 }
 
 type Instance struct {
-	// CanIpForward: Reserved for future use.
+	// CanIpForward: Allows this instance to send packets with source IP
+	// addresses other than its own and receive packets with destination IP
+	// addresses other than its own. If this instance will be used as an IP
+	// gateway or it will be set as the next-hop in a Route resource, say
+	// true. If unsure, leave this set to false.
 	CanIpForward bool `json:"canIpForward,omitempty"`
 
 	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
@@ -573,7 +592,7 @@
 	// internet access.
 	NetworkInterfaces []*NetworkInterface `json:"networkInterfaces,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: Server defined URL for this resource (output only).
 	SelfLink string `json:"selfLink,omitempty"`
 
 	// ServiceAccounts: A list of service accounts each with specified
@@ -1028,6 +1047,80 @@
 	Usage float64 `json:"usage,omitempty"`
 }
 
+type Route struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// DestRange: Which packets does this route apply to?
+	DestRange string `json:"destRange,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// Network: URL of the network to which this route is applied; provided
+	// by the client when the route is created.
+	Network string `json:"network,omitempty"`
+
+	// NextHopGateway: The URL to a gateway that should handle matching
+	// packets.
+	NextHopGateway string `json:"nextHopGateway,omitempty"`
+
+	// NextHopInstance: The URL to an instance that should handle matching
+	// packets.
+	NextHopInstance string `json:"nextHopInstance,omitempty"`
+
+	// NextHopIp: The network IP address of an instance that should handle
+	// matching packets.
+	NextHopIp string `json:"nextHopIp,omitempty"`
+
+	// NextHopNetwork: The URL of the local network if it should handle
+	// matching packets.
+	NextHopNetwork string `json:"nextHopNetwork,omitempty"`
+
+	// Priority: Breaks ties between Routes of equal specificity. Routes
+	// with smaller values win when tied with routes with larger values.
+	Priority int64 `json:"priority,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Tags: A list of instance tags to which this route applies.
+	Tags []string `json:"tags,omitempty"`
+}
+
+type RouteList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The route resources.
+	Items []*Route `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
 type SerialPortOutput struct {
 	// Contents: The contents of the console output.
 	Contents string `json:"contents,omitempty"`
@@ -1219,16 +1312,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/disks/{disk}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{disk}", cleanPathString(c.disk), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{disk}", url.QueryEscape(c.disk), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1304,16 +1399,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/disks/{disk}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{disk}", cleanPathString(c.disk), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{disk}", url.QueryEscape(c.disk), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1406,16 +1503,18 @@
 		params.Set("sourceImage", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/disks")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1521,15 +1620,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/disks")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1615,15 +1716,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/firewalls/{firewall}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{firewall}", cleanPathString(c.firewall), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1689,15 +1792,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/firewalls/{firewall}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{firewall}", cleanPathString(c.firewall), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1770,15 +1875,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/firewalls")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1869,14 +1976,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/firewalls")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1962,16 +2071,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/firewalls/{firewall}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{firewall}", cleanPathString(c.firewall), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2048,16 +2159,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/firewalls/{firewall}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{firewall}", cleanPathString(c.firewall), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2126,15 +2239,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/operations/{operation}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{operation}", cleanPathString(c.operation), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2193,15 +2308,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/operations/{operation}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{operation}", cleanPathString(c.operation), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2298,14 +2415,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/operations")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2383,15 +2502,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/images/{image}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{image}", cleanPathString(c.image), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{image}", url.QueryEscape(c.image), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2465,16 +2586,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/images/{image}/deprecate")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{image}", cleanPathString(c.image), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{image}", url.QueryEscape(c.image), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2543,15 +2666,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/images/{image}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{image}", cleanPathString(c.image), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{image}", url.QueryEscape(c.image), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2624,15 +2749,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/images")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2724,14 +2851,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/images")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2822,17 +2951,19 @@
 	params.Set("alt", "json")
 	params.Set("network_interface", fmt.Sprintf("%v", c.network_interface))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}/addAccessConfig")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2925,17 +3056,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}/attachDisk")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3014,16 +3147,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3106,16 +3241,18 @@
 	params.Set("access_config", fmt.Sprintf("%v", c.access_config))
 	params.Set("network_interface", fmt.Sprintf("%v", c.network_interface))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3208,16 +3345,18 @@
 	params.Set("alt", "json")
 	params.Set("deviceName", fmt.Sprintf("%v", c.deviceName))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}/detachDisk")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3301,16 +3440,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3388,16 +3529,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}/serialPort")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3480,16 +3623,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3590,15 +3735,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3694,17 +3841,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}/setMetadata")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3791,17 +3940,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/instances/{instance}/setTags")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{instance}", cleanPathString(c.instance), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3878,15 +4029,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/kernels/{kernel}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{kernel}", cleanPathString(c.kernel), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{kernel}", url.QueryEscape(c.kernel), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3983,14 +4136,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/kernels")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4068,15 +4223,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/machineTypes/{machineType}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{machineType}", cleanPathString(c.machineType), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{machineType}", url.QueryEscape(c.machineType), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4173,14 +4330,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/machineTypes")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4258,15 +4417,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/networks/{network}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{network}", cleanPathString(c.network), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{network}", url.QueryEscape(c.network), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4332,15 +4493,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/networks/{network}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{network}", cleanPathString(c.network), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{network}", url.QueryEscape(c.network), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4413,15 +4576,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/networks")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4512,14 +4677,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/networks")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4595,14 +4762,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4667,15 +4836,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/setCommonInstanceMetadata")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4714,6 +4885,353 @@
 
 }
 
+// method id "compute.routes.delete":
+
+type RoutesDeleteCall struct {
+	s       *Service
+	project string
+	route   string
+	opt_    map[string]interface{}
+}
+
+// Delete: Deletes the specified route resource.
+func (r *RoutesService) Delete(project string, route string) *RoutesDeleteCall {
+	c := &RoutesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.route = route
+	return c
+}
+
+func (c *RoutesDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/routes/{route}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{route}", url.QueryEscape(c.route), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified route resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.routes.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "route"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "route": {
+	//       "description": "Name of the route resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes/{route}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.routes.get":
+
+type RoutesGetCall struct {
+	s       *Service
+	project string
+	route   string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified route resource.
+func (r *RoutesService) Get(project string, route string) *RoutesGetCall {
+	c := &RoutesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.route = route
+	return c
+}
+
+func (c *RoutesGetCall) Do() (*Route, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/routes/{route}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{route}", url.QueryEscape(c.route), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Route)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified route resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.routes.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "route"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "route": {
+	//       "description": "Name of the route resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes/{route}",
+	//   "response": {
+	//     "$ref": "Route"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.routes.insert":
+
+type RoutesInsertCall struct {
+	s       *Service
+	project string
+	route   *Route
+	opt_    map[string]interface{}
+}
+
+// Insert: Creates a route resource in the specified project using the
+// data included in the request.
+func (r *RoutesService) Insert(project string, route *Route) *RoutesInsertCall {
+	c := &RoutesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.route = route
+	return c
+}
+
+func (c *RoutesInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.route)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/routes")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a route resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.routes.insert",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes",
+	//   "request": {
+	//     "$ref": "Route"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.routes.list":
+
+type RoutesListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of route resources available to the
+// specified project.
+func (r *RoutesService) List(project string) *RoutesListCall {
+	c := &RoutesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *RoutesListCall) Filter(filter string) *RoutesListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *RoutesListCall) MaxResults(maxResults int64) *RoutesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *RoutesListCall) PageToken(pageToken string) *RoutesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *RoutesListCall) Do() (*RouteList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/routes")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(RouteList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of route resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.routes.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes",
+	//   "response": {
+	//     "$ref": "RouteList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
 // method id "compute.snapshots.delete":
 
 type SnapshotsDeleteCall struct {
@@ -4736,15 +5254,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/snapshots/{snapshot}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{snapshot}", cleanPathString(c.snapshot), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{snapshot}", url.QueryEscape(c.snapshot), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4810,15 +5330,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/snapshots/{snapshot}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{snapshot}", cleanPathString(c.snapshot), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{snapshot}", url.QueryEscape(c.snapshot), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4891,15 +5413,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/snapshots")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4990,14 +5514,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/global/snapshots")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5077,16 +5603,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/operations/{operation}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{operation}", cleanPathString(c.operation), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -5155,16 +5683,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/operations/{operation}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
-	urls = strings.Replace(urls, "{operation}", cleanPathString(c.operation), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5271,15 +5801,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}/operations")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5365,15 +5897,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones/{zone}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{zone}", cleanPathString(c.zone), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5470,14 +6004,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta14/projects/", "{project}/zones")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5532,12 +6068,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/compute/v1beta15/compute-api.json b/compute/v1beta15/compute-api.json
new file mode 100644
index 0000000..7241f7b
--- /dev/null
+++ b/compute/v1beta15/compute-api.json
@@ -0,0 +1,4860 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/wetrrAkJQ7JNrVT0kRi0gI5y0fE\"",
+ "discoveryVersion": "v1",
+ "id": "compute:v1beta15",
+ "name": "compute",
+ "version": "v1beta15",
+ "revision": "20130320",
+ "title": "Compute Engine API",
+ "description": "API for the Google Compute Engine service.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/compute_engine-16.png",
+  "x32": "http://www.google.com/images/icons/product/compute_engine-32.png"
+ },
+ "documentationLink": "https://developers.google.com/compute/docs/reference/v1beta15",
+ "labels": [
+  "limited_availability"
+ ],
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/compute/v1beta15/projects/",
+ "basePath": "/compute/v1beta15/projects/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "compute/v1beta15/projects/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/compute": {
+     "description": "View and manage your Google Compute Engine resources"
+    },
+    "https://www.googleapis.com/auth/compute.readonly": {
+     "description": "View your Google Compute Engine resources"
+    },
+    "https://www.googleapis.com/auth/devstorage.read_only": {
+     "description": "View your data in Google Cloud Storage"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "AccessConfig": {
+   "id": "AccessConfig",
+   "type": "object",
+   "description": "An access configuration attached to an instance's network interface.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#accessConfig"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of this access configuration."
+    },
+    "natIP": {
+     "type": "string",
+     "description": "An external IP address associated with this instance. Specify an unused static IP address available to the project. If not specified, the external IP will be drawn from a shared ephemeral pool."
+    },
+    "type": {
+     "type": "string",
+     "description": "Type of configuration. Must be set to \"ONE_TO_ONE_NAT\". This configures port-for-port NAT to the internet.",
+     "default": "ONE_TO_ONE_NAT"
+    }
+   }
+  },
+  "Address": {
+   "id": "Address",
+   "type": "object",
+   "description": "A reserved address resource.",
+   "properties": {
+    "address": {
+     "type": "string",
+     "description": "The IP address represented by this resource."
+    },
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#address"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.addresses.insert"
+      ]
+     }
+    },
+    "region": {
+     "type": "string",
+     "description": "URL of the region where the address resides (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "status": {
+     "type": "string",
+     "description": "The status of the address (output only)."
+    },
+    "user": {
+     "type": "string",
+     "description": "URL of the resource currently using this address (output only)."
+    }
+   }
+  },
+  "AddressAggregatedList": {
+   "id": "AddressAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "object",
+     "description": "A map of scoped address lists.",
+     "additionalProperties": {
+      "$ref": "AddressesScopedList",
+      "description": "Name of the scope containing this set of addresses."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#addressAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "AddressList": {
+   "id": "AddressList",
+   "type": "object",
+   "description": "Contains a list of address resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The address resources.",
+     "items": {
+      "$ref": "Address"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#addressList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "AddressesScopedList": {
+   "id": "AddressesScopedList",
+   "type": "object",
+   "properties": {
+    "addresses": {
+     "type": "array",
+     "description": "List of addresses contained in this scope.",
+     "items": {
+      "$ref": "Address"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "Informational warning which replaces the list of addresses when the list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "The warning type identifier for this warning."
+      },
+      "data": {
+       "type": "array",
+       "description": "Metadata for this warning in 'key: value' format.",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "A key for the warning data."
+         },
+         "value": {
+          "type": "string",
+          "description": "A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "Optional human-readable details for this warning."
+      }
+     }
+    }
+   }
+  },
+  "AttachedDisk": {
+   "id": "AttachedDisk",
+   "type": "object",
+   "description": "An instance-attached disk resource.",
+   "properties": {
+    "boot": {
+     "type": "boolean",
+     "description": "Indicates that this is a boot disk. VM will use the first partition of the disk for its root filesystem."
+    },
+    "deviceName": {
+     "type": "string",
+     "description": "Persistent disk only; must be unique within the instance when specified. This represents a unique device name that is reflected into the /dev/ tree of a Linux operating system running within the instance. If not specified, a default will be chosen by the system."
+    },
+    "index": {
+     "type": "integer",
+     "description": "A zero-based index to assign to this disk, where 0 is reserved for the boot disk. If not specified, the server will choose an appropriate value (output only).",
+     "format": "int32"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#attachedDisk"
+    },
+    "mode": {
+     "type": "string",
+     "description": "The mode in which to attach this disk, either \"READ_WRITE\" or \"READ_ONLY\"."
+    },
+    "source": {
+     "type": "string",
+     "description": "Persistent disk only; the URL of the persistent disk resource."
+    },
+    "type": {
+     "type": "string",
+     "description": "Type of the disk, either \"SCRATCH\" or \"PERSISTENT\". Note that persistent disks must be created before you can specify them here.",
+     "annotations": {
+      "required": [
+       "compute.instances.insert"
+      ]
+     }
+    }
+   }
+  },
+  "DeprecationStatus": {
+   "id": "DeprecationStatus",
+   "type": "object",
+   "description": "Deprecation status for a public resource.",
+   "properties": {
+    "deleted": {
+     "type": "string",
+     "description": "An optional RFC3339 timestamp on or after which the deprecation state of this resource will be changed to DELETED."
+    },
+    "deprecated": {
+     "type": "string",
+     "description": "An optional RFC3339 timestamp on or after which the deprecation state of this resource will be changed to DEPRECATED."
+    },
+    "obsolete": {
+     "type": "string",
+     "description": "An optional RFC3339 timestamp on or after which the deprecation state of this resource will be changed to OBSOLETE."
+    },
+    "replacement": {
+     "type": "string",
+     "description": "A URL of the suggested replacement for the deprecated resource. The deprecated resource and its replacement must be resources of the same kind."
+    },
+    "state": {
+     "type": "string",
+     "description": "The deprecation state. Can be \"DEPRECATED\", \"OBSOLETE\", or \"DELETED\". Operations which create a new resource using a \"DEPRECATED\" resource will return successfully, but with a warning indicating the deprecated resource and recommending its replacement. New uses of \"OBSOLETE\" or \"DELETED\" resources will result in an error."
+    }
+   }
+  },
+  "Disk": {
+   "id": "Disk",
+   "type": "object",
+   "description": "A persistent disk resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#disk"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.disks.insert"
+      ]
+     }
+    },
+    "options": {
+     "type": "string",
+     "description": "Internal use only."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "sizeGb": {
+     "type": "string",
+     "description": "Size of the persistent disk, specified in GB. This parameter is optional when creating a disk from a disk image or a snapshot, otherwise it is required.",
+     "format": "int64"
+    },
+    "sourceSnapshot": {
+     "type": "string",
+     "description": "The source snapshot used to create this disk. Once the source snapshot has been deleted from the system, this field will be cleared, and will not be set even if a snapshot with the same name has been re-created."
+    },
+    "sourceSnapshotId": {
+     "type": "string",
+     "description": "The 'id' value of the snapshot used to create this disk. This value may be used to determine whether the disk was created from the current or a previous instance of a given disk snapshot."
+    },
+    "status": {
+     "type": "string",
+     "description": "The status of disk creation (output only)."
+    },
+    "zone": {
+     "type": "string",
+     "description": "URL of the zone where the disk resides (output only)."
+    }
+   }
+  },
+  "DiskAggregatedList": {
+   "id": "DiskAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "object",
+     "description": "A map of scoped disk lists.",
+     "additionalProperties": {
+      "$ref": "DisksScopedList",
+      "description": "Name of the scope containing this set of disks."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#diskAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "DiskList": {
+   "id": "DiskList",
+   "type": "object",
+   "description": "Contains a list of persistent disk resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The persistent disk resources.",
+     "items": {
+      "$ref": "Disk"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#diskList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "DisksScopedList": {
+   "id": "DisksScopedList",
+   "type": "object",
+   "properties": {
+    "disks": {
+     "type": "array",
+     "description": "List of disks contained in this scope.",
+     "items": {
+      "$ref": "Disk"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "Informational warning which replaces the list of disks when the list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "The warning type identifier for this warning."
+      },
+      "data": {
+       "type": "array",
+       "description": "Metadata for this warning in 'key: value' format.",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "A key for the warning data."
+         },
+         "value": {
+          "type": "string",
+          "description": "A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "Optional human-readable details for this warning."
+      }
+     }
+    }
+   }
+  },
+  "Firewall": {
+   "id": "Firewall",
+   "type": "object",
+   "description": "A firewall resource.",
+   "properties": {
+    "allowed": {
+     "type": "array",
+     "description": "The list of rules specified by this firewall. Each rule specifies a protocol and port-range tuple that describes a permitted connection.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "IPProtocol": {
+        "type": "string",
+        "description": "Required; this is the IP protocol that is allowed for this rule. This can either be a well known protocol string (tcp, udp or icmp) or the IP protocol number."
+       },
+       "ports": {
+        "type": "array",
+        "description": "An optional list of ports which are allowed. It is an error to specify this for any protocol that isn't UDP or TCP. Each entry must be either an integer or a range. If not specified, connections through any port are allowed.\n\nExample inputs include: [\"22\"], [\"80\",\"443\"] and [\"12345-12349\"].",
+        "items": {
+         "type": "string"
+        }
+       }
+      }
+     }
+    },
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#firewall"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.firewalls.insert",
+       "compute.firewalls.patch"
+      ]
+     }
+    },
+    "network": {
+     "type": "string",
+     "description": "URL of the network to which this firewall is applied; provided by the client when the firewall is created.",
+     "annotations": {
+      "required": [
+       "compute.firewalls.insert",
+       "compute.firewalls.patch"
+      ]
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "sourceRanges": {
+     "type": "array",
+     "description": "A list of IP address blocks expressed in CIDR format which this rule applies to. One or both of sourceRanges and sourceTags may be set; an inbound connection is allowed if either the range or the tag of the source matches.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "sourceTags": {
+     "type": "array",
+     "description": "A list of instance tags which this rule applies to. One or both of sourceRanges and sourceTags may be set; an inbound connection is allowed if either the range or the tag of the source matches.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "targetTags": {
+     "type": "array",
+     "description": "A list of instance tags indicating sets of instances located on network which may make network connections as specified in allowed. If no targetTags are specified, the firewall rule applies to all instances on the specified network.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "FirewallList": {
+   "id": "FirewallList",
+   "type": "object",
+   "description": "Contains a list of firewall resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The firewall resources.",
+     "items": {
+      "$ref": "Firewall"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#firewallList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "Image": {
+   "id": "Image",
+   "type": "object",
+   "description": "A disk image resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "The deprecation status associated with this image."
+    },
+    "description": {
+     "type": "string",
+     "description": "Textual description of the resource; provided by the client when the resource is created."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#image"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.images.insert"
+      ]
+     }
+    },
+    "preferredKernel": {
+     "type": "string",
+     "description": "An optional URL of the preferred kernel for use with this disk image. If not specified, a server defined default kernel will be used.",
+     "annotations": {
+      "required": [
+       "compute.images.insert"
+      ]
+     }
+    },
+    "rawDisk": {
+     "type": "object",
+     "description": "The raw disk image parameters.",
+     "properties": {
+      "containerType": {
+       "type": "string",
+       "description": "The format used to encode and transmit the block device. Should be TAR. This is just a container and transmission format and not a runtime format. Provided by the client when the disk image is created.",
+       "default": "TAR"
+      },
+      "sha1Checksum": {
+       "type": "string",
+       "description": "An optional SHA1 checksum of the disk image before unpackaging; provided by the client when the disk image is created.",
+       "pattern": "[a-f0-9]{40}"
+      },
+      "source": {
+       "type": "string",
+       "description": "The full Google Cloud Storage URL where the disk image is stored; provided by the client when the disk image is created.",
+       "annotations": {
+        "required": [
+         "compute.images.insert"
+        ]
+       }
+      }
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "sourceType": {
+     "type": "string",
+     "description": "Must be \"RAW\"; provided by the client when the disk image is created.",
+     "default": "RAW",
+     "annotations": {
+      "required": [
+       "compute.images.insert"
+      ]
+     }
+    },
+    "status": {
+     "type": "string",
+     "description": "Status of the image (output only). It will be one of the following READY - after image has been successfully created and is ready for use FAILED - if creating the image fails for some reason PENDING - the image creation is in progress An image can be used to create other resources suck as instances only after the image has been successfully created and the status is set to READY."
+    }
+   }
+  },
+  "ImageList": {
+   "id": "ImageList",
+   "type": "object",
+   "description": "Contains a list of disk image resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The disk image resources.",
+     "items": {
+      "$ref": "Image"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#imageList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "Instance": {
+   "id": "Instance",
+   "type": "object",
+   "description": "An instance resource.",
+   "properties": {
+    "canIpForward": {
+     "type": "boolean",
+     "description": "Allows this instance to send packets with source IP addresses other than its own and receive packets with destination IP addresses other than its own. If this instance will be used as an IP gateway or it will be set as the next-hop in a Route resource, say true. If unsure, leave this set to false."
+    },
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "disks": {
+     "type": "array",
+     "description": "Array of disks associated with this instance. Persistent disks must be created before you can assign them.",
+     "items": {
+      "$ref": "AttachedDisk"
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "image": {
+     "type": "string",
+     "description": "An optional URL of the disk image resource to be installed on this instance; provided by the client when the instance is created. Alternatively to passing the image, the client may choose to boot from a persistent disk, by setting boot=true flag on one of the entries in disks[] collection."
+    },
+    "kernel": {
+     "type": "string",
+     "description": "URL of the kernel resource to use when booting. In case of booting from persistent disk, this parameter is required. When booting from a disk image, it is optional, but may be provided to use a different kernel than the one associated with the image."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#instance"
+    },
+    "machineType": {
+     "type": "string",
+     "description": "URL of the machine type resource describing which machine type to use to host the instance; provided by the client when the instance is created.",
+     "annotations": {
+      "required": [
+       "compute.instances.insert"
+      ]
+     }
+    },
+    "metadata": {
+     "$ref": "Metadata",
+     "description": "Metadata key/value pairs assigned to this instance. Consists of custom metadata or predefined keys; see Instance documentation for more information."
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.instances.insert"
+      ]
+     }
+    },
+    "networkInterfaces": {
+     "type": "array",
+     "description": "Array of configurations for this interface. This specifies how this interface is configured to interact with other network services, such as connecting to the internet. Currently, ONE_TO_ONE_NAT is the only access config supported. If there are no accessConfigs specified, then this instance will have no external internet access.",
+     "items": {
+      "$ref": "NetworkInterface"
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    },
+    "serviceAccounts": {
+     "type": "array",
+     "description": "A list of service accounts each with specified scopes, for which access tokens are to be made available to the instance through metadata queries.",
+     "items": {
+      "$ref": "ServiceAccount"
+     }
+    },
+    "status": {
+     "type": "string",
+     "description": "Instance status. One of the following values: \"PROVISIONING\", \"STAGING\", \"RUNNING\", \"STOPPING\", \"STOPPED\", \"TERMINATED\" (output only)."
+    },
+    "statusMessage": {
+     "type": "string",
+     "description": "An optional, human-readable explanation of the status (output only)."
+    },
+    "tags": {
+     "$ref": "Tags",
+     "description": "A list of tags to be applied to this instance. Used to identify valid sources or targets for network firewalls. Provided by the client on instance creation. The tags can be later modified by the setTags method. Each tag within the list must comply with RFC1035."
+    },
+    "zone": {
+     "type": "string",
+     "description": "URL of the zone where the instance resides (output only)."
+    }
+   }
+  },
+  "InstanceAggregatedList": {
+   "id": "InstanceAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "object",
+     "description": "A map of scoped instance lists.",
+     "additionalProperties": {
+      "$ref": "InstancesScopedList",
+      "description": "Name of the scope containing this set of instances."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#instanceAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "InstanceList": {
+   "id": "InstanceList",
+   "type": "object",
+   "description": "Contains a list of instance resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "A list of instance resources.",
+     "items": {
+      "$ref": "Instance"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#instanceList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "InstancesScopedList": {
+   "id": "InstancesScopedList",
+   "type": "object",
+   "properties": {
+    "instances": {
+     "type": "array",
+     "description": "List of instances contained in this scope.",
+     "items": {
+      "$ref": "Instance"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "Informational warning which replaces the list of instances when the list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "The warning type identifier for this warning."
+      },
+      "data": {
+       "type": "array",
+       "description": "Metadata for this warning in 'key: value' format.",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "A key for the warning data."
+         },
+         "value": {
+          "type": "string",
+          "description": "A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "Optional human-readable details for this warning."
+      }
+     }
+    }
+   }
+  },
+  "Kernel": {
+   "id": "Kernel",
+   "type": "object",
+   "description": "A kernel resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "The deprecation status associated with this kernel."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#kernel"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?"
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    }
+   }
+  },
+  "KernelList": {
+   "id": "KernelList",
+   "type": "object",
+   "description": "Contains a list of kernel resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The kernel resources.",
+     "items": {
+      "$ref": "Kernel"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#kernelList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "MachineType": {
+   "id": "MachineType",
+   "type": "object",
+   "description": "A machine type resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "The deprecation status associated with this machine type."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource."
+    },
+    "guestCpus": {
+     "type": "integer",
+     "description": "Count of CPUs exposed to the instance.",
+     "format": "int32"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "imageSpaceGb": {
+     "type": "integer",
+     "description": "Space allotted for the image, defined in GB.",
+     "format": "int32"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#machineType"
+    },
+    "maximumPersistentDisks": {
+     "type": "integer",
+     "description": "Maximum persistent disks allowed.",
+     "format": "int32"
+    },
+    "maximumPersistentDisksSizeGb": {
+     "type": "string",
+     "description": "Maximum total persistent disks size (GB) allowed.",
+     "format": "int64"
+    },
+    "memoryMb": {
+     "type": "integer",
+     "description": "Physical memory assigned to the instance, defined in MB.",
+     "format": "int32"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?"
+    },
+    "scratchDisks": {
+     "type": "array",
+     "description": "List of extended scratch disks assigned to the instance.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "diskGb": {
+        "type": "integer",
+        "description": "Size of the scratch disk, defined in GB.",
+        "format": "int32"
+       }
+      }
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "zone": {
+     "type": "string",
+     "description": "Url of the zone where the machine type resides (output only)."
+    }
+   }
+  },
+  "MachineTypeAggregatedList": {
+   "id": "MachineTypeAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "object",
+     "description": "A map of scoped machine type lists.",
+     "additionalProperties": {
+      "$ref": "MachineTypesScopedList",
+      "description": "Name of the scope containing this set of machine types."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#machineTypeAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "MachineTypeList": {
+   "id": "MachineTypeList",
+   "type": "object",
+   "description": "Contains a list of machine type resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The machine type resources.",
+     "items": {
+      "$ref": "MachineType"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#machineTypeList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "MachineTypesScopedList": {
+   "id": "MachineTypesScopedList",
+   "type": "object",
+   "properties": {
+    "machineTypes": {
+     "type": "array",
+     "description": "List of machine types contained in this scope.",
+     "items": {
+      "$ref": "MachineType"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "Informational warning which replaces the list of machine types when the list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "The warning type identifier for this warning."
+      },
+      "data": {
+       "type": "array",
+       "description": "Metadata for this warning in 'key: value' format.",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "A key for the warning data."
+         },
+         "value": {
+          "type": "string",
+          "description": "A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "Optional human-readable details for this warning."
+      }
+     }
+    }
+   }
+  },
+  "Metadata": {
+   "id": "Metadata",
+   "type": "object",
+   "description": "A metadata key/value entry.",
+   "properties": {
+    "fingerprint": {
+     "type": "string",
+     "description": "Fingerprint of this resource. A hash of the metadata's contents. This field is used for optimistic locking. An up-to-date metadata fingerprint must be provided in order to modify metadata.",
+     "format": "byte"
+    },
+    "items": {
+     "type": "array",
+     "description": "Array of key/value pairs. The total size of all keys and values must be less than 512 KB.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "key": {
+        "type": "string",
+        "description": "Key for the metadata entry. Keys must conform to the following regexp: [a-zA-Z0-9-_]+, and be less than 128 bytes in length. This is reflected as part of a URL in the metadata server. Additionally, to avoid ambiguity, keys must not conflict with any other metadata keys for the project.",
+        "pattern": "[a-zA-Z0-9-_]{1,128}",
+        "annotations": {
+         "required": [
+          "compute.instances.insert",
+          "compute.projects.setCommonInstanceMetadata"
+         ]
+        }
+       },
+       "value": {
+        "type": "string",
+        "description": "Value for the metadata entry. These are free-form strings, and only have meaning as interpreted by the image running in the instance. The only restriction placed on values is that their size must be less than or equal to 32768 bytes.",
+        "annotations": {
+         "required": [
+          "compute.instances.insert",
+          "compute.projects.setCommonInstanceMetadata"
+         ]
+        }
+       }
+      }
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#metadata"
+    }
+   }
+  },
+  "Network": {
+   "id": "Network",
+   "type": "object",
+   "description": "A network resource.",
+   "properties": {
+    "IPv4Range": {
+     "type": "string",
+     "description": "Required; The range of internal addresses that are legal on this network. This range is a CIDR specification, for example: 192.168.0.0/16. Provided by the client when the network is created.",
+     "pattern": "[0-9]{1,3}(?:\\.[0-9]{1,3}){3}/[0-9]{1,2}",
+     "annotations": {
+      "required": [
+       "compute.networks.insert"
+      ]
+     }
+    },
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "gatewayIPv4": {
+     "type": "string",
+     "description": "An optional address that is used for default routing to other networks. This must be within the range specified by IPv4Range, and is typically the first usable address in that range. If not specified, the default value is the first usable address in IPv4Range.",
+     "pattern": "[0-9]{1,3}(?:\\.[0-9]{1,3}){3}"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#network"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.networks.insert"
+      ]
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    }
+   }
+  },
+  "NetworkInterface": {
+   "id": "NetworkInterface",
+   "type": "object",
+   "description": "A network interface resource attached to an instance.",
+   "properties": {
+    "accessConfigs": {
+     "type": "array",
+     "description": "Array of configurations for this interface. This specifies how this interface is configured to interact with other network services, such as connecting to the internet. Currently, ONE_TO_ONE_NAT is the only access config supported. If there are no accessConfigs specified, then this instance will have no external internet access.",
+     "items": {
+      "$ref": "AccessConfig"
+     }
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the network interface, determined by the server; for network devices, these are e.g. eth0, eth1, etc. (output only)."
+    },
+    "network": {
+     "type": "string",
+     "description": "URL of the network resource attached to this interface.",
+     "annotations": {
+      "required": [
+       "compute.instances.insert"
+      ]
+     }
+    },
+    "networkIP": {
+     "type": "string",
+     "description": "An optional IPV4 internal network address assigned to the instance for this network interface (output only)."
+    }
+   }
+  },
+  "NetworkList": {
+   "id": "NetworkList",
+   "type": "object",
+   "description": "Contains a list of network resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The network resources.",
+     "items": {
+      "$ref": "Network"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#networkList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "Operation": {
+   "id": "Operation",
+   "type": "object",
+   "description": "An operation resource, used to manage asynchronous API requests.",
+   "properties": {
+    "clientOperationId": {
+     "type": "string",
+     "description": "An optional identifier specified by the client when the mutation was initiated. Must be unique for all operation resources in the project (output only)."
+    },
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "endTime": {
+     "type": "string",
+     "description": "The time that this operation was completed. This is in RFC 3339 format (output only)."
+    },
+    "error": {
+     "type": "object",
+     "description": "If errors occurred during processing of this operation, this field will be populated (output only).",
+     "properties": {
+      "errors": {
+       "type": "array",
+       "description": "The array of errors encountered while processing this operation.",
+       "items": {
+        "type": "object",
+        "properties": {
+         "code": {
+          "type": "string",
+          "description": "The error type identifier for this error."
+         },
+         "location": {
+          "type": "string",
+          "description": "Indicates the field in the request which caused the error. This property is optional."
+         },
+         "message": {
+          "type": "string",
+          "description": "An optional, human-readable error message."
+         }
+        }
+       }
+      }
+     }
+    },
+    "httpErrorMessage": {
+     "type": "string",
+     "description": "If operation fails, the HTTP error message returned, e.g. NOT FOUND. (output only)."
+    },
+    "httpErrorStatusCode": {
+     "type": "integer",
+     "description": "If operation fails, the HTTP error status code returned, e.g. 404. (output only).",
+     "format": "int32"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "insertTime": {
+     "type": "string",
+     "description": "The time that this operation was requested. This is in RFC 3339 format (output only)."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#operation"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource (output only)."
+    },
+    "operationType": {
+     "type": "string",
+     "description": "Type of the operation. Examples include \"insert\", \"update\", and \"delete\" (output only)."
+    },
+    "progress": {
+     "type": "integer",
+     "description": "An optional progress indicator that ranges from 0 to 100. There is no requirement that this be linear or support any granularity of operations. This should not be used to guess at when the operation will be complete. This number should be monotonically increasing as the operation progresses (output only).",
+     "format": "int32"
+    },
+    "region": {
+     "type": "string",
+     "description": "URL of the region where the operation resides (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "startTime": {
+     "type": "string",
+     "description": "The time that this operation was started by the server. This is in RFC 3339 format (output only)."
+    },
+    "status": {
+     "type": "string",
+     "description": "Status of the operation. Can be one of the following: \"PENDING\", \"RUNNING\", or \"DONE\" (output only)."
+    },
+    "statusMessage": {
+     "type": "string",
+     "description": "An optional textual description of the current status of the operation (output only)."
+    },
+    "targetId": {
+     "type": "string",
+     "description": "Unique target id which identifies a particular incarnation of the target (output only).",
+     "format": "uint64"
+    },
+    "targetLink": {
+     "type": "string",
+     "description": "URL of the resource the operation is mutating (output only)."
+    },
+    "user": {
+     "type": "string",
+     "description": "User who requested the operation, for example \"user@example.com\" (output only)."
+    },
+    "warnings": {
+     "type": "array",
+     "description": "If warning messages generated during processing of this operation, this field will be populated (output only).",
+     "items": {
+      "type": "object",
+      "properties": {
+       "code": {
+        "type": "string",
+        "description": "The warning type identifier for this warning."
+       },
+       "data": {
+        "type": "array",
+        "description": "Metadata for this warning in 'key: value' format.",
+        "items": {
+         "type": "object",
+         "properties": {
+          "key": {
+           "type": "string",
+           "description": "A key for the warning data."
+          },
+          "value": {
+           "type": "string",
+           "description": "A warning data value corresponding to the key."
+          }
+         }
+        }
+       },
+       "message": {
+        "type": "string",
+        "description": "Optional human-readable details for this warning."
+       }
+      }
+     }
+    },
+    "zone": {
+     "type": "string",
+     "description": "URL of the zone where the operation resides (output only)."
+    }
+   }
+  },
+  "OperationAggregatedList": {
+   "id": "OperationAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "object",
+     "description": "A map of scoped operation lists.",
+     "additionalProperties": {
+      "$ref": "OperationsScopedList",
+      "description": "Name of the scope containing this set of operations."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#operationAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "OperationList": {
+   "id": "OperationList",
+   "type": "object",
+   "description": "Contains a list of operation resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The operation resources.",
+     "items": {
+      "$ref": "Operation"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#operationList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "OperationsScopedList": {
+   "id": "OperationsScopedList",
+   "type": "object",
+   "properties": {
+    "operations": {
+     "type": "array",
+     "description": "List of operations contained in this scope.",
+     "items": {
+      "$ref": "Operation"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "Informational warning which replaces the list of operations when the list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "The warning type identifier for this warning."
+      },
+      "data": {
+       "type": "array",
+       "description": "Metadata for this warning in 'key: value' format.",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "A key for the warning data."
+         },
+         "value": {
+          "type": "string",
+          "description": "A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "Optional human-readable details for this warning."
+      }
+     }
+    }
+   }
+  },
+  "Project": {
+   "id": "Project",
+   "type": "object",
+   "description": "A project resource. Projects can be created only in the APIs Console. Unless marked otherwise, values can only be modified in the console.",
+   "properties": {
+    "commonInstanceMetadata": {
+     "$ref": "Metadata",
+     "description": "Metadata key/value pairs available to all instances contained in this project."
+    },
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#project"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource."
+    },
+    "quotas": {
+     "type": "array",
+     "description": "Quotas assigned to this project.",
+     "items": {
+      "$ref": "Quota"
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    }
+   }
+  },
+  "Quota": {
+   "id": "Quota",
+   "type": "object",
+   "description": "A quotas entry.",
+   "properties": {
+    "limit": {
+     "type": "number",
+     "description": "Quota limit for this metric.",
+     "format": "double"
+    },
+    "metric": {
+     "type": "string",
+     "description": "Name of the quota metric."
+    },
+    "usage": {
+     "type": "number",
+     "description": "Current usage of this metric.",
+     "format": "double"
+    }
+   }
+  },
+  "Region": {
+   "id": "Region",
+   "type": "object",
+   "description": "Region resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "The deprecation status associated with this region."
+    },
+    "description": {
+     "type": "string",
+     "description": "Textual description of the resource."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#region"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource."
+    },
+    "quotas": {
+     "type": "array",
+     "description": "Quotas assigned to this region.",
+     "items": {
+      "$ref": "Quota"
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "status": {
+     "type": "string",
+     "description": "Status of the region, \"UP\" or \"DOWN\"."
+    },
+    "zones": {
+     "type": "array",
+     "description": "A list of zones homed in this region, in the form of resource URLs.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "RegionList": {
+   "id": "RegionList",
+   "type": "object",
+   "description": "Contains a list of region resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The region resources.",
+     "items": {
+      "$ref": "Region"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#regionList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "Route": {
+   "id": "Route",
+   "type": "object",
+   "description": "The route resource. A Route is a rule that specifies how certain packets should be handled by the virtual network. Routes are associated with VMs by tag and the set of Routes for a particular VM is called its routing table. For each packet leaving a VM, the system searches that VM's routing table for a single best matching Route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the Route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching Routes. The packet is then forwarded as specified by the next_hop field of the winning Route -- either to another VM destination, a VM gateway or a GCE operated gateway. Packets that do not match any Route in the sending VM's routing table will be dropped.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "destRange": {
+     "type": "string",
+     "description": "Which packets does this route apply to?",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#route"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "network": {
+     "type": "string",
+     "description": "URL of the network to which this route is applied; provided by the client when the route is created.",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "nextHopGateway": {
+     "type": "string",
+     "description": "The URL to a gateway that should handle matching packets."
+    },
+    "nextHopInstance": {
+     "type": "string",
+     "description": "The URL to an instance that should handle matching packets."
+    },
+    "nextHopIp": {
+     "type": "string",
+     "description": "The network IP address of an instance that should handle matching packets."
+    },
+    "nextHopNetwork": {
+     "type": "string",
+     "description": "The URL of the local network if it should handle matching packets."
+    },
+    "priority": {
+     "type": "integer",
+     "description": "Breaks ties between Routes of equal specificity. Routes with smaller values win when tied with routes with larger values.",
+     "format": "uint32",
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "tags": {
+     "type": "array",
+     "description": "A list of instance tags to which this route applies.",
+     "items": {
+      "type": "string"
+     },
+     "annotations": {
+      "required": [
+       "compute.routes.insert"
+      ]
+     }
+    },
+    "warnings": {
+     "type": "array",
+     "description": "If potential misconfigurations are detected for this route, this field will be populated with warning messages.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "code": {
+        "type": "string",
+        "description": "The warning type identifier for this warning."
+       },
+       "data": {
+        "type": "array",
+        "description": "Metadata for this warning in 'key: value' format.",
+        "items": {
+         "type": "object",
+         "properties": {
+          "key": {
+           "type": "string",
+           "description": "A key for the warning data."
+          },
+          "value": {
+           "type": "string",
+           "description": "A warning data value corresponding to the key."
+          }
+         }
+        }
+       },
+       "message": {
+        "type": "string",
+        "description": "Optional human-readable details for this warning."
+       }
+      }
+     }
+    }
+   }
+  },
+  "RouteList": {
+   "id": "RouteList",
+   "type": "object",
+   "description": "Contains a list of route resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The route resources.",
+     "items": {
+      "$ref": "Route"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#routeList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "SerialPortOutput": {
+   "id": "SerialPortOutput",
+   "type": "object",
+   "description": "An instance serial console output.",
+   "properties": {
+    "contents": {
+     "type": "string",
+     "description": "The contents of the console output."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#serialPortOutput"
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    }
+   }
+  },
+  "ServiceAccount": {
+   "id": "ServiceAccount",
+   "type": "object",
+   "description": "A service account.",
+   "properties": {
+    "email": {
+     "type": "string",
+     "description": "Email address of the service account."
+    },
+    "scopes": {
+     "type": "array",
+     "description": "The list of scopes to be made available for this service account.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "Snapshot": {
+   "id": "Snapshot",
+   "type": "object",
+   "description": "A persistent disk snapshot resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "description": {
+     "type": "string",
+     "description": "An optional textual description of the resource; provided by the client when the resource is created."
+    },
+    "diskSizeGb": {
+     "type": "string",
+     "description": "Size of the persistent disk snapshot, specified in GB (output only).",
+     "format": "int64"
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#snapshot"
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?"
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "sourceDisk": {
+     "type": "string",
+     "description": "The source disk used to create this snapshot. Once the source disk has been deleted from the system, this field will be cleared, and will not be set even if a disk with the same name has been re-created (output only)."
+    },
+    "sourceDiskId": {
+     "type": "string",
+     "description": "The 'id' value of the disk used to create this snapshot. This value may be used to determine whether the snapshot was taken from the current or a previous instance of a given disk name."
+    },
+    "status": {
+     "type": "string",
+     "description": "The status of the persistent disk snapshot (output only)."
+    }
+   }
+  },
+  "SnapshotList": {
+   "id": "SnapshotList",
+   "type": "object",
+   "description": "Contains a list of persistent disk snapshot resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The persistent snapshot resources.",
+     "items": {
+      "$ref": "Snapshot"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#snapshotList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  },
+  "Tags": {
+   "id": "Tags",
+   "type": "object",
+   "description": "A set of instance tags.",
+   "properties": {
+    "fingerprint": {
+     "type": "string",
+     "description": "Fingerprint of this resource. A hash of the tags stored in this object. This field is used optimistic locking. An up-to-date tags fingerprint must be provided in order to modify tags.",
+     "format": "byte"
+    },
+    "items": {
+     "type": "array",
+     "description": "An array of tags. Each tag must be 1-63 characters long, and comply with RFC1035.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "Zone": {
+   "id": "Zone",
+   "type": "object",
+   "description": "A zone resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "Creation timestamp in RFC3339 text format (output only)."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "The deprecation status associated with this zone."
+    },
+    "description": {
+     "type": "string",
+     "description": "Textual description of the resource."
+    },
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of the resource.",
+     "default": "compute#zone"
+    },
+    "maintenanceWindows": {
+     "type": "array",
+     "description": "Scheduled maintenance windows for the zone. When the zone is in a maintenance window, all resources which reside in the zone will be unavailable.",
+     "items": {
+      "type": "object",
+      "properties": {
+       "beginTime": {
+        "type": "string",
+        "description": "Begin time of the maintenance window, in RFC 3339 format."
+       },
+       "description": {
+        "type": "string",
+        "description": "Textual description of the maintenance window."
+       },
+       "endTime": {
+        "type": "string",
+        "description": "End time of the maintenance window, in RFC 3339 format."
+       },
+       "name": {
+        "type": "string",
+        "description": "Name of the maintenance window."
+       }
+      }
+     }
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of the resource."
+    },
+    "quotas": {
+     "type": "array",
+     "description": "Quotas assigned to this zone.",
+     "items": {
+      "$ref": "Quota"
+     }
+    },
+    "region": {
+     "type": "string",
+     "description": "Full URL reference to the region which hosts the zone (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for the resource (output only)."
+    },
+    "status": {
+     "type": "string",
+     "description": "Status of the zone. \"UP\" or \"DOWN\"."
+    }
+   }
+  },
+  "ZoneList": {
+   "id": "ZoneList",
+   "type": "object",
+   "description": "Contains a list of zone resources.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "Unique identifier for the resource; defined by the server (output only)."
+    },
+    "items": {
+     "type": "array",
+     "description": "The zone resources.",
+     "items": {
+      "$ref": "Zone"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Type of resource.",
+     "default": "compute#zoneList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "A token used to continue a truncated list request (output only)."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "Server defined URL for this resource (output only)."
+    }
+   }
+  }
+ },
+ "resources": {
+  "addresses": {
+   "methods": {
+    "aggregatedList": {
+     "id": "compute.addresses.aggregatedList",
+     "path": "{project}/aggregated/addresses",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of addresses grouped by scope.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "AddressAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "delete": {
+     "id": "compute.addresses.delete",
+     "path": "{project}/regions/{region}/addresses/{address}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified address resource.",
+     "parameters": {
+      "address": {
+       "type": "string",
+       "description": "Name of the address resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the region scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region",
+      "address"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.addresses.get",
+     "path": "{project}/regions/{region}/addresses/{address}",
+     "httpMethod": "GET",
+     "description": "Returns the specified address resource.",
+     "parameters": {
+      "address": {
+       "type": "string",
+       "description": "Name of the address resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the region scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region",
+      "address"
+     ],
+     "response": {
+      "$ref": "Address"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.addresses.insert",
+     "path": "{project}/regions/{region}/addresses",
+     "httpMethod": "POST",
+     "description": "Creates an address resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the region scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region"
+     ],
+     "request": {
+      "$ref": "Address"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "list": {
+     "id": "compute.addresses.list",
+     "path": "{project}/regions/{region}/addresses",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of address resources contained within the specified region.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the region scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region"
+     ],
+     "response": {
+      "$ref": "AddressList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "disks": {
+   "methods": {
+    "aggregatedList": {
+     "id": "compute.disks.aggregatedList",
+     "path": "{project}/aggregated/disks",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of disks grouped by scope.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "DiskAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "createSnapshot": {
+     "id": "compute.disks.createSnapshot",
+     "path": "{project}/zones/{zone}/disks/{disk}/createSnapshot",
+     "httpMethod": "POST",
+     "parameters": {
+      "disk": {
+       "type": "string",
+       "description": "Name of the persistent disk resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "disk"
+     ],
+     "request": {
+      "$ref": "Snapshot"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "delete": {
+     "id": "compute.disks.delete",
+     "path": "{project}/zones/{zone}/disks/{disk}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified persistent disk resource.",
+     "parameters": {
+      "disk": {
+       "type": "string",
+       "description": "Name of the persistent disk resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "disk"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.disks.get",
+     "path": "{project}/zones/{zone}/disks/{disk}",
+     "httpMethod": "GET",
+     "description": "Returns the specified persistent disk resource.",
+     "parameters": {
+      "disk": {
+       "type": "string",
+       "description": "Name of the persistent disk resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "disk"
+     ],
+     "response": {
+      "$ref": "Disk"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.disks.insert",
+     "path": "{project}/zones/{zone}/disks",
+     "httpMethod": "POST",
+     "description": "Creates a persistent disk resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "sourceImage": {
+       "type": "string",
+       "description": "Optional. Source image to restore onto a disk.",
+       "location": "query"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "request": {
+      "$ref": "Disk"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "list": {
+     "id": "compute.disks.list",
+     "path": "{project}/zones/{zone}/disks",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of persistent disk resources contained within the specified zone.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "DiskList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "firewalls": {
+   "methods": {
+    "delete": {
+     "id": "compute.firewalls.delete",
+     "path": "{project}/global/firewalls/{firewall}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified firewall resource.",
+     "parameters": {
+      "firewall": {
+       "type": "string",
+       "description": "Name of the firewall resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "firewall"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.firewalls.get",
+     "path": "{project}/global/firewalls/{firewall}",
+     "httpMethod": "GET",
+     "description": "Returns the specified firewall resource.",
+     "parameters": {
+      "firewall": {
+       "type": "string",
+       "description": "Name of the firewall resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "firewall"
+     ],
+     "response": {
+      "$ref": "Firewall"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.firewalls.insert",
+     "path": "{project}/global/firewalls",
+     "httpMethod": "POST",
+     "description": "Creates a firewall resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "request": {
+      "$ref": "Firewall"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "list": {
+     "id": "compute.firewalls.list",
+     "path": "{project}/global/firewalls",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of firewall resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "FirewallList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "patch": {
+     "id": "compute.firewalls.patch",
+     "path": "{project}/global/firewalls/{firewall}",
+     "httpMethod": "PATCH",
+     "description": "Updates the specified firewall resource with the data included in the request. This method supports patch semantics.",
+     "parameters": {
+      "firewall": {
+       "type": "string",
+       "description": "Name of the firewall resource to update.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "firewall"
+     ],
+     "request": {
+      "$ref": "Firewall"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "update": {
+     "id": "compute.firewalls.update",
+     "path": "{project}/global/firewalls/{firewall}",
+     "httpMethod": "PUT",
+     "description": "Updates the specified firewall resource with the data included in the request.",
+     "parameters": {
+      "firewall": {
+       "type": "string",
+       "description": "Name of the firewall resource to update.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "firewall"
+     ],
+     "request": {
+      "$ref": "Firewall"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    }
+   }
+  },
+  "globalOperations": {
+   "methods": {
+    "aggregatedList": {
+     "id": "compute.globalOperations.aggregatedList",
+     "path": "{project}/aggregated/operations",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of all operations grouped by scope.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "OperationAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "delete": {
+     "id": "compute.globalOperations.delete",
+     "path": "{project}/global/operations/{operation}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified operation resource.",
+     "parameters": {
+      "operation": {
+       "type": "string",
+       "description": "Name of the operation resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "operation"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.globalOperations.get",
+     "path": "{project}/global/operations/{operation}",
+     "httpMethod": "GET",
+     "description": "Retrieves the specified operation resource.",
+     "parameters": {
+      "operation": {
+       "type": "string",
+       "description": "Name of the operation resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "operation"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.globalOperations.list",
+     "path": "{project}/global/operations",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of operation resources contained within the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "OperationList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "images": {
+   "methods": {
+    "delete": {
+     "id": "compute.images.delete",
+     "path": "{project}/global/images/{image}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified image resource.",
+     "parameters": {
+      "image": {
+       "type": "string",
+       "description": "Name of the image resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "image"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "deprecate": {
+     "id": "compute.images.deprecate",
+     "path": "{project}/global/images/{image}/deprecate",
+     "httpMethod": "POST",
+     "description": "Sets the deprecation status of an image. If no message body is given, clears the deprecation status instead.",
+     "parameters": {
+      "image": {
+       "type": "string",
+       "description": "Image name.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "image"
+     ],
+     "request": {
+      "$ref": "DeprecationStatus"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.images.get",
+     "path": "{project}/global/images/{image}",
+     "httpMethod": "GET",
+     "description": "Returns the specified image resource.",
+     "parameters": {
+      "image": {
+       "type": "string",
+       "description": "Name of the image resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "image"
+     ],
+     "response": {
+      "$ref": "Image"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.images.insert",
+     "path": "{project}/global/images",
+     "httpMethod": "POST",
+     "description": "Creates an image resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "request": {
+      "$ref": "Image"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/devstorage.read_only"
+     ]
+    },
+    "list": {
+     "id": "compute.images.list",
+     "path": "{project}/global/images",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of image resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "ImageList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "instances": {
+   "methods": {
+    "addAccessConfig": {
+     "id": "compute.instances.addAccessConfig",
+     "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig",
+     "httpMethod": "POST",
+     "description": "Adds an access config to an instance's network interface.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Instance name.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "networkInterface": {
+       "type": "string",
+       "description": "Network interface name.",
+       "required": true,
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project name.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance",
+      "networkInterface"
+     ],
+     "request": {
+      "$ref": "AccessConfig"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "aggregatedList": {
+     "id": "compute.instances.aggregatedList",
+     "path": "{project}/aggregated/instances",
+     "httpMethod": "GET",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "InstanceAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "attachDisk": {
+     "id": "compute.instances.attachDisk",
+     "path": "{project}/zones/{zone}/instances/{instance}/attachDisk",
+     "httpMethod": "POST",
+     "description": "Attaches a disk resource to an instance.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Instance name.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project name.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "request": {
+      "$ref": "AttachedDisk"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "delete": {
+     "id": "compute.instances.delete",
+     "path": "{project}/zones/{zone}/instances/{instance}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified instance resource.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Name of the instance resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "deleteAccessConfig": {
+     "id": "compute.instances.deleteAccessConfig",
+     "path": "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig",
+     "httpMethod": "POST",
+     "description": "Deletes an access config from an instance's network interface.",
+     "parameters": {
+      "accessConfig": {
+       "type": "string",
+       "description": "Access config name.",
+       "required": true,
+       "location": "query"
+      },
+      "instance": {
+       "type": "string",
+       "description": "Instance name.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "networkInterface": {
+       "type": "string",
+       "description": "Network interface name.",
+       "required": true,
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project name.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance",
+      "accessConfig",
+      "networkInterface"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "detachDisk": {
+     "id": "compute.instances.detachDisk",
+     "path": "{project}/zones/{zone}/instances/{instance}/detachDisk",
+     "httpMethod": "POST",
+     "description": "Detaches a disk from an instance.",
+     "parameters": {
+      "deviceName": {
+       "type": "string",
+       "description": "Disk device name to detach.",
+       "required": true,
+       "pattern": "\\w[\\w.-]{0,254}",
+       "location": "query"
+      },
+      "instance": {
+       "type": "string",
+       "description": "Instance name.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project name.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance",
+      "deviceName"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.instances.get",
+     "path": "{project}/zones/{zone}/instances/{instance}",
+     "httpMethod": "GET",
+     "description": "Returns the specified instance resource.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Name of the instance resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "response": {
+      "$ref": "Instance"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "getSerialPortOutput": {
+     "id": "compute.instances.getSerialPortOutput",
+     "path": "{project}/zones/{zone}/instances/{instance}/serialPort",
+     "httpMethod": "GET",
+     "description": "Returns the specified instance's serial port output.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Name of the instance scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "response": {
+      "$ref": "SerialPortOutput"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.instances.insert",
+     "path": "{project}/zones/{zone}/instances",
+     "httpMethod": "POST",
+     "description": "Creates an instance resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "request": {
+      "$ref": "Instance"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "list": {
+     "id": "compute.instances.list",
+     "path": "{project}/zones/{zone}/instances",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of instance resources contained within the specified zone.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "InstanceList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "setMetadata": {
+     "id": "compute.instances.setMetadata",
+     "path": "{project}/zones/{zone}/instances/{instance}/setMetadata",
+     "httpMethod": "POST",
+     "description": "Sets metadata for the specified instance to the data included in the request.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Name of the instance scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "request": {
+      "$ref": "Metadata"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "setTags": {
+     "id": "compute.instances.setTags",
+     "path": "{project}/zones/{zone}/instances/{instance}/setTags",
+     "httpMethod": "POST",
+     "description": "Sets tags for the specified instance to the data included in the request.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Name of the instance scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "request": {
+      "$ref": "Tags"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    }
+   }
+  },
+  "kernels": {
+   "methods": {
+    "get": {
+     "id": "compute.kernels.get",
+     "path": "{project}/global/kernels/{kernel}",
+     "httpMethod": "GET",
+     "description": "Returns the specified kernel resource.",
+     "parameters": {
+      "kernel": {
+       "type": "string",
+       "description": "Name of the kernel resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "kernel"
+     ],
+     "response": {
+      "$ref": "Kernel"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.kernels.list",
+     "path": "{project}/global/kernels",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of kernel resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "KernelList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "machineTypes": {
+   "methods": {
+    "aggregatedList": {
+     "id": "compute.machineTypes.aggregatedList",
+     "path": "{project}/aggregated/machineTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of machine type resources grouped by scope.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "MachineTypeAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "get": {
+     "id": "compute.machineTypes.get",
+     "path": "{project}/zones/{zone}/machineTypes/{machineType}",
+     "httpMethod": "GET",
+     "description": "Returns the specified machine type resource.",
+     "parameters": {
+      "machineType": {
+       "type": "string",
+       "description": "Name of the machine type resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "machineType"
+     ],
+     "response": {
+      "$ref": "MachineType"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.machineTypes.list",
+     "path": "{project}/zones/{zone}/machineTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of machine type resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "MachineTypeList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "networks": {
+   "methods": {
+    "delete": {
+     "id": "compute.networks.delete",
+     "path": "{project}/global/networks/{network}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified network resource.",
+     "parameters": {
+      "network": {
+       "type": "string",
+       "description": "Name of the network resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "network"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.networks.get",
+     "path": "{project}/global/networks/{network}",
+     "httpMethod": "GET",
+     "description": "Returns the specified network resource.",
+     "parameters": {
+      "network": {
+       "type": "string",
+       "description": "Name of the network resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "network"
+     ],
+     "response": {
+      "$ref": "Network"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.networks.insert",
+     "path": "{project}/global/networks",
+     "httpMethod": "POST",
+     "description": "Creates a network resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "request": {
+      "$ref": "Network"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "list": {
+     "id": "compute.networks.list",
+     "path": "{project}/global/networks",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of network resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "NetworkList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "projects": {
+   "methods": {
+    "get": {
+     "id": "compute.projects.get",
+     "path": "{project}",
+     "httpMethod": "GET",
+     "description": "Returns the specified project resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project resource to retrieve.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "Project"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "setCommonInstanceMetadata": {
+     "id": "compute.projects.setCommonInstanceMetadata",
+     "path": "{project}/setCommonInstanceMetadata",
+     "httpMethod": "POST",
+     "description": "Sets metadata common to all instances within the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "request": {
+      "$ref": "Metadata"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    }
+   }
+  },
+  "regionOperations": {
+   "methods": {
+    "delete": {
+     "id": "compute.regionOperations.delete",
+     "path": "{project}/regions/{region}/operations/{operation}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified region-specific operation resource.",
+     "parameters": {
+      "operation": {
+       "type": "string",
+       "description": "Name of the operation resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the region scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region",
+      "operation"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.regionOperations.get",
+     "path": "{project}/regions/{region}/operations/{operation}",
+     "httpMethod": "GET",
+     "description": "Retrieves the specified region-specific operation resource.",
+     "parameters": {
+      "operation": {
+       "type": "string",
+       "description": "Name of the operation resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region",
+      "operation"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.regionOperations.list",
+     "path": "{project}/regions/{region}/operations",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of operation resources contained within the specified region.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the region scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region"
+     ],
+     "response": {
+      "$ref": "OperationList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "regions": {
+   "methods": {
+    "get": {
+     "id": "compute.regions.get",
+     "path": "{project}/regions/{region}",
+     "httpMethod": "GET",
+     "description": "Returns the specified region resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "Name of the region resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region"
+     ],
+     "response": {
+      "$ref": "Region"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.regions.list",
+     "path": "{project}/regions",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of region resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "RegionList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "routes": {
+   "methods": {
+    "delete": {
+     "id": "compute.routes.delete",
+     "path": "{project}/global/routes/{route}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified route resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "route": {
+       "type": "string",
+       "description": "Name of the route resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "route"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.routes.get",
+     "path": "{project}/global/routes/{route}",
+     "httpMethod": "GET",
+     "description": "Returns the specified route resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "route": {
+       "type": "string",
+       "description": "Name of the route resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "route"
+     ],
+     "response": {
+      "$ref": "Route"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "insert": {
+     "id": "compute.routes.insert",
+     "path": "{project}/global/routes",
+     "httpMethod": "POST",
+     "description": "Creates a route resource in the specified project using the data included in the request.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "request": {
+      "$ref": "Route"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "list": {
+     "id": "compute.routes.list",
+     "path": "{project}/global/routes",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of route resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "RouteList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "snapshots": {
+   "methods": {
+    "delete": {
+     "id": "compute.snapshots.delete",
+     "path": "{project}/global/snapshots/{snapshot}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified persistent disk snapshot resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "snapshot": {
+       "type": "string",
+       "description": "Name of the persistent disk snapshot resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "snapshot"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.snapshots.get",
+     "path": "{project}/global/snapshots/{snapshot}",
+     "httpMethod": "GET",
+     "description": "Returns the specified persistent disk snapshot resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "snapshot": {
+       "type": "string",
+       "description": "Name of the persistent disk snapshot resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "snapshot"
+     ],
+     "response": {
+      "$ref": "Snapshot"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.snapshots.list",
+     "path": "{project}/global/snapshots",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of persistent disk snapshot resources contained within the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "SnapshotList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "zoneOperations": {
+   "methods": {
+    "delete": {
+     "id": "compute.zoneOperations.delete",
+     "path": "{project}/zones/{zone}/operations/{operation}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the specified zone-specific operation resource.",
+     "parameters": {
+      "operation": {
+       "type": "string",
+       "description": "Name of the operation resource to delete.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "operation"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "get": {
+     "id": "compute.zoneOperations.get",
+     "path": "{project}/zones/{zone}/operations/{operation}",
+     "httpMethod": "GET",
+     "description": "Retrieves the specified zone-specific operation resource.",
+     "parameters": {
+      "operation": {
+       "type": "string",
+       "description": "Name of the operation resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "operation"
+     ],
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.zoneOperations.list",
+     "path": "{project}/zones/{zone}/operations",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of operation resources contained within the specified zone.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "OperationList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
+  "zones": {
+   "methods": {
+    "get": {
+     "id": "compute.zones.get",
+     "path": "{project}/zones/{zone}",
+     "httpMethod": "GET",
+     "description": "Returns the specified zone resource.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "Name of the zone resource to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "Zone"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.zones.list",
+     "path": "{project}/zones",
+     "httpMethod": "GET",
+     "description": "Retrieves the list of zone resources available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Optional. Filter expression for filtering listed resources.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+       "default": "100",
+       "format": "uint32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Name of the project scoping this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "ZoneList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/compute/v1beta15/compute-gen.go b/compute/v1beta15/compute-gen.go
new file mode 100644
index 0000000..4bd66f3
--- /dev/null
+++ b/compute/v1beta15/compute-gen.go
@@ -0,0 +1,7999 @@
+// Package compute provides access to the Compute Engine API.
+//
+// See https://developers.google.com/compute/docs/reference/v1beta15
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/compute/v1beta15"
+//   ...
+//   computeService, err := compute.New(oauthHttpClient)
+package compute
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "compute:v1beta15"
+const apiName = "compute"
+const apiVersion = "v1beta15"
+const basePath = "https://www.googleapis.com/compute/v1beta15/projects/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View and manage your Google Compute Engine resources
+	ComputeScope = "https://www.googleapis.com/auth/compute"
+
+	// View your Google Compute Engine resources
+	ComputeReadonlyScope = "https://www.googleapis.com/auth/compute.readonly"
+
+	// View your data in Google Cloud Storage
+	DevstorageRead_onlyScope = "https://www.googleapis.com/auth/devstorage.read_only"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.Addresses = NewAddressesService(s)
+	s.Disks = NewDisksService(s)
+	s.Firewalls = NewFirewallsService(s)
+	s.GlobalOperations = NewGlobalOperationsService(s)
+	s.Images = NewImagesService(s)
+	s.Instances = NewInstancesService(s)
+	s.Kernels = NewKernelsService(s)
+	s.MachineTypes = NewMachineTypesService(s)
+	s.Networks = NewNetworksService(s)
+	s.Projects = NewProjectsService(s)
+	s.RegionOperations = NewRegionOperationsService(s)
+	s.Regions = NewRegionsService(s)
+	s.Routes = NewRoutesService(s)
+	s.Snapshots = NewSnapshotsService(s)
+	s.ZoneOperations = NewZoneOperationsService(s)
+	s.Zones = NewZonesService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	Addresses *AddressesService
+
+	Disks *DisksService
+
+	Firewalls *FirewallsService
+
+	GlobalOperations *GlobalOperationsService
+
+	Images *ImagesService
+
+	Instances *InstancesService
+
+	Kernels *KernelsService
+
+	MachineTypes *MachineTypesService
+
+	Networks *NetworksService
+
+	Projects *ProjectsService
+
+	RegionOperations *RegionOperationsService
+
+	Regions *RegionsService
+
+	Routes *RoutesService
+
+	Snapshots *SnapshotsService
+
+	ZoneOperations *ZoneOperationsService
+
+	Zones *ZonesService
+}
+
+func NewAddressesService(s *Service) *AddressesService {
+	rs := &AddressesService{s: s}
+	return rs
+}
+
+type AddressesService struct {
+	s *Service
+}
+
+func NewDisksService(s *Service) *DisksService {
+	rs := &DisksService{s: s}
+	return rs
+}
+
+type DisksService struct {
+	s *Service
+}
+
+func NewFirewallsService(s *Service) *FirewallsService {
+	rs := &FirewallsService{s: s}
+	return rs
+}
+
+type FirewallsService struct {
+	s *Service
+}
+
+func NewGlobalOperationsService(s *Service) *GlobalOperationsService {
+	rs := &GlobalOperationsService{s: s}
+	return rs
+}
+
+type GlobalOperationsService struct {
+	s *Service
+}
+
+func NewImagesService(s *Service) *ImagesService {
+	rs := &ImagesService{s: s}
+	return rs
+}
+
+type ImagesService struct {
+	s *Service
+}
+
+func NewInstancesService(s *Service) *InstancesService {
+	rs := &InstancesService{s: s}
+	return rs
+}
+
+type InstancesService struct {
+	s *Service
+}
+
+func NewKernelsService(s *Service) *KernelsService {
+	rs := &KernelsService{s: s}
+	return rs
+}
+
+type KernelsService struct {
+	s *Service
+}
+
+func NewMachineTypesService(s *Service) *MachineTypesService {
+	rs := &MachineTypesService{s: s}
+	return rs
+}
+
+type MachineTypesService struct {
+	s *Service
+}
+
+func NewNetworksService(s *Service) *NetworksService {
+	rs := &NetworksService{s: s}
+	return rs
+}
+
+type NetworksService struct {
+	s *Service
+}
+
+func NewProjectsService(s *Service) *ProjectsService {
+	rs := &ProjectsService{s: s}
+	return rs
+}
+
+type ProjectsService struct {
+	s *Service
+}
+
+func NewRegionOperationsService(s *Service) *RegionOperationsService {
+	rs := &RegionOperationsService{s: s}
+	return rs
+}
+
+type RegionOperationsService struct {
+	s *Service
+}
+
+func NewRegionsService(s *Service) *RegionsService {
+	rs := &RegionsService{s: s}
+	return rs
+}
+
+type RegionsService struct {
+	s *Service
+}
+
+func NewRoutesService(s *Service) *RoutesService {
+	rs := &RoutesService{s: s}
+	return rs
+}
+
+type RoutesService struct {
+	s *Service
+}
+
+func NewSnapshotsService(s *Service) *SnapshotsService {
+	rs := &SnapshotsService{s: s}
+	return rs
+}
+
+type SnapshotsService struct {
+	s *Service
+}
+
+func NewZoneOperationsService(s *Service) *ZoneOperationsService {
+	rs := &ZoneOperationsService{s: s}
+	return rs
+}
+
+type ZoneOperationsService struct {
+	s *Service
+}
+
+func NewZonesService(s *Service) *ZonesService {
+	rs := &ZonesService{s: s}
+	return rs
+}
+
+type ZonesService struct {
+	s *Service
+}
+
+type AccessConfig struct {
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of this access configuration.
+	Name string `json:"name,omitempty"`
+
+	// NatIP: An external IP address associated with this instance. Specify
+	// an unused static IP address available to the project. If not
+	// specified, the external IP will be drawn from a shared ephemeral
+	// pool.
+	NatIP string `json:"natIP,omitempty"`
+
+	// Type: Type of configuration. Must be set to "ONE_TO_ONE_NAT". This
+	// configures port-for-port NAT to the internet.
+	Type string `json:"type,omitempty"`
+}
+
+type Address struct {
+	// Address: The IP address represented by this resource.
+	Address string `json:"address,omitempty"`
+
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// Region: URL of the region where the address resides (output only).
+	Region string `json:"region,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Status: The status of the address (output only).
+	Status string `json:"status,omitempty"`
+
+	// User: URL of the resource currently using this address (output only).
+	User string `json:"user,omitempty"`
+}
+
+type AddressAggregatedList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: A map of scoped address lists.
+	Items *AddressAggregatedListItems `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type AddressAggregatedListItems struct {
+}
+
+type AddressList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The address resources.
+	Items []*Address `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type AddressesScopedList struct {
+	// Addresses: List of addresses contained in this scope.
+	Addresses []*Address `json:"addresses,omitempty"`
+
+	// Warning: Informational warning which replaces the list of addresses
+	// when the list is empty.
+	Warning *AddressesScopedListWarning `json:"warning,omitempty"`
+}
+
+type AddressesScopedListWarning struct {
+	// Code: The warning type identifier for this warning.
+	Code string `json:"code,omitempty"`
+
+	// Data: Metadata for this warning in 'key: value' format.
+	Data []*AddressesScopedListWarningData `json:"data,omitempty"`
+
+	// Message: Optional human-readable details for this warning.
+	Message string `json:"message,omitempty"`
+}
+
+type AddressesScopedListWarningData struct {
+	// Key: A key for the warning data.
+	Key string `json:"key,omitempty"`
+
+	// Value: A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+}
+
+type AttachedDisk struct {
+	// Boot: Indicates that this is a boot disk. VM will use the first
+	// partition of the disk for its root filesystem.
+	Boot bool `json:"boot,omitempty"`
+
+	// DeviceName: Persistent disk only; must be unique within the instance
+	// when specified. This represents a unique device name that is
+	// reflected into the /dev/ tree of a Linux operating system running
+	// within the instance. If not specified, a default will be chosen by
+	// the system.
+	DeviceName string `json:"deviceName,omitempty"`
+
+	// Index: A zero-based index to assign to this disk, where 0 is reserved
+	// for the boot disk. If not specified, the server will choose an
+	// appropriate value (output only).
+	Index int64 `json:"index,omitempty"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Mode: The mode in which to attach this disk, either "READ_WRITE" or
+	// "READ_ONLY".
+	Mode string `json:"mode,omitempty"`
+
+	// Source: Persistent disk only; the URL of the persistent disk
+	// resource.
+	Source string `json:"source,omitempty"`
+
+	// Type: Type of the disk, either "SCRATCH" or "PERSISTENT". Note that
+	// persistent disks must be created before you can specify them here.
+	Type string `json:"type,omitempty"`
+}
+
+type DeprecationStatus struct {
+	// Deleted: An optional RFC3339 timestamp on or after which the
+	// deprecation state of this resource will be changed to DELETED.
+	Deleted string `json:"deleted,omitempty"`
+
+	// Deprecated: An optional RFC3339 timestamp on or after which the
+	// deprecation state of this resource will be changed to DEPRECATED.
+	Deprecated string `json:"deprecated,omitempty"`
+
+	// Obsolete: An optional RFC3339 timestamp on or after which the
+	// deprecation state of this resource will be changed to OBSOLETE.
+	Obsolete string `json:"obsolete,omitempty"`
+
+	// Replacement: A URL of the suggested replacement for the deprecated
+	// resource. The deprecated resource and its replacement must be
+	// resources of the same kind.
+	Replacement string `json:"replacement,omitempty"`
+
+	// State: The deprecation state. Can be "DEPRECATED", "OBSOLETE", or
+	// "DELETED". Operations which create a new resource using a
+	// "DEPRECATED" resource will return successfully, but with a warning
+	// indicating the deprecated resource and recommending its replacement.
+	// New uses of "OBSOLETE" or "DELETED" resources will result in an
+	// error.
+	State string `json:"state,omitempty"`
+}
+
+type Disk struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// Options: Internal use only.
+	Options string `json:"options,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// SizeGb: Size of the persistent disk, specified in GB. This parameter
+	// is optional when creating a disk from a disk image or a snapshot,
+	// otherwise it is required.
+	SizeGb int64 `json:"sizeGb,omitempty,string"`
+
+	// SourceSnapshot: The source snapshot used to create this disk. Once
+	// the source snapshot has been deleted from the system, this field will
+	// be cleared, and will not be set even if a snapshot with the same name
+	// has been re-created.
+	SourceSnapshot string `json:"sourceSnapshot,omitempty"`
+
+	// SourceSnapshotId: The 'id' value of the snapshot used to create this
+	// disk. This value may be used to determine whether the disk was
+	// created from the current or a previous instance of a given disk
+	// snapshot.
+	SourceSnapshotId string `json:"sourceSnapshotId,omitempty"`
+
+	// Status: The status of disk creation (output only).
+	Status string `json:"status,omitempty"`
+
+	// Zone: URL of the zone where the disk resides (output only).
+	Zone string `json:"zone,omitempty"`
+}
+
+type DiskAggregatedList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: A map of scoped disk lists.
+	Items *DiskAggregatedListItems `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type DiskAggregatedListItems struct {
+}
+
+type DiskList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The persistent disk resources.
+	Items []*Disk `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type DisksScopedList struct {
+	// Disks: List of disks contained in this scope.
+	Disks []*Disk `json:"disks,omitempty"`
+
+	// Warning: Informational warning which replaces the list of disks when
+	// the list is empty.
+	Warning *DisksScopedListWarning `json:"warning,omitempty"`
+}
+
+type DisksScopedListWarning struct {
+	// Code: The warning type identifier for this warning.
+	Code string `json:"code,omitempty"`
+
+	// Data: Metadata for this warning in 'key: value' format.
+	Data []*DisksScopedListWarningData `json:"data,omitempty"`
+
+	// Message: Optional human-readable details for this warning.
+	Message string `json:"message,omitempty"`
+}
+
+type DisksScopedListWarningData struct {
+	// Key: A key for the warning data.
+	Key string `json:"key,omitempty"`
+
+	// Value: A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+}
+
+type Firewall struct {
+	// Allowed: The list of rules specified by this firewall. Each rule
+	// specifies a protocol and port-range tuple that describes a permitted
+	// connection.
+	Allowed []*FirewallAllowed `json:"allowed,omitempty"`
+
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// Network: URL of the network to which this firewall is applied;
+	// provided by the client when the firewall is created.
+	Network string `json:"network,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// SourceRanges: A list of IP address blocks expressed in CIDR format
+	// which this rule applies to. One or both of sourceRanges and
+	// sourceTags may be set; an inbound connection is allowed if either the
+	// range or the tag of the source matches.
+	SourceRanges []string `json:"sourceRanges,omitempty"`
+
+	// SourceTags: A list of instance tags which this rule applies to. One
+	// or both of sourceRanges and sourceTags may be set; an inbound
+	// connection is allowed if either the range or the tag of the source
+	// matches.
+	SourceTags []string `json:"sourceTags,omitempty"`
+
+	// TargetTags: A list of instance tags indicating sets of instances
+	// located on network which may make network connections as specified in
+	// allowed. If no targetTags are specified, the firewall rule applies to
+	// all instances on the specified network.
+	TargetTags []string `json:"targetTags,omitempty"`
+}
+
+type FirewallAllowed struct {
+	// IPProtocol: Required; this is the IP protocol that is allowed for
+	// this rule. This can either be a well known protocol string (tcp, udp
+	// or icmp) or the IP protocol number.
+	IPProtocol string `json:"IPProtocol,omitempty"`
+
+	// Ports: An optional list of ports which are allowed. It is an error to
+	// specify this for any protocol that isn't UDP or TCP. Each entry must
+	// be either an integer or a range. If not specified, connections
+	// through any port are allowed.
+	//
+	// Example inputs include: ["22"],
+	// ["80","443"] and ["12345-12349"].
+	Ports []string `json:"ports,omitempty"`
+}
+
+type FirewallList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The firewall resources.
+	Items []*Firewall `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type Image struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: The deprecation status associated with this image.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: Textual description of the resource; provided by the
+	// client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// PreferredKernel: An optional URL of the preferred kernel for use with
+	// this disk image. If not specified, a server defined default kernel
+	// will be used.
+	PreferredKernel string `json:"preferredKernel,omitempty"`
+
+	// RawDisk: The raw disk image parameters.
+	RawDisk *ImageRawDisk `json:"rawDisk,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// SourceType: Must be "RAW"; provided by the client when the disk image
+	// is created.
+	SourceType string `json:"sourceType,omitempty"`
+
+	// Status: Status of the image (output only). It will be one of the
+	// following READY - after image has been successfully created and is
+	// ready for use FAILED - if creating the image fails for some reason
+	// PENDING - the image creation is in progress An image can be used to
+	// create other resources suck as instances only after the image has
+	// been successfully created and the status is set to READY.
+	Status string `json:"status,omitempty"`
+}
+
+type ImageRawDisk struct {
+	// ContainerType: The format used to encode and transmit the block
+	// device. Should be TAR. This is just a container and transmission
+	// format and not a runtime format. Provided by the client when the disk
+	// image is created.
+	ContainerType string `json:"containerType,omitempty"`
+
+	// Sha1Checksum: An optional SHA1 checksum of the disk image before
+	// unpackaging; provided by the client when the disk image is created.
+	Sha1Checksum string `json:"sha1Checksum,omitempty"`
+
+	// Source: The full Google Cloud Storage URL where the disk image is
+	// stored; provided by the client when the disk image is created.
+	Source string `json:"source,omitempty"`
+}
+
+type ImageList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The disk image resources.
+	Items []*Image `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type Instance struct {
+	// CanIpForward: Allows this instance to send packets with source IP
+	// addresses other than its own and receive packets with destination IP
+	// addresses other than its own. If this instance will be used as an IP
+	// gateway or it will be set as the next-hop in a Route resource, say
+	// true. If unsure, leave this set to false.
+	CanIpForward bool `json:"canIpForward,omitempty"`
+
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// Disks: Array of disks associated with this instance. Persistent disks
+	// must be created before you can assign them.
+	Disks []*AttachedDisk `json:"disks,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Image: An optional URL of the disk image resource to be installed on
+	// this instance; provided by the client when the instance is created.
+	// Alternatively to passing the image, the client may choose to boot
+	// from a persistent disk, by setting boot=true flag on one of the
+	// entries in disks[] collection.
+	Image string `json:"image,omitempty"`
+
+	// Kernel: URL of the kernel resource to use when booting. In case of
+	// booting from persistent disk, this parameter is required. When
+	// booting from a disk image, it is optional, but may be provided to use
+	// a different kernel than the one associated with the image.
+	Kernel string `json:"kernel,omitempty"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// MachineType: URL of the machine type resource describing which
+	// machine type to use to host the instance; provided by the client when
+	// the instance is created.
+	MachineType string `json:"machineType,omitempty"`
+
+	// Metadata: Metadata key/value pairs assigned to this instance.
+	// Consists of custom metadata or predefined keys; see Instance
+	// documentation for more information.
+	Metadata *Metadata `json:"metadata,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// NetworkInterfaces: Array of configurations for this interface. This
+	// specifies how this interface is configured to interact with other
+	// network services, such as connecting to the internet. Currently,
+	// ONE_TO_ONE_NAT is the only access config supported. If there are no
+	// accessConfigs specified, then this instance will have no external
+	// internet access.
+	NetworkInterfaces []*NetworkInterface `json:"networkInterfaces,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// ServiceAccounts: A list of service accounts each with specified
+	// scopes, for which access tokens are to be made available to the
+	// instance through metadata queries.
+	ServiceAccounts []*ServiceAccount `json:"serviceAccounts,omitempty"`
+
+	// Status: Instance status. One of the following values: "PROVISIONING",
+	// "STAGING", "RUNNING", "STOPPING", "STOPPED", "TERMINATED" (output
+	// only).
+	Status string `json:"status,omitempty"`
+
+	// StatusMessage: An optional, human-readable explanation of the status
+	// (output only).
+	StatusMessage string `json:"statusMessage,omitempty"`
+
+	// Tags: A list of tags to be applied to this instance. Used to identify
+	// valid sources or targets for network firewalls. Provided by the
+	// client on instance creation. The tags can be later modified by the
+	// setTags method. Each tag within the list must comply with RFC1035.
+	Tags *Tags `json:"tags,omitempty"`
+
+	// Zone: URL of the zone where the instance resides (output only).
+	Zone string `json:"zone,omitempty"`
+}
+
+type InstanceAggregatedList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: A map of scoped instance lists.
+	Items *InstanceAggregatedListItems `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type InstanceAggregatedListItems struct {
+}
+
+type InstanceList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: A list of instance resources.
+	Items []*Instance `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type InstancesScopedList struct {
+	// Instances: List of instances contained in this scope.
+	Instances []*Instance `json:"instances,omitempty"`
+
+	// Warning: Informational warning which replaces the list of instances
+	// when the list is empty.
+	Warning *InstancesScopedListWarning `json:"warning,omitempty"`
+}
+
+type InstancesScopedListWarning struct {
+	// Code: The warning type identifier for this warning.
+	Code string `json:"code,omitempty"`
+
+	// Data: Metadata for this warning in 'key: value' format.
+	Data []*InstancesScopedListWarningData `json:"data,omitempty"`
+
+	// Message: Optional human-readable details for this warning.
+	Message string `json:"message,omitempty"`
+}
+
+type InstancesScopedListWarningData struct {
+	// Key: A key for the warning data.
+	Key string `json:"key,omitempty"`
+
+	// Value: A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+}
+
+type Kernel struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: The deprecation status associated with this kernel.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: An optional textual description of the resource.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type KernelList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The kernel resources.
+	Items []*Kernel `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type MachineType struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: The deprecation status associated with this machine type.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: An optional textual description of the resource.
+	Description string `json:"description,omitempty"`
+
+	// GuestCpus: Count of CPUs exposed to the instance.
+	GuestCpus int64 `json:"guestCpus,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// ImageSpaceGb: Space allotted for the image, defined in GB.
+	ImageSpaceGb int64 `json:"imageSpaceGb,omitempty"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// MaximumPersistentDisks: Maximum persistent disks allowed.
+	MaximumPersistentDisks int64 `json:"maximumPersistentDisks,omitempty"`
+
+	// MaximumPersistentDisksSizeGb: Maximum total persistent disks size
+	// (GB) allowed.
+	MaximumPersistentDisksSizeGb int64 `json:"maximumPersistentDisksSizeGb,omitempty,string"`
+
+	// MemoryMb: Physical memory assigned to the instance, defined in MB.
+	MemoryMb int64 `json:"memoryMb,omitempty"`
+
+	// Name: Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// ScratchDisks: List of extended scratch disks assigned to the
+	// instance.
+	ScratchDisks []*MachineTypeScratchDisks `json:"scratchDisks,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Zone: Url of the zone where the machine type resides (output only).
+	Zone string `json:"zone,omitempty"`
+}
+
+type MachineTypeScratchDisks struct {
+	// DiskGb: Size of the scratch disk, defined in GB.
+	DiskGb int64 `json:"diskGb,omitempty"`
+}
+
+type MachineTypeAggregatedList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: A map of scoped machine type lists.
+	Items *MachineTypeAggregatedListItems `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type MachineTypeAggregatedListItems struct {
+}
+
+type MachineTypeList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The machine type resources.
+	Items []*MachineType `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type MachineTypesScopedList struct {
+	// MachineTypes: List of machine types contained in this scope.
+	MachineTypes []*MachineType `json:"machineTypes,omitempty"`
+
+	// Warning: Informational warning which replaces the list of machine
+	// types when the list is empty.
+	Warning *MachineTypesScopedListWarning `json:"warning,omitempty"`
+}
+
+type MachineTypesScopedListWarning struct {
+	// Code: The warning type identifier for this warning.
+	Code string `json:"code,omitempty"`
+
+	// Data: Metadata for this warning in 'key: value' format.
+	Data []*MachineTypesScopedListWarningData `json:"data,omitempty"`
+
+	// Message: Optional human-readable details for this warning.
+	Message string `json:"message,omitempty"`
+}
+
+type MachineTypesScopedListWarningData struct {
+	// Key: A key for the warning data.
+	Key string `json:"key,omitempty"`
+
+	// Value: A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+}
+
+type Metadata struct {
+	// Fingerprint: Fingerprint of this resource. A hash of the metadata's
+	// contents. This field is used for optimistic locking. An up-to-date
+	// metadata fingerprint must be provided in order to modify metadata.
+	Fingerprint string `json:"fingerprint,omitempty"`
+
+	// Items: Array of key/value pairs. The total size of all keys and
+	// values must be less than 512 KB.
+	Items []*MetadataItems `json:"items,omitempty"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+}
+
+type MetadataItems struct {
+	// Key: Key for the metadata entry. Keys must conform to the following
+	// regexp: [a-zA-Z0-9-_]+, and be less than 128 bytes in length. This is
+	// reflected as part of a URL in the metadata server. Additionally, to
+	// avoid ambiguity, keys must not conflict with any other metadata keys
+	// for the project.
+	Key string `json:"key,omitempty"`
+
+	// Value: Value for the metadata entry. These are free-form strings, and
+	// only have meaning as interpreted by the image running in the
+	// instance. The only restriction placed on values is that their size
+	// must be less than or equal to 32768 bytes.
+	Value string `json:"value,omitempty"`
+}
+
+type Network struct {
+	// IPv4Range: Required; The range of internal addresses that are legal
+	// on this network. This range is a CIDR specification, for example:
+	// 192.168.0.0/16. Provided by the client when the network is created.
+	IPv4Range string `json:"IPv4Range,omitempty"`
+
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// GatewayIPv4: An optional address that is used for default routing to
+	// other networks. This must be within the range specified by IPv4Range,
+	// and is typically the first usable address in that range. If not
+	// specified, the default value is the first usable address in
+	// IPv4Range.
+	GatewayIPv4 string `json:"gatewayIPv4,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type NetworkInterface struct {
+	// AccessConfigs: Array of configurations for this interface. This
+	// specifies how this interface is configured to interact with other
+	// network services, such as connecting to the internet. Currently,
+	// ONE_TO_ONE_NAT is the only access config supported. If there are no
+	// accessConfigs specified, then this instance will have no external
+	// internet access.
+	AccessConfigs []*AccessConfig `json:"accessConfigs,omitempty"`
+
+	// Name: Name of the network interface, determined by the server; for
+	// network devices, these are e.g. eth0, eth1, etc. (output only).
+	Name string `json:"name,omitempty"`
+
+	// Network: URL of the network resource attached to this interface.
+	Network string `json:"network,omitempty"`
+
+	// NetworkIP: An optional IPV4 internal network address assigned to the
+	// instance for this network interface (output only).
+	NetworkIP string `json:"networkIP,omitempty"`
+}
+
+type NetworkList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The network resources.
+	Items []*Network `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type Operation struct {
+	// ClientOperationId: An optional identifier specified by the client
+	// when the mutation was initiated. Must be unique for all operation
+	// resources in the project (output only).
+	ClientOperationId string `json:"clientOperationId,omitempty"`
+
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// EndTime: The time that this operation was completed. This is in RFC
+	// 3339 format (output only).
+	EndTime string `json:"endTime,omitempty"`
+
+	// Error: If errors occurred during processing of this operation, this
+	// field will be populated (output only).
+	Error *OperationError `json:"error,omitempty"`
+
+	// HttpErrorMessage: If operation fails, the HTTP error message
+	// returned, e.g. NOT FOUND. (output only).
+	HttpErrorMessage string `json:"httpErrorMessage,omitempty"`
+
+	// HttpErrorStatusCode: If operation fails, the HTTP error status code
+	// returned, e.g. 404. (output only).
+	HttpErrorStatusCode int64 `json:"httpErrorStatusCode,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// InsertTime: The time that this operation was requested. This is in
+	// RFC 3339 format (output only).
+	InsertTime string `json:"insertTime,omitempty"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource (output only).
+	Name string `json:"name,omitempty"`
+
+	// OperationType: Type of the operation. Examples include "insert",
+	// "update", and "delete" (output only).
+	OperationType string `json:"operationType,omitempty"`
+
+	// Progress: An optional progress indicator that ranges from 0 to 100.
+	// There is no requirement that this be linear or support any
+	// granularity of operations. This should not be used to guess at when
+	// the operation will be complete. This number should be monotonically
+	// increasing as the operation progresses (output only).
+	Progress int64 `json:"progress,omitempty"`
+
+	// Region: URL of the region where the operation resides (output only).
+	Region string `json:"region,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// StartTime: The time that this operation was started by the server.
+	// This is in RFC 3339 format (output only).
+	StartTime string `json:"startTime,omitempty"`
+
+	// Status: Status of the operation. Can be one of the following:
+	// "PENDING", "RUNNING", or "DONE" (output only).
+	Status string `json:"status,omitempty"`
+
+	// StatusMessage: An optional textual description of the current status
+	// of the operation (output only).
+	StatusMessage string `json:"statusMessage,omitempty"`
+
+	// TargetId: Unique target id which identifies a particular incarnation
+	// of the target (output only).
+	TargetId uint64 `json:"targetId,omitempty,string"`
+
+	// TargetLink: URL of the resource the operation is mutating (output
+	// only).
+	TargetLink string `json:"targetLink,omitempty"`
+
+	// User: User who requested the operation, for example
+	// "user@example.com" (output only).
+	User string `json:"user,omitempty"`
+
+	// Warnings: If warning messages generated during processing of this
+	// operation, this field will be populated (output only).
+	Warnings []*OperationWarnings `json:"warnings,omitempty"`
+
+	// Zone: URL of the zone where the operation resides (output only).
+	Zone string `json:"zone,omitempty"`
+}
+
+type OperationError struct {
+	// Errors: The array of errors encountered while processing this
+	// operation.
+	Errors []*OperationErrorErrors `json:"errors,omitempty"`
+}
+
+type OperationErrorErrors struct {
+	// Code: The error type identifier for this error.
+	Code string `json:"code,omitempty"`
+
+	// Location: Indicates the field in the request which caused the error.
+	// This property is optional.
+	Location string `json:"location,omitempty"`
+
+	// Message: An optional, human-readable error message.
+	Message string `json:"message,omitempty"`
+}
+
+type OperationWarnings struct {
+	// Code: The warning type identifier for this warning.
+	Code string `json:"code,omitempty"`
+
+	// Data: Metadata for this warning in 'key: value' format.
+	Data []*OperationWarningsData `json:"data,omitempty"`
+
+	// Message: Optional human-readable details for this warning.
+	Message string `json:"message,omitempty"`
+}
+
+type OperationWarningsData struct {
+	// Key: A key for the warning data.
+	Key string `json:"key,omitempty"`
+
+	// Value: A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+}
+
+type OperationAggregatedList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: A map of scoped operation lists.
+	Items *OperationAggregatedListItems `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type OperationAggregatedListItems struct {
+}
+
+type OperationList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The operation resources.
+	Items []*Operation `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type OperationsScopedList struct {
+	// Operations: List of operations contained in this scope.
+	Operations []*Operation `json:"operations,omitempty"`
+
+	// Warning: Informational warning which replaces the list of operations
+	// when the list is empty.
+	Warning *OperationsScopedListWarning `json:"warning,omitempty"`
+}
+
+type OperationsScopedListWarning struct {
+	// Code: The warning type identifier for this warning.
+	Code string `json:"code,omitempty"`
+
+	// Data: Metadata for this warning in 'key: value' format.
+	Data []*OperationsScopedListWarningData `json:"data,omitempty"`
+
+	// Message: Optional human-readable details for this warning.
+	Message string `json:"message,omitempty"`
+}
+
+type OperationsScopedListWarningData struct {
+	// Key: A key for the warning data.
+	Key string `json:"key,omitempty"`
+
+	// Value: A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+}
+
+type Project struct {
+	// CommonInstanceMetadata: Metadata key/value pairs available to all
+	// instances contained in this project.
+	CommonInstanceMetadata *Metadata `json:"commonInstanceMetadata,omitempty"`
+
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// Quotas: Quotas assigned to this project.
+	Quotas []*Quota `json:"quotas,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type Quota struct {
+	// Limit: Quota limit for this metric.
+	Limit float64 `json:"limit,omitempty"`
+
+	// Metric: Name of the quota metric.
+	Metric string `json:"metric,omitempty"`
+
+	// Usage: Current usage of this metric.
+	Usage float64 `json:"usage,omitempty"`
+}
+
+type Region struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: The deprecation status associated with this region.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: Textual description of the resource.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// Quotas: Quotas assigned to this region.
+	Quotas []*Quota `json:"quotas,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Status: Status of the region, "UP" or "DOWN".
+	Status string `json:"status,omitempty"`
+
+	// Zones: A list of zones homed in this region, in the form of resource
+	// URLs.
+	Zones []string `json:"zones,omitempty"`
+}
+
+type RegionList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The region resources.
+	Items []*Region `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type Route struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// DestRange: Which packets does this route apply to?
+	DestRange string `json:"destRange,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// Network: URL of the network to which this route is applied; provided
+	// by the client when the route is created.
+	Network string `json:"network,omitempty"`
+
+	// NextHopGateway: The URL to a gateway that should handle matching
+	// packets.
+	NextHopGateway string `json:"nextHopGateway,omitempty"`
+
+	// NextHopInstance: The URL to an instance that should handle matching
+	// packets.
+	NextHopInstance string `json:"nextHopInstance,omitempty"`
+
+	// NextHopIp: The network IP address of an instance that should handle
+	// matching packets.
+	NextHopIp string `json:"nextHopIp,omitempty"`
+
+	// NextHopNetwork: The URL of the local network if it should handle
+	// matching packets.
+	NextHopNetwork string `json:"nextHopNetwork,omitempty"`
+
+	// Priority: Breaks ties between Routes of equal specificity. Routes
+	// with smaller values win when tied with routes with larger values.
+	Priority int64 `json:"priority,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Tags: A list of instance tags to which this route applies.
+	Tags []string `json:"tags,omitempty"`
+
+	// Warnings: If potential misconfigurations are detected for this route,
+	// this field will be populated with warning messages.
+	Warnings []*RouteWarnings `json:"warnings,omitempty"`
+}
+
+type RouteWarnings struct {
+	// Code: The warning type identifier for this warning.
+	Code string `json:"code,omitempty"`
+
+	// Data: Metadata for this warning in 'key: value' format.
+	Data []*RouteWarningsData `json:"data,omitempty"`
+
+	// Message: Optional human-readable details for this warning.
+	Message string `json:"message,omitempty"`
+}
+
+type RouteWarningsData struct {
+	// Key: A key for the warning data.
+	Key string `json:"key,omitempty"`
+
+	// Value: A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+}
+
+type RouteList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The route resources.
+	Items []*Route `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type SerialPortOutput struct {
+	// Contents: The contents of the console output.
+	Contents string `json:"contents,omitempty"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type ServiceAccount struct {
+	// Email: Email address of the service account.
+	Email string `json:"email,omitempty"`
+
+	// Scopes: The list of scopes to be made available for this service
+	// account.
+	Scopes []string `json:"scopes,omitempty"`
+}
+
+type Snapshot struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Description: An optional textual description of the resource;
+	// provided by the client when the resource is created.
+	Description string `json:"description,omitempty"`
+
+	// DiskSizeGb: Size of the persistent disk snapshot, specified in GB
+	// (output only).
+	DiskSizeGb int64 `json:"diskSizeGb,omitempty,string"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: Name of the resource; provided by the client when the resource
+	// is created. The name must be 1-63 characters long, and comply with
+	// RFC1035.
+	Name string `json:"name,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// SourceDisk: The source disk used to create this snapshot. Once the
+	// source disk has been deleted from the system, this field will be
+	// cleared, and will not be set even if a disk with the same name has
+	// been re-created (output only).
+	SourceDisk string `json:"sourceDisk,omitempty"`
+
+	// SourceDiskId: The 'id' value of the disk used to create this
+	// snapshot. This value may be used to determine whether the snapshot
+	// was taken from the current or a previous instance of a given disk
+	// name.
+	SourceDiskId string `json:"sourceDiskId,omitempty"`
+
+	// Status: The status of the persistent disk snapshot (output only).
+	Status string `json:"status,omitempty"`
+}
+
+type SnapshotList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The persistent snapshot resources.
+	Items []*Snapshot `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+type Tags struct {
+	// Fingerprint: Fingerprint of this resource. A hash of the tags stored
+	// in this object. This field is used optimistic locking. An up-to-date
+	// tags fingerprint must be provided in order to modify tags.
+	Fingerprint string `json:"fingerprint,omitempty"`
+
+	// Items: An array of tags. Each tag must be 1-63 characters long, and
+	// comply with RFC1035.
+	Items []string `json:"items,omitempty"`
+}
+
+type Zone struct {
+	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+	// only).
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: The deprecation status associated with this zone.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: Textual description of the resource.
+	Description string `json:"description,omitempty"`
+
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: Type of the resource.
+	Kind string `json:"kind,omitempty"`
+
+	// MaintenanceWindows: Scheduled maintenance windows for the zone. When
+	// the zone is in a maintenance window, all resources which reside in
+	// the zone will be unavailable.
+	MaintenanceWindows []*ZoneMaintenanceWindows `json:"maintenanceWindows,omitempty"`
+
+	// Name: Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// Quotas: Quotas assigned to this zone.
+	Quotas []*Quota `json:"quotas,omitempty"`
+
+	// Region: Full URL reference to the region which hosts the zone (output
+	// only).
+	Region string `json:"region,omitempty"`
+
+	// SelfLink: Server defined URL for the resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Status: Status of the zone. "UP" or "DOWN".
+	Status string `json:"status,omitempty"`
+}
+
+type ZoneMaintenanceWindows struct {
+	// BeginTime: Begin time of the maintenance window, in RFC 3339 format.
+	BeginTime string `json:"beginTime,omitempty"`
+
+	// Description: Textual description of the maintenance window.
+	Description string `json:"description,omitempty"`
+
+	// EndTime: End time of the maintenance window, in RFC 3339 format.
+	EndTime string `json:"endTime,omitempty"`
+
+	// Name: Name of the maintenance window.
+	Name string `json:"name,omitempty"`
+}
+
+type ZoneList struct {
+	// Id: Unique identifier for the resource; defined by the server (output
+	// only).
+	Id string `json:"id,omitempty"`
+
+	// Items: The zone resources.
+	Items []*Zone `json:"items,omitempty"`
+
+	// Kind: Type of resource.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: A token used to continue a truncated list request
+	// (output only).
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: Server defined URL for this resource (output only).
+	SelfLink string `json:"selfLink,omitempty"`
+}
+
+// method id "compute.addresses.aggregatedList":
+
+type AddressesAggregatedListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// AggregatedList: Retrieves the list of addresses grouped by scope.
+func (r *AddressesService) AggregatedList(project string) *AddressesAggregatedListCall {
+	c := &AddressesAggregatedListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *AddressesAggregatedListCall) Filter(filter string) *AddressesAggregatedListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *AddressesAggregatedListCall) MaxResults(maxResults int64) *AddressesAggregatedListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *AddressesAggregatedListCall) PageToken(pageToken string) *AddressesAggregatedListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AddressesAggregatedListCall) Do() (*AddressAggregatedList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/aggregated/addresses")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AddressAggregatedList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of addresses grouped by scope.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.addresses.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/addresses",
+	//   "response": {
+	//     "$ref": "AddressAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.addresses.delete":
+
+type AddressesDeleteCall struct {
+	s       *Service
+	project string
+	region  string
+	address string
+	opt_    map[string]interface{}
+}
+
+// Delete: Deletes the specified address resource.
+func (r *AddressesService) Delete(project string, region string, address string) *AddressesDeleteCall {
+	c := &AddressesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	c.address = address
+	return c
+}
+
+func (c *AddressesDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}/addresses/{address}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{address}", url.QueryEscape(c.address), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified address resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.addresses.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region",
+	//     "address"
+	//   ],
+	//   "parameters": {
+	//     "address": {
+	//       "description": "Name of the address resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the region scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/addresses/{address}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.addresses.get":
+
+type AddressesGetCall struct {
+	s       *Service
+	project string
+	region  string
+	address string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified address resource.
+func (r *AddressesService) Get(project string, region string, address string) *AddressesGetCall {
+	c := &AddressesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	c.address = address
+	return c
+}
+
+func (c *AddressesGetCall) Do() (*Address, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}/addresses/{address}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{address}", url.QueryEscape(c.address), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Address)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified address resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.addresses.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region",
+	//     "address"
+	//   ],
+	//   "parameters": {
+	//     "address": {
+	//       "description": "Name of the address resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the region scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/addresses/{address}",
+	//   "response": {
+	//     "$ref": "Address"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.addresses.insert":
+
+type AddressesInsertCall struct {
+	s       *Service
+	project string
+	region  string
+	address *Address
+	opt_    map[string]interface{}
+}
+
+// Insert: Creates an address resource in the specified project using
+// the data included in the request.
+func (r *AddressesService) Insert(project string, region string, address *Address) *AddressesInsertCall {
+	c := &AddressesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	c.address = address
+	return c
+}
+
+func (c *AddressesInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}/addresses")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates an address resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.addresses.insert",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the region scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/addresses",
+	//   "request": {
+	//     "$ref": "Address"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.addresses.list":
+
+type AddressesListCall struct {
+	s       *Service
+	project string
+	region  string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of address resources contained within the
+// specified region.
+func (r *AddressesService) List(project string, region string) *AddressesListCall {
+	c := &AddressesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *AddressesListCall) Filter(filter string) *AddressesListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *AddressesListCall) MaxResults(maxResults int64) *AddressesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *AddressesListCall) PageToken(pageToken string) *AddressesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *AddressesListCall) Do() (*AddressList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}/addresses")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AddressList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of address resources contained within the specified region.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.addresses.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the region scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/addresses",
+	//   "response": {
+	//     "$ref": "AddressList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.disks.aggregatedList":
+
+type DisksAggregatedListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// AggregatedList: Retrieves the list of disks grouped by scope.
+func (r *DisksService) AggregatedList(project string) *DisksAggregatedListCall {
+	c := &DisksAggregatedListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *DisksAggregatedListCall) Filter(filter string) *DisksAggregatedListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *DisksAggregatedListCall) MaxResults(maxResults int64) *DisksAggregatedListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *DisksAggregatedListCall) PageToken(pageToken string) *DisksAggregatedListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *DisksAggregatedListCall) Do() (*DiskAggregatedList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/aggregated/disks")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(DiskAggregatedList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of disks grouped by scope.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.disks.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/disks",
+	//   "response": {
+	//     "$ref": "DiskAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.disks.createSnapshot":
+
+type DisksCreateSnapshotCall struct {
+	s        *Service
+	project  string
+	zone     string
+	disk     string
+	snapshot *Snapshot
+	opt_     map[string]interface{}
+}
+
+// CreateSnapshot:
+func (r *DisksService) CreateSnapshot(project string, zone string, disk string, snapshot *Snapshot) *DisksCreateSnapshotCall {
+	c := &DisksCreateSnapshotCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.disk = disk
+	c.snapshot = snapshot
+	return c
+}
+
+func (c *DisksCreateSnapshotCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/disks/{disk}/createSnapshot")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{disk}", url.QueryEscape(c.disk), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "httpMethod": "POST",
+	//   "id": "compute.disks.createSnapshot",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "disk"
+	//   ],
+	//   "parameters": {
+	//     "disk": {
+	//       "description": "Name of the persistent disk resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/disks/{disk}/createSnapshot",
+	//   "request": {
+	//     "$ref": "Snapshot"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.disks.delete":
+
+type DisksDeleteCall struct {
+	s       *Service
+	project string
+	zone    string
+	disk    string
+	opt_    map[string]interface{}
+}
+
+// Delete: Deletes the specified persistent disk resource.
+func (r *DisksService) Delete(project string, zone string, disk string) *DisksDeleteCall {
+	c := &DisksDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.disk = disk
+	return c
+}
+
+func (c *DisksDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/disks/{disk}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{disk}", url.QueryEscape(c.disk), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified persistent disk resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.disks.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "disk"
+	//   ],
+	//   "parameters": {
+	//     "disk": {
+	//       "description": "Name of the persistent disk resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/disks/{disk}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.disks.get":
+
+type DisksGetCall struct {
+	s       *Service
+	project string
+	zone    string
+	disk    string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified persistent disk resource.
+func (r *DisksService) Get(project string, zone string, disk string) *DisksGetCall {
+	c := &DisksGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.disk = disk
+	return c
+}
+
+func (c *DisksGetCall) Do() (*Disk, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/disks/{disk}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{disk}", url.QueryEscape(c.disk), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Disk)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified persistent disk resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.disks.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "disk"
+	//   ],
+	//   "parameters": {
+	//     "disk": {
+	//       "description": "Name of the persistent disk resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/disks/{disk}",
+	//   "response": {
+	//     "$ref": "Disk"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.disks.insert":
+
+type DisksInsertCall struct {
+	s       *Service
+	project string
+	zone    string
+	disk    *Disk
+	opt_    map[string]interface{}
+}
+
+// Insert: Creates a persistent disk resource in the specified project
+// using the data included in the request.
+func (r *DisksService) Insert(project string, zone string, disk *Disk) *DisksInsertCall {
+	c := &DisksInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.disk = disk
+	return c
+}
+
+// SourceImage sets the optional parameter "sourceImage": Source image
+// to restore onto a disk.
+func (c *DisksInsertCall) SourceImage(sourceImage string) *DisksInsertCall {
+	c.opt_["sourceImage"] = sourceImage
+	return c
+}
+
+func (c *DisksInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["sourceImage"]; ok {
+		params.Set("sourceImage", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/disks")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a persistent disk resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.disks.insert",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sourceImage": {
+	//       "description": "Optional. Source image to restore onto a disk.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/disks",
+	//   "request": {
+	//     "$ref": "Disk"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.disks.list":
+
+type DisksListCall struct {
+	s       *Service
+	project string
+	zone    string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of persistent disk resources contained
+// within the specified zone.
+func (r *DisksService) List(project string, zone string) *DisksListCall {
+	c := &DisksListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *DisksListCall) Filter(filter string) *DisksListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *DisksListCall) MaxResults(maxResults int64) *DisksListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *DisksListCall) PageToken(pageToken string) *DisksListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *DisksListCall) Do() (*DiskList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/disks")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(DiskList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of persistent disk resources contained within the specified zone.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.disks.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/disks",
+	//   "response": {
+	//     "$ref": "DiskList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.firewalls.delete":
+
+type FirewallsDeleteCall struct {
+	s        *Service
+	project  string
+	firewall string
+	opt_     map[string]interface{}
+}
+
+// Delete: Deletes the specified firewall resource.
+func (r *FirewallsService) Delete(project string, firewall string) *FirewallsDeleteCall {
+	c := &FirewallsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.firewall = firewall
+	return c
+}
+
+func (c *FirewallsDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/firewalls/{firewall}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified firewall resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.firewalls.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "firewall"
+	//   ],
+	//   "parameters": {
+	//     "firewall": {
+	//       "description": "Name of the firewall resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/firewalls/{firewall}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.firewalls.get":
+
+type FirewallsGetCall struct {
+	s        *Service
+	project  string
+	firewall string
+	opt_     map[string]interface{}
+}
+
+// Get: Returns the specified firewall resource.
+func (r *FirewallsService) Get(project string, firewall string) *FirewallsGetCall {
+	c := &FirewallsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.firewall = firewall
+	return c
+}
+
+func (c *FirewallsGetCall) Do() (*Firewall, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/firewalls/{firewall}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Firewall)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified firewall resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.firewalls.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "firewall"
+	//   ],
+	//   "parameters": {
+	//     "firewall": {
+	//       "description": "Name of the firewall resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/firewalls/{firewall}",
+	//   "response": {
+	//     "$ref": "Firewall"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.firewalls.insert":
+
+type FirewallsInsertCall struct {
+	s        *Service
+	project  string
+	firewall *Firewall
+	opt_     map[string]interface{}
+}
+
+// Insert: Creates a firewall resource in the specified project using
+// the data included in the request.
+func (r *FirewallsService) Insert(project string, firewall *Firewall) *FirewallsInsertCall {
+	c := &FirewallsInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.firewall = firewall
+	return c
+}
+
+func (c *FirewallsInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/firewalls")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a firewall resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.firewalls.insert",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/firewalls",
+	//   "request": {
+	//     "$ref": "Firewall"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.firewalls.list":
+
+type FirewallsListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of firewall resources available to the
+// specified project.
+func (r *FirewallsService) List(project string) *FirewallsListCall {
+	c := &FirewallsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *FirewallsListCall) Filter(filter string) *FirewallsListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *FirewallsListCall) MaxResults(maxResults int64) *FirewallsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *FirewallsListCall) PageToken(pageToken string) *FirewallsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *FirewallsListCall) Do() (*FirewallList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/firewalls")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(FirewallList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of firewall resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.firewalls.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/firewalls",
+	//   "response": {
+	//     "$ref": "FirewallList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.firewalls.patch":
+
+type FirewallsPatchCall struct {
+	s         *Service
+	project   string
+	firewall  string
+	firewall2 *Firewall
+	opt_      map[string]interface{}
+}
+
+// Patch: Updates the specified firewall resource with the data included
+// in the request. This method supports patch semantics.
+func (r *FirewallsService) Patch(project string, firewall string, firewall2 *Firewall) *FirewallsPatchCall {
+	c := &FirewallsPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.firewall = firewall
+	c.firewall2 = firewall2
+	return c
+}
+
+func (c *FirewallsPatchCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/firewalls/{firewall}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the specified firewall resource with the data included in the request. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "compute.firewalls.patch",
+	//   "parameterOrder": [
+	//     "project",
+	//     "firewall"
+	//   ],
+	//   "parameters": {
+	//     "firewall": {
+	//       "description": "Name of the firewall resource to update.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/firewalls/{firewall}",
+	//   "request": {
+	//     "$ref": "Firewall"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.firewalls.update":
+
+type FirewallsUpdateCall struct {
+	s         *Service
+	project   string
+	firewall  string
+	firewall2 *Firewall
+	opt_      map[string]interface{}
+}
+
+// Update: Updates the specified firewall resource with the data
+// included in the request.
+func (r *FirewallsService) Update(project string, firewall string, firewall2 *Firewall) *FirewallsUpdateCall {
+	c := &FirewallsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.firewall = firewall
+	c.firewall2 = firewall2
+	return c
+}
+
+func (c *FirewallsUpdateCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/firewalls/{firewall}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{firewall}", url.QueryEscape(c.firewall), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the specified firewall resource with the data included in the request.",
+	//   "httpMethod": "PUT",
+	//   "id": "compute.firewalls.update",
+	//   "parameterOrder": [
+	//     "project",
+	//     "firewall"
+	//   ],
+	//   "parameters": {
+	//     "firewall": {
+	//       "description": "Name of the firewall resource to update.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/firewalls/{firewall}",
+	//   "request": {
+	//     "$ref": "Firewall"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.globalOperations.aggregatedList":
+
+type GlobalOperationsAggregatedListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// AggregatedList: Retrieves the list of all operations grouped by
+// scope.
+func (r *GlobalOperationsService) AggregatedList(project string) *GlobalOperationsAggregatedListCall {
+	c := &GlobalOperationsAggregatedListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *GlobalOperationsAggregatedListCall) Filter(filter string) *GlobalOperationsAggregatedListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *GlobalOperationsAggregatedListCall) MaxResults(maxResults int64) *GlobalOperationsAggregatedListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *GlobalOperationsAggregatedListCall) PageToken(pageToken string) *GlobalOperationsAggregatedListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *GlobalOperationsAggregatedListCall) Do() (*OperationAggregatedList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/aggregated/operations")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OperationAggregatedList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of all operations grouped by scope.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.globalOperations.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/operations",
+	//   "response": {
+	//     "$ref": "OperationAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.globalOperations.delete":
+
+type GlobalOperationsDeleteCall struct {
+	s         *Service
+	project   string
+	operation string
+	opt_      map[string]interface{}
+}
+
+// Delete: Deletes the specified operation resource.
+func (r *GlobalOperationsService) Delete(project string, operation string) *GlobalOperationsDeleteCall {
+	c := &GlobalOperationsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.operation = operation
+	return c
+}
+
+func (c *GlobalOperationsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/operations/{operation}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes the specified operation resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.globalOperations.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "operation"
+	//   ],
+	//   "parameters": {
+	//     "operation": {
+	//       "description": "Name of the operation resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/operations/{operation}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.globalOperations.get":
+
+type GlobalOperationsGetCall struct {
+	s         *Service
+	project   string
+	operation string
+	opt_      map[string]interface{}
+}
+
+// Get: Retrieves the specified operation resource.
+func (r *GlobalOperationsService) Get(project string, operation string) *GlobalOperationsGetCall {
+	c := &GlobalOperationsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.operation = operation
+	return c
+}
+
+func (c *GlobalOperationsGetCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/operations/{operation}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the specified operation resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.globalOperations.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "operation"
+	//   ],
+	//   "parameters": {
+	//     "operation": {
+	//       "description": "Name of the operation resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/operations/{operation}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.globalOperations.list":
+
+type GlobalOperationsListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of operation resources contained within the
+// specified project.
+func (r *GlobalOperationsService) List(project string) *GlobalOperationsListCall {
+	c := &GlobalOperationsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *GlobalOperationsListCall) Filter(filter string) *GlobalOperationsListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *GlobalOperationsListCall) MaxResults(maxResults int64) *GlobalOperationsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *GlobalOperationsListCall) PageToken(pageToken string) *GlobalOperationsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *GlobalOperationsListCall) Do() (*OperationList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/operations")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OperationList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of operation resources contained within the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.globalOperations.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/operations",
+	//   "response": {
+	//     "$ref": "OperationList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.images.delete":
+
+type ImagesDeleteCall struct {
+	s       *Service
+	project string
+	image   string
+	opt_    map[string]interface{}
+}
+
+// Delete: Deletes the specified image resource.
+func (r *ImagesService) Delete(project string, image string) *ImagesDeleteCall {
+	c := &ImagesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.image = image
+	return c
+}
+
+func (c *ImagesDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/images/{image}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{image}", url.QueryEscape(c.image), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified image resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.images.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "image"
+	//   ],
+	//   "parameters": {
+	//     "image": {
+	//       "description": "Name of the image resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/images/{image}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.images.deprecate":
+
+type ImagesDeprecateCall struct {
+	s                 *Service
+	project           string
+	image             string
+	deprecationstatus *DeprecationStatus
+	opt_              map[string]interface{}
+}
+
+// Deprecate: Sets the deprecation status of an image. If no message
+// body is given, clears the deprecation status instead.
+func (r *ImagesService) Deprecate(project string, image string, deprecationstatus *DeprecationStatus) *ImagesDeprecateCall {
+	c := &ImagesDeprecateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.image = image
+	c.deprecationstatus = deprecationstatus
+	return c
+}
+
+func (c *ImagesDeprecateCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deprecationstatus)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/images/{image}/deprecate")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{image}", url.QueryEscape(c.image), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets the deprecation status of an image. If no message body is given, clears the deprecation status instead.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.images.deprecate",
+	//   "parameterOrder": [
+	//     "project",
+	//     "image"
+	//   ],
+	//   "parameters": {
+	//     "image": {
+	//       "description": "Image name.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/images/{image}/deprecate",
+	//   "request": {
+	//     "$ref": "DeprecationStatus"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.images.get":
+
+type ImagesGetCall struct {
+	s       *Service
+	project string
+	image   string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified image resource.
+func (r *ImagesService) Get(project string, image string) *ImagesGetCall {
+	c := &ImagesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.image = image
+	return c
+}
+
+func (c *ImagesGetCall) Do() (*Image, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/images/{image}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{image}", url.QueryEscape(c.image), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Image)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified image resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.images.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "image"
+	//   ],
+	//   "parameters": {
+	//     "image": {
+	//       "description": "Name of the image resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/images/{image}",
+	//   "response": {
+	//     "$ref": "Image"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.images.insert":
+
+type ImagesInsertCall struct {
+	s       *Service
+	project string
+	image   *Image
+	opt_    map[string]interface{}
+}
+
+// Insert: Creates an image resource in the specified project using the
+// data included in the request.
+func (r *ImagesService) Insert(project string, image *Image) *ImagesInsertCall {
+	c := &ImagesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.image = image
+	return c
+}
+
+func (c *ImagesInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.image)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/images")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates an image resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.images.insert",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/images",
+	//   "request": {
+	//     "$ref": "Image"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/devstorage.read_only"
+	//   ]
+	// }
+
+}
+
+// method id "compute.images.list":
+
+type ImagesListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of image resources available to the
+// specified project.
+func (r *ImagesService) List(project string) *ImagesListCall {
+	c := &ImagesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *ImagesListCall) Filter(filter string) *ImagesListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *ImagesListCall) MaxResults(maxResults int64) *ImagesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *ImagesListCall) PageToken(pageToken string) *ImagesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *ImagesListCall) Do() (*ImageList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/images")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ImageList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of image resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.images.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/images",
+	//   "response": {
+	//     "$ref": "ImageList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.addAccessConfig":
+
+type InstancesAddAccessConfigCall struct {
+	s                *Service
+	project          string
+	zone             string
+	instance         string
+	networkInterface string
+	accessconfig     *AccessConfig
+	opt_             map[string]interface{}
+}
+
+// AddAccessConfig: Adds an access config to an instance's network
+// interface.
+func (r *InstancesService) AddAccessConfig(project string, zone string, instance string, networkInterface string, accessconfig *AccessConfig) *InstancesAddAccessConfigCall {
+	c := &InstancesAddAccessConfigCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.networkInterface = networkInterface
+	c.accessconfig = accessconfig
+	return c
+}
+
+func (c *InstancesAddAccessConfigCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("networkInterface", fmt.Sprintf("%v", c.networkInterface))
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}/addAccessConfig")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Adds an access config to an instance's network interface.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.addAccessConfig",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance",
+	//     "networkInterface"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Instance name.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "networkInterface": {
+	//       "description": "Network interface name.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project name.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig",
+	//   "request": {
+	//     "$ref": "AccessConfig"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.aggregatedList":
+
+type InstancesAggregatedListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// AggregatedList:
+func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedListCall {
+	c := &InstancesAggregatedListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *InstancesAggregatedListCall) Filter(filter string) *InstancesAggregatedListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *InstancesAggregatedListCall) MaxResults(maxResults int64) *InstancesAggregatedListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *InstancesAggregatedListCall) PageToken(pageToken string) *InstancesAggregatedListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *InstancesAggregatedListCall) Do() (*InstanceAggregatedList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/aggregated/instances")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstanceAggregatedList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "httpMethod": "GET",
+	//   "id": "compute.instances.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/instances",
+	//   "response": {
+	//     "$ref": "InstanceAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.attachDisk":
+
+type InstancesAttachDiskCall struct {
+	s            *Service
+	project      string
+	zone         string
+	instance     string
+	attacheddisk *AttachedDisk
+	opt_         map[string]interface{}
+}
+
+// AttachDisk: Attaches a disk resource to an instance.
+func (r *InstancesService) AttachDisk(project string, zone string, instance string, attacheddisk *AttachedDisk) *InstancesAttachDiskCall {
+	c := &InstancesAttachDiskCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.attacheddisk = attacheddisk
+	return c
+}
+
+func (c *InstancesAttachDiskCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.attacheddisk)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}/attachDisk")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Attaches a disk resource to an instance.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.attachDisk",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Instance name.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project name.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/attachDisk",
+	//   "request": {
+	//     "$ref": "AttachedDisk"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.delete":
+
+type InstancesDeleteCall struct {
+	s        *Service
+	project  string
+	zone     string
+	instance string
+	opt_     map[string]interface{}
+}
+
+// Delete: Deletes the specified instance resource.
+func (r *InstancesService) Delete(project string, zone string, instance string) *InstancesDeleteCall {
+	c := &InstancesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	return c
+}
+
+func (c *InstancesDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified instance resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.instances.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Name of the instance resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.deleteAccessConfig":
+
+type InstancesDeleteAccessConfigCall struct {
+	s                *Service
+	project          string
+	zone             string
+	instance         string
+	accessConfig     string
+	networkInterface string
+	opt_             map[string]interface{}
+}
+
+// DeleteAccessConfig: Deletes an access config from an instance's
+// network interface.
+func (r *InstancesService) DeleteAccessConfig(project string, zone string, instance string, accessConfig string, networkInterface string) *InstancesDeleteAccessConfigCall {
+	c := &InstancesDeleteAccessConfigCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.accessConfig = accessConfig
+	c.networkInterface = networkInterface
+	return c
+}
+
+func (c *InstancesDeleteAccessConfigCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("accessConfig", fmt.Sprintf("%v", c.accessConfig))
+	params.Set("networkInterface", fmt.Sprintf("%v", c.networkInterface))
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes an access config from an instance's network interface.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.deleteAccessConfig",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance",
+	//     "accessConfig",
+	//     "networkInterface"
+	//   ],
+	//   "parameters": {
+	//     "accessConfig": {
+	//       "description": "Access config name.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "instance": {
+	//       "description": "Instance name.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "networkInterface": {
+	//       "description": "Network interface name.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project name.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.detachDisk":
+
+type InstancesDetachDiskCall struct {
+	s          *Service
+	project    string
+	zone       string
+	instance   string
+	deviceName string
+	opt_       map[string]interface{}
+}
+
+// DetachDisk: Detaches a disk from an instance.
+func (r *InstancesService) DetachDisk(project string, zone string, instance string, deviceName string) *InstancesDetachDiskCall {
+	c := &InstancesDetachDiskCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.deviceName = deviceName
+	return c
+}
+
+func (c *InstancesDetachDiskCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("deviceName", fmt.Sprintf("%v", c.deviceName))
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}/detachDisk")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Detaches a disk from an instance.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.detachDisk",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance",
+	//     "deviceName"
+	//   ],
+	//   "parameters": {
+	//     "deviceName": {
+	//       "description": "Disk device name to detach.",
+	//       "location": "query",
+	//       "pattern": "\\w[\\w.-]{0,254}",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "instance": {
+	//       "description": "Instance name.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project name.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/detachDisk",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.get":
+
+type InstancesGetCall struct {
+	s        *Service
+	project  string
+	zone     string
+	instance string
+	opt_     map[string]interface{}
+}
+
+// Get: Returns the specified instance resource.
+func (r *InstancesService) Get(project string, zone string, instance string) *InstancesGetCall {
+	c := &InstancesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	return c
+}
+
+func (c *InstancesGetCall) Do() (*Instance, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Instance)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified instance resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.instances.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Name of the instance resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}",
+	//   "response": {
+	//     "$ref": "Instance"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.getSerialPortOutput":
+
+type InstancesGetSerialPortOutputCall struct {
+	s        *Service
+	project  string
+	zone     string
+	instance string
+	opt_     map[string]interface{}
+}
+
+// GetSerialPortOutput: Returns the specified instance's serial port
+// output.
+func (r *InstancesService) GetSerialPortOutput(project string, zone string, instance string) *InstancesGetSerialPortOutputCall {
+	c := &InstancesGetSerialPortOutputCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	return c
+}
+
+func (c *InstancesGetSerialPortOutputCall) Do() (*SerialPortOutput, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}/serialPort")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SerialPortOutput)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified instance's serial port output.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.instances.getSerialPortOutput",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Name of the instance scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/serialPort",
+	//   "response": {
+	//     "$ref": "SerialPortOutput"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.insert":
+
+type InstancesInsertCall struct {
+	s        *Service
+	project  string
+	zone     string
+	instance *Instance
+	opt_     map[string]interface{}
+}
+
+// Insert: Creates an instance resource in the specified project using
+// the data included in the request.
+func (r *InstancesService) Insert(project string, zone string, instance *Instance) *InstancesInsertCall {
+	c := &InstancesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	return c
+}
+
+func (c *InstancesInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instance)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates an instance resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.insert",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances",
+	//   "request": {
+	//     "$ref": "Instance"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.list":
+
+type InstancesListCall struct {
+	s       *Service
+	project string
+	zone    string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of instance resources contained within the
+// specified zone.
+func (r *InstancesService) List(project string, zone string) *InstancesListCall {
+	c := &InstancesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *InstancesListCall) Filter(filter string) *InstancesListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *InstancesListCall) MaxResults(maxResults int64) *InstancesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *InstancesListCall) PageToken(pageToken string) *InstancesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *InstancesListCall) Do() (*InstanceList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstanceList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of instance resources contained within the specified zone.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.instances.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances",
+	//   "response": {
+	//     "$ref": "InstanceList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.setMetadata":
+
+type InstancesSetMetadataCall struct {
+	s        *Service
+	project  string
+	zone     string
+	instance string
+	metadata *Metadata
+	opt_     map[string]interface{}
+}
+
+// SetMetadata: Sets metadata for the specified instance to the data
+// included in the request.
+func (r *InstancesService) SetMetadata(project string, zone string, instance string, metadata *Metadata) *InstancesSetMetadataCall {
+	c := &InstancesSetMetadataCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.metadata = metadata
+	return c
+}
+
+func (c *InstancesSetMetadataCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}/setMetadata")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets metadata for the specified instance to the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.setMetadata",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Name of the instance scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/setMetadata",
+	//   "request": {
+	//     "$ref": "Metadata"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.instances.setTags":
+
+type InstancesSetTagsCall struct {
+	s        *Service
+	project  string
+	zone     string
+	instance string
+	tags     *Tags
+	opt_     map[string]interface{}
+}
+
+// SetTags: Sets tags for the specified instance to the data included in
+// the request.
+func (r *InstancesService) SetTags(project string, zone string, instance string, tags *Tags) *InstancesSetTagsCall {
+	c := &InstancesSetTagsCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.tags = tags
+	return c
+}
+
+func (c *InstancesSetTagsCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tags)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/instances/{instance}/setTags")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets tags for the specified instance to the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.setTags",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Name of the instance scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/setTags",
+	//   "request": {
+	//     "$ref": "Tags"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.kernels.get":
+
+type KernelsGetCall struct {
+	s       *Service
+	project string
+	kernel  string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified kernel resource.
+func (r *KernelsService) Get(project string, kernel string) *KernelsGetCall {
+	c := &KernelsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.kernel = kernel
+	return c
+}
+
+func (c *KernelsGetCall) Do() (*Kernel, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/kernels/{kernel}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{kernel}", url.QueryEscape(c.kernel), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Kernel)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified kernel resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.kernels.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "kernel"
+	//   ],
+	//   "parameters": {
+	//     "kernel": {
+	//       "description": "Name of the kernel resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/kernels/{kernel}",
+	//   "response": {
+	//     "$ref": "Kernel"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.kernels.list":
+
+type KernelsListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of kernel resources available to the
+// specified project.
+func (r *KernelsService) List(project string) *KernelsListCall {
+	c := &KernelsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *KernelsListCall) Filter(filter string) *KernelsListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *KernelsListCall) MaxResults(maxResults int64) *KernelsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *KernelsListCall) PageToken(pageToken string) *KernelsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *KernelsListCall) Do() (*KernelList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/kernels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(KernelList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of kernel resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.kernels.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/kernels",
+	//   "response": {
+	//     "$ref": "KernelList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.machineTypes.aggregatedList":
+
+type MachineTypesAggregatedListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// AggregatedList: Retrieves the list of machine type resources grouped
+// by scope.
+func (r *MachineTypesService) AggregatedList(project string) *MachineTypesAggregatedListCall {
+	c := &MachineTypesAggregatedListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *MachineTypesAggregatedListCall) Filter(filter string) *MachineTypesAggregatedListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *MachineTypesAggregatedListCall) MaxResults(maxResults int64) *MachineTypesAggregatedListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *MachineTypesAggregatedListCall) PageToken(pageToken string) *MachineTypesAggregatedListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *MachineTypesAggregatedListCall) Do() (*MachineTypeAggregatedList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/aggregated/machineTypes")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(MachineTypeAggregatedList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of machine type resources grouped by scope.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.machineTypes.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/machineTypes",
+	//   "response": {
+	//     "$ref": "MachineTypeAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.machineTypes.get":
+
+type MachineTypesGetCall struct {
+	s           *Service
+	project     string
+	zone        string
+	machineType string
+	opt_        map[string]interface{}
+}
+
+// Get: Returns the specified machine type resource.
+func (r *MachineTypesService) Get(project string, zone string, machineType string) *MachineTypesGetCall {
+	c := &MachineTypesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.machineType = machineType
+	return c
+}
+
+func (c *MachineTypesGetCall) Do() (*MachineType, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/machineTypes/{machineType}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{machineType}", url.QueryEscape(c.machineType), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(MachineType)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified machine type resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.machineTypes.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "machineType"
+	//   ],
+	//   "parameters": {
+	//     "machineType": {
+	//       "description": "Name of the machine type resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/machineTypes/{machineType}",
+	//   "response": {
+	//     "$ref": "MachineType"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.machineTypes.list":
+
+type MachineTypesListCall struct {
+	s       *Service
+	project string
+	zone    string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of machine type resources available to the
+// specified project.
+func (r *MachineTypesService) List(project string, zone string) *MachineTypesListCall {
+	c := &MachineTypesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *MachineTypesListCall) Filter(filter string) *MachineTypesListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *MachineTypesListCall) MaxResults(maxResults int64) *MachineTypesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *MachineTypesListCall) PageToken(pageToken string) *MachineTypesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *MachineTypesListCall) Do() (*MachineTypeList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/machineTypes")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(MachineTypeList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of machine type resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.machineTypes.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/machineTypes",
+	//   "response": {
+	//     "$ref": "MachineTypeList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.networks.delete":
+
+type NetworksDeleteCall struct {
+	s       *Service
+	project string
+	network string
+	opt_    map[string]interface{}
+}
+
+// Delete: Deletes the specified network resource.
+func (r *NetworksService) Delete(project string, network string) *NetworksDeleteCall {
+	c := &NetworksDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.network = network
+	return c
+}
+
+func (c *NetworksDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/networks/{network}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{network}", url.QueryEscape(c.network), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified network resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.networks.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "network"
+	//   ],
+	//   "parameters": {
+	//     "network": {
+	//       "description": "Name of the network resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/networks/{network}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.networks.get":
+
+type NetworksGetCall struct {
+	s       *Service
+	project string
+	network string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified network resource.
+func (r *NetworksService) Get(project string, network string) *NetworksGetCall {
+	c := &NetworksGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.network = network
+	return c
+}
+
+func (c *NetworksGetCall) Do() (*Network, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/networks/{network}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{network}", url.QueryEscape(c.network), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Network)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified network resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.networks.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "network"
+	//   ],
+	//   "parameters": {
+	//     "network": {
+	//       "description": "Name of the network resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/networks/{network}",
+	//   "response": {
+	//     "$ref": "Network"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.networks.insert":
+
+type NetworksInsertCall struct {
+	s       *Service
+	project string
+	network *Network
+	opt_    map[string]interface{}
+}
+
+// Insert: Creates a network resource in the specified project using the
+// data included in the request.
+func (r *NetworksService) Insert(project string, network *Network) *NetworksInsertCall {
+	c := &NetworksInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.network = network
+	return c
+}
+
+func (c *NetworksInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.network)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/networks")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a network resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.networks.insert",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/networks",
+	//   "request": {
+	//     "$ref": "Network"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.networks.list":
+
+type NetworksListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of network resources available to the
+// specified project.
+func (r *NetworksService) List(project string) *NetworksListCall {
+	c := &NetworksListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *NetworksListCall) Filter(filter string) *NetworksListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *NetworksListCall) MaxResults(maxResults int64) *NetworksListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *NetworksListCall) PageToken(pageToken string) *NetworksListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *NetworksListCall) Do() (*NetworkList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/networks")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(NetworkList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of network resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.networks.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/networks",
+	//   "response": {
+	//     "$ref": "NetworkList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.projects.get":
+
+type ProjectsGetCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified project resource.
+func (r *ProjectsService) Get(project string) *ProjectsGetCall {
+	c := &ProjectsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+func (c *ProjectsGetCall) Do() (*Project, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Project)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified project resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.projects.get",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project resource to retrieve.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}",
+	//   "response": {
+	//     "$ref": "Project"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.projects.setCommonInstanceMetadata":
+
+type ProjectsSetCommonInstanceMetadataCall struct {
+	s        *Service
+	project  string
+	metadata *Metadata
+	opt_     map[string]interface{}
+}
+
+// SetCommonInstanceMetadata: Sets metadata common to all instances
+// within the specified project using the data included in the request.
+func (r *ProjectsService) SetCommonInstanceMetadata(project string, metadata *Metadata) *ProjectsSetCommonInstanceMetadataCall {
+	c := &ProjectsSetCommonInstanceMetadataCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.metadata = metadata
+	return c
+}
+
+func (c *ProjectsSetCommonInstanceMetadataCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/setCommonInstanceMetadata")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets metadata common to all instances within the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.projects.setCommonInstanceMetadata",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/setCommonInstanceMetadata",
+	//   "request": {
+	//     "$ref": "Metadata"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.regionOperations.delete":
+
+type RegionOperationsDeleteCall struct {
+	s         *Service
+	project   string
+	region    string
+	operation string
+	opt_      map[string]interface{}
+}
+
+// Delete: Deletes the specified region-specific operation resource.
+func (r *RegionOperationsService) Delete(project string, region string, operation string) *RegionOperationsDeleteCall {
+	c := &RegionOperationsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	c.operation = operation
+	return c
+}
+
+func (c *RegionOperationsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}/operations/{operation}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes the specified region-specific operation resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.regionOperations.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region",
+	//     "operation"
+	//   ],
+	//   "parameters": {
+	//     "operation": {
+	//       "description": "Name of the operation resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the region scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/operations/{operation}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.regionOperations.get":
+
+type RegionOperationsGetCall struct {
+	s         *Service
+	project   string
+	region    string
+	operation string
+	opt_      map[string]interface{}
+}
+
+// Get: Retrieves the specified region-specific operation resource.
+func (r *RegionOperationsService) Get(project string, region string, operation string) *RegionOperationsGetCall {
+	c := &RegionOperationsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	c.operation = operation
+	return c
+}
+
+func (c *RegionOperationsGetCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}/operations/{operation}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the specified region-specific operation resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.regionOperations.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region",
+	//     "operation"
+	//   ],
+	//   "parameters": {
+	//     "operation": {
+	//       "description": "Name of the operation resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/operations/{operation}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.regionOperations.list":
+
+type RegionOperationsListCall struct {
+	s       *Service
+	project string
+	region  string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of operation resources contained within the
+// specified region.
+func (r *RegionOperationsService) List(project string, region string) *RegionOperationsListCall {
+	c := &RegionOperationsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *RegionOperationsListCall) Filter(filter string) *RegionOperationsListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *RegionOperationsListCall) MaxResults(maxResults int64) *RegionOperationsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *RegionOperationsListCall) PageToken(pageToken string) *RegionOperationsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *RegionOperationsListCall) Do() (*OperationList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}/operations")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OperationList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of operation resources contained within the specified region.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.regionOperations.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the region scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/operations",
+	//   "response": {
+	//     "$ref": "OperationList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.regions.get":
+
+type RegionsGetCall struct {
+	s       *Service
+	project string
+	region  string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified region resource.
+func (r *RegionsService) Get(project string, region string) *RegionsGetCall {
+	c := &RegionsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.region = region
+	return c
+}
+
+func (c *RegionsGetCall) Do() (*Region, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions/{region}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{region}", url.QueryEscape(c.region), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Region)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified region resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.regions.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Name of the region resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}",
+	//   "response": {
+	//     "$ref": "Region"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.regions.list":
+
+type RegionsListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of region resources available to the
+// specified project.
+func (r *RegionsService) List(project string) *RegionsListCall {
+	c := &RegionsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *RegionsListCall) Filter(filter string) *RegionsListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *RegionsListCall) MaxResults(maxResults int64) *RegionsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *RegionsListCall) PageToken(pageToken string) *RegionsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *RegionsListCall) Do() (*RegionList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/regions")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(RegionList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of region resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.regions.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions",
+	//   "response": {
+	//     "$ref": "RegionList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.routes.delete":
+
+type RoutesDeleteCall struct {
+	s       *Service
+	project string
+	route   string
+	opt_    map[string]interface{}
+}
+
+// Delete: Deletes the specified route resource.
+func (r *RoutesService) Delete(project string, route string) *RoutesDeleteCall {
+	c := &RoutesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.route = route
+	return c
+}
+
+func (c *RoutesDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/routes/{route}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{route}", url.QueryEscape(c.route), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified route resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.routes.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "route"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "route": {
+	//       "description": "Name of the route resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes/{route}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.routes.get":
+
+type RoutesGetCall struct {
+	s       *Service
+	project string
+	route   string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified route resource.
+func (r *RoutesService) Get(project string, route string) *RoutesGetCall {
+	c := &RoutesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.route = route
+	return c
+}
+
+func (c *RoutesGetCall) Do() (*Route, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/routes/{route}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{route}", url.QueryEscape(c.route), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Route)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified route resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.routes.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "route"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "route": {
+	//       "description": "Name of the route resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes/{route}",
+	//   "response": {
+	//     "$ref": "Route"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.routes.insert":
+
+type RoutesInsertCall struct {
+	s       *Service
+	project string
+	route   *Route
+	opt_    map[string]interface{}
+}
+
+// Insert: Creates a route resource in the specified project using the
+// data included in the request.
+func (r *RoutesService) Insert(project string, route *Route) *RoutesInsertCall {
+	c := &RoutesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.route = route
+	return c
+}
+
+func (c *RoutesInsertCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.route)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/routes")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a route resource in the specified project using the data included in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.routes.insert",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes",
+	//   "request": {
+	//     "$ref": "Route"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.routes.list":
+
+type RoutesListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of route resources available to the
+// specified project.
+func (r *RoutesService) List(project string) *RoutesListCall {
+	c := &RoutesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *RoutesListCall) Filter(filter string) *RoutesListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *RoutesListCall) MaxResults(maxResults int64) *RoutesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *RoutesListCall) PageToken(pageToken string) *RoutesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *RoutesListCall) Do() (*RouteList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/routes")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(RouteList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of route resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.routes.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/routes",
+	//   "response": {
+	//     "$ref": "RouteList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.snapshots.delete":
+
+type SnapshotsDeleteCall struct {
+	s        *Service
+	project  string
+	snapshot string
+	opt_     map[string]interface{}
+}
+
+// Delete: Deletes the specified persistent disk snapshot resource.
+func (r *SnapshotsService) Delete(project string, snapshot string) *SnapshotsDeleteCall {
+	c := &SnapshotsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.snapshot = snapshot
+	return c
+}
+
+func (c *SnapshotsDeleteCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/snapshots/{snapshot}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{snapshot}", url.QueryEscape(c.snapshot), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes the specified persistent disk snapshot resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.snapshots.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "snapshot"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "snapshot": {
+	//       "description": "Name of the persistent disk snapshot resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/snapshots/{snapshot}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.snapshots.get":
+
+type SnapshotsGetCall struct {
+	s        *Service
+	project  string
+	snapshot string
+	opt_     map[string]interface{}
+}
+
+// Get: Returns the specified persistent disk snapshot resource.
+func (r *SnapshotsService) Get(project string, snapshot string) *SnapshotsGetCall {
+	c := &SnapshotsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.snapshot = snapshot
+	return c
+}
+
+func (c *SnapshotsGetCall) Do() (*Snapshot, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/snapshots/{snapshot}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{snapshot}", url.QueryEscape(c.snapshot), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Snapshot)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified persistent disk snapshot resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.snapshots.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "snapshot"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "snapshot": {
+	//       "description": "Name of the persistent disk snapshot resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/snapshots/{snapshot}",
+	//   "response": {
+	//     "$ref": "Snapshot"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.snapshots.list":
+
+type SnapshotsListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of persistent disk snapshot resources
+// contained within the specified project.
+func (r *SnapshotsService) List(project string) *SnapshotsListCall {
+	c := &SnapshotsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *SnapshotsListCall) Filter(filter string) *SnapshotsListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *SnapshotsListCall) MaxResults(maxResults int64) *SnapshotsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *SnapshotsListCall) PageToken(pageToken string) *SnapshotsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *SnapshotsListCall) Do() (*SnapshotList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/global/snapshots")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(SnapshotList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of persistent disk snapshot resources contained within the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.snapshots.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/snapshots",
+	//   "response": {
+	//     "$ref": "SnapshotList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.zoneOperations.delete":
+
+type ZoneOperationsDeleteCall struct {
+	s         *Service
+	project   string
+	zone      string
+	operation string
+	opt_      map[string]interface{}
+}
+
+// Delete: Deletes the specified zone-specific operation resource.
+func (r *ZoneOperationsService) Delete(project string, zone string, operation string) *ZoneOperationsDeleteCall {
+	c := &ZoneOperationsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.operation = operation
+	return c
+}
+
+func (c *ZoneOperationsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/operations/{operation}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes the specified zone-specific operation resource.",
+	//   "httpMethod": "DELETE",
+	//   "id": "compute.zoneOperations.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "operation"
+	//   ],
+	//   "parameters": {
+	//     "operation": {
+	//       "description": "Name of the operation resource to delete.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/operations/{operation}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.zoneOperations.get":
+
+type ZoneOperationsGetCall struct {
+	s         *Service
+	project   string
+	zone      string
+	operation string
+	opt_      map[string]interface{}
+}
+
+// Get: Retrieves the specified zone-specific operation resource.
+func (r *ZoneOperationsService) Get(project string, zone string, operation string) *ZoneOperationsGetCall {
+	c := &ZoneOperationsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	c.operation = operation
+	return c
+}
+
+func (c *ZoneOperationsGetCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/operations/{operation}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Operation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the specified zone-specific operation resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.zoneOperations.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "operation"
+	//   ],
+	//   "parameters": {
+	//     "operation": {
+	//       "description": "Name of the operation resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/operations/{operation}",
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.zoneOperations.list":
+
+type ZoneOperationsListCall struct {
+	s       *Service
+	project string
+	zone    string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of operation resources contained within the
+// specified zone.
+func (r *ZoneOperationsService) List(project string, zone string) *ZoneOperationsListCall {
+	c := &ZoneOperationsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *ZoneOperationsListCall) Filter(filter string) *ZoneOperationsListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *ZoneOperationsListCall) MaxResults(maxResults int64) *ZoneOperationsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *ZoneOperationsListCall) PageToken(pageToken string) *ZoneOperationsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *ZoneOperationsListCall) Do() (*OperationList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}/operations")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OperationList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of operation resources contained within the specified zone.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.zoneOperations.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/operations",
+	//   "response": {
+	//     "$ref": "OperationList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.zones.get":
+
+type ZonesGetCall struct {
+	s       *Service
+	project string
+	zone    string
+	opt_    map[string]interface{}
+}
+
+// Get: Returns the specified zone resource.
+func (r *ZonesService) Get(project string, zone string) *ZonesGetCall {
+	c := &ZonesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+func (c *ZonesGetCall) Do() (*Zone, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones/{zone}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{zone}", url.QueryEscape(c.zone), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Zone)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified zone resource.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.zones.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "Name of the zone resource to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}",
+	//   "response": {
+	//     "$ref": "Zone"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.zones.list":
+
+type ZonesListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Retrieves the list of zone resources available to the specified
+// project.
+func (r *ZonesService) List(project string) *ZonesListCall {
+	c := &ZonesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Filter expression for
+// filtering listed resources.
+func (c *ZonesListCall) Filter(filter string) *ZonesListCall {
+	c.opt_["filter"] = filter
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum count of
+// results to be returned. Maximum and default value is 100.
+func (c *ZonesListCall) MaxResults(maxResults int64) *ZonesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Tag returned by a
+// previous list request truncated by maxResults. Used to continue a
+// previous list request.
+func (c *ZonesListCall) PageToken(pageToken string) *ZonesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *ZonesListCall) Do() (*ZoneList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["filter"]; ok {
+		params.Set("filter", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/compute/v1beta15/projects/", "{project}/zones")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ZoneList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the list of zone resources available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.zones.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Optional. Filter expression for filtering listed resources.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "100",
+	//       "description": "Optional. Maximum count of results to be returned. Maximum and default value is 100.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Name of the project scoping this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones",
+	//   "response": {
+	//     "$ref": "ZoneList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
diff --git a/coordinate/v1/coordinate-api.json b/coordinate/v1/coordinate-api.json
index bab7d86..d9d9f5e 100644
--- a/coordinate/v1/coordinate-api.json
+++ b/coordinate/v1/coordinate-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"DsY8aw3zSOMYNAy_X4JnK21hrvA/-7_E6vfT2yuZ4bjaaQRx3DITqsU\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/-7_E6vfT2yuZ4bjaaQRx3DITqsU\"",
  "discoveryVersion": "v1",
  "id": "coordinate:v1",
  "name": "coordinate",
diff --git a/coordinate/v1/coordinate-gen.go b/coordinate/v1/coordinate-gen.go
index 4e08580..418ed7f 100644
--- a/coordinate/v1/coordinate-gen.go
+++ b/coordinate/v1/coordinate-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "coordinate:v1"
 const apiName = "coordinate"
@@ -341,14 +344,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/custom_fields")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -406,15 +411,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs/{jobId}")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
-	urls = strings.Replace(urls, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -549,15 +556,17 @@
 		params.Set("note", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -701,14 +710,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -890,16 +901,18 @@
 		params.Set("title", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs/{jobId}")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
-	urls = strings.Replace(urls, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1141,16 +1154,18 @@
 		params.Set("title", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs/{jobId}")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
-	urls = strings.Replace(urls, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1307,15 +1322,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/workers/{workerEmail}/locations")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
-	urls = strings.Replace(urls, "{workerEmail}", cleanPathString(c.workerEmail), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{workerEmail}", url.QueryEscape(c.workerEmail), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1399,15 +1416,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs/{jobId}/schedule")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
-	urls = strings.Replace(urls, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1512,16 +1531,18 @@
 		params.Set("startTime", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs/{jobId}/schedule")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
-	urls = strings.Replace(urls, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1644,16 +1665,18 @@
 		params.Set("startTime", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/jobs/{jobId}/schedule")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
-	urls = strings.Replace(urls, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{jobId}", strconv.FormatUint(c.jobId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1736,14 +1759,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/coordinate/v1/teams/", "{teamId}/workers")
-	urls = strings.Replace(urls, "{teamId}", cleanPathString(c.teamId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{teamId}", url.QueryEscape(c.teamId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1778,12 +1803,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/customsearch/v1/customsearch-api.json b/customsearch/v1/customsearch-api.json
index 3b5e9ca..84788ed 100644
--- a/customsearch/v1/customsearch-api.json
+++ b/customsearch/v1/customsearch-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/LrXQ9IUjfZw535PRb4jXFXH6P-c\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/Y5XOL_1XfR11dJN90e7SFGWQL0g\"",
  "discoveryVersion": "v1",
  "id": "customsearch:v1",
  "name": "customsearch",
@@ -8,6 +8,8 @@
  "revision": "20120904",
  "title": "CustomSearch API",
  "description": "Lets you search over a website or collection of websites",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/customsearch/v1/customsearch-gen.go b/customsearch/v1/customsearch-gen.go
index 8d21f6c..cbb6c71 100644
--- a/customsearch/v1/customsearch-gen.go
+++ b/customsearch/v1/customsearch-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "customsearch:v1"
 const apiName = "customsearch"
@@ -621,11 +624,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/customsearch/", "v1")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -987,12 +992,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/datastore/v1beta1/datastore-api.json b/datastore/v1beta1/datastore-api.json
new file mode 100644
index 0000000..0e3eea1
--- /dev/null
+++ b/datastore/v1beta1/datastore-api.json
@@ -0,0 +1,933 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/paR1K2Q6CwwbZyLY9S3P-sOZwf4\"",
+ "discoveryVersion": "v1",
+ "id": "datastore:v1beta1",
+ "name": "datastore",
+ "version": "v1beta1",
+ "revision": "20130523",
+ "title": "Google Cloud Datastore API",
+ "description": "API for accessing Google Cloud Datastore.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/search-16.gif",
+  "x32": "http://www.google.com/images/icons/product/search-32.gif"
+ },
+ "documentationLink": "https://developers.google.com/datastore/",
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/datastore/v1beta1/datasets/",
+ "basePath": "/datastore/v1beta1/datasets/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "datastore/v1beta1/datasets/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "proto",
+   "enum": [
+    "json",
+    "proto"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json",
+    "Responses with Content-Type of application/x-protobuf"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/userinfo.email": {
+     "description": "View your email address"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "AllocateIdsRequest": {
+   "id": "AllocateIdsRequest",
+   "type": "object",
+   "description": "The request for AllocateIds.",
+   "properties": {
+    "keys": {
+     "type": "array",
+     "description": "A list of keys with incomplete key paths to allocate IDs for. No key may be reserved/read-only.",
+     "items": {
+      "$ref": "Key"
+     }
+    }
+   }
+  },
+  "AllocateIdsResponse": {
+   "id": "AllocateIdsResponse",
+   "type": "object",
+   "description": "The response for AllocateIds.",
+   "properties": {
+    "keys": {
+     "type": "array",
+     "description": "The keys specified in the request (in the same order), each with its key path completed with a newly allocated ID.",
+     "items": {
+      "$ref": "Key"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"datastore#allocateIdsResponse\".",
+     "default": "datastore#allocateIdsResponse"
+    }
+   }
+  },
+  "BeginTransactionRequest": {
+   "id": "BeginTransactionRequest",
+   "type": "object",
+   "description": "The request for BeginTransaction.",
+   "properties": {
+    "isolationLevel": {
+     "type": "string",
+     "description": "The transaction isolation level. Either snapshot or serializable. The default isolation level is snapshot isolation, which means that another transaction may not concurrently modify the data that is modified by this transaction. Optionally, a transaction can request to be made serializable which means that another transaction cannot concurrently modify the data that is read or modified by this transaction."
+    }
+   }
+  },
+  "BeginTransactionResponse": {
+   "id": "BeginTransactionResponse",
+   "type": "object",
+   "description": "The response for BeginTransaction.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"datastore#beginTransactionResponse\".",
+     "default": "datastore#beginTransactionResponse"
+    },
+    "transaction": {
+     "type": "string",
+     "description": "The transaction identifier (always present).",
+     "format": "byte"
+    }
+   }
+  },
+  "BlindWriteRequest": {
+   "id": "BlindWriteRequest",
+   "type": "object",
+   "description": "The request for BlindWrite.",
+   "properties": {
+    "mutation": {
+     "$ref": "Mutation",
+     "description": "The mutation to perform."
+    }
+   }
+  },
+  "BlindWriteResponse": {
+   "id": "BlindWriteResponse",
+   "type": "object",
+   "description": "The response for BlindWrite.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"datastore#blindWriteResponse\".",
+     "default": "datastore#blindWriteResponse"
+    },
+    "mutationResult": {
+     "$ref": "MutationResult",
+     "description": "The result of performing the mutation."
+    }
+   }
+  },
+  "CommitRequest": {
+   "id": "CommitRequest",
+   "type": "object",
+   "description": "The request for Commit.",
+   "properties": {
+    "mutation": {
+     "$ref": "Mutation",
+     "description": "The mutation to perform as part of this transaction. Optional."
+    },
+    "transaction": {
+     "type": "string",
+     "description": "The transaction identifier, returned by a call to beginTransaction.",
+     "format": "byte"
+    }
+   }
+  },
+  "CommitResponse": {
+   "id": "CommitResponse",
+   "type": "object",
+   "description": "The response for Commit.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"datastore#commitResponse\".",
+     "default": "datastore#commitResponse"
+    },
+    "mutationResult": {
+     "$ref": "MutationResult",
+     "description": "The result of performing the mutation (if any)."
+    }
+   }
+  },
+  "CompositeFilter": {
+   "id": "CompositeFilter",
+   "type": "object",
+   "description": "A filter that merges the multiple other filters using the given operation.",
+   "properties": {
+    "filters": {
+     "type": "array",
+     "description": "The list of filters to combine. Must contain at least one filter.",
+     "items": {
+      "$ref": "Filter"
+     }
+    },
+    "operator": {
+     "type": "string",
+     "description": "The operator for combining multiple filters. Only \"and\" is currently supported."
+    }
+   }
+  },
+  "Entity": {
+   "id": "Entity",
+   "type": "object",
+   "description": "An entity.\n\nAn entity is limited to 1 megabyte when stored. That *roughly* corresponds to a limit of 1 megabyte for the serialized form of this message.",
+   "properties": {
+    "key": {
+     "$ref": "Key",
+     "description": "The entity's key.\n\nAn entity must have a key, unless otherwise documented (for example, an entity in Value.entityValue may have no key). An entity's kind is its key's path's last element's kind, or null if it has no key."
+    },
+    "properties": {
+     "type": "object",
+     "description": "The entity's properties.",
+     "additionalProperties": {
+      "$ref": "Property",
+      "description": "The name of the property. Properties with names matching regex \"__.*__\" are reserved. A reserved property name is forbidden in certain documented contexts. The name cannot be \"\"."
+     }
+    }
+   }
+  },
+  "EntityResult": {
+   "id": "EntityResult",
+   "type": "object",
+   "description": "The result of fetching an entity from the datastore.",
+   "properties": {
+    "entity": {
+     "$ref": "Entity",
+     "description": "The resulting entity."
+    }
+   }
+  },
+  "Filter": {
+   "id": "Filter",
+   "type": "object",
+   "description": "A holder for any type of filter. Exactly one field should be specified.",
+   "properties": {
+    "compositeFilter": {
+     "$ref": "CompositeFilter",
+     "description": "A composite filter."
+    },
+    "propertyFilter": {
+     "$ref": "PropertyFilter",
+     "description": "A filter on a property."
+    }
+   }
+  },
+  "Key": {
+   "id": "Key",
+   "type": "object",
+   "description": "A unique identifier for an entity. If a key's partition id or any of its path kinds or names are reserved/read-only, the key is reserved/read-only. A reserved/read-only key is forbidden in certain documented contexts.",
+   "properties": {
+    "partitionId": {
+     "$ref": "PartitionId",
+     "description": "Entities are partitioned into subsets, identified by a dataset (usually implicitly specified by the project) and namespace ID. Queries are scoped to a single partition."
+    },
+    "path": {
+     "type": "array",
+     "description": "The entity path. An entity path consists of one or more elements composed of a kind and a string or numerical identifier, which identify entities. The first element identifies a root entity, the second element identifies a child of the root entity, the third element a child of the second entity, and so forth. The entities identified by all prefixes of the path are called the element's ancestors. An entity path is always fully complete: ALL of the entity's ancestors are required to be in the path along with the entity identifier itself. The only exception is that in some documented cases, the identifier in the last path element (for the entity) itself may be omitted. A path can never be empty.",
+     "items": {
+      "$ref": "KeyPathElement"
+     }
+    }
+   }
+  },
+  "KeyPathElement": {
+   "id": "KeyPathElement",
+   "type": "object",
+   "description": "A (kind, ID/name) pair used to construct a key path.\n\nAt most one of name or ID may be set. If either is set, the element is complete. If neither is set, the element is incomplete.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "The ID of the entity. Always \u003e 0.",
+     "format": "int64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of the entity. Kinds matching regex \"__.*__\" are reserved/read-only. Cannot be \"\"."
+    },
+    "name": {
+     "type": "string",
+     "description": "The name of the entity. Names matching regex \"__.*__\" are reserved/read-only. Cannot be \"\"."
+    }
+   }
+  },
+  "KindExpression": {
+   "id": "KindExpression",
+   "type": "object",
+   "description": "A representation of a kind.",
+   "properties": {
+    "name": {
+     "type": "string",
+     "description": "The name of the kind."
+    }
+   }
+  },
+  "LookupRequest": {
+   "id": "LookupRequest",
+   "type": "object",
+   "description": "The request for Lookup.",
+   "properties": {
+    "keys": {
+     "type": "array",
+     "description": "Keys of entities to look up from the datastore.",
+     "items": {
+      "$ref": "Key"
+     }
+    },
+    "readOptions": {
+     "$ref": "ReadOptions",
+     "description": "Options for this lookup request. Optional."
+    }
+   }
+  },
+  "LookupResponse": {
+   "id": "LookupResponse",
+   "type": "object",
+   "description": "The response for Lookup.",
+   "properties": {
+    "deferred": {
+     "type": "array",
+     "description": "A list of keys that were not looked up due to resource constraints.",
+     "items": {
+      "$ref": "Key"
+     }
+    },
+    "found": {
+     "type": "array",
+     "description": "Entities found.",
+     "items": {
+      "$ref": "EntityResult"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"datastore#lookupResponse\".",
+     "default": "datastore#lookupResponse"
+    },
+    "missing": {
+     "type": "array",
+     "description": "Entities not found, with only the key populated.",
+     "items": {
+      "$ref": "EntityResult"
+     }
+    }
+   }
+  },
+  "Mutation": {
+   "id": "Mutation",
+   "type": "object",
+   "description": "A set of changes to apply.\n\nNo entity in this message may have a reserved property name, not even a property in an entity in a value.\n\nIf entities with duplicate keys are present, an arbitrary choice will be made as to which is written.",
+   "properties": {
+    "delete": {
+     "type": "array",
+     "description": "Keys of entities to delete. Each key must have a complete key path and must not be reserved/read-only.",
+     "items": {
+      "$ref": "Key"
+     }
+    },
+    "force": {
+     "type": "boolean",
+     "description": "Ignore a user specified read-only period. Optional."
+    },
+    "insert": {
+     "type": "array",
+     "description": "Entities to insert. Each inserted entity's key must have a complete path and must not be reserved/read-only.",
+     "items": {
+      "$ref": "Entity"
+     }
+    },
+    "insertAutoId": {
+     "type": "array",
+     "description": "Insert entities with a newly allocated ID. Each inserted entity's key must omit the final identifier in its path and must not be reserved/read-only.",
+     "items": {
+      "$ref": "Entity"
+     }
+    },
+    "update": {
+     "type": "array",
+     "description": "Entities to update. Each updated entity's key must have a complete path and must not be reserved/read-only.",
+     "items": {
+      "$ref": "Entity"
+     }
+    },
+    "upsert": {
+     "type": "array",
+     "description": "Entities to upsert. Each upserted entity's key must have a complete path and must not be reserved/read-only.",
+     "items": {
+      "$ref": "Entity"
+     }
+    }
+   }
+  },
+  "MutationResult": {
+   "id": "MutationResult",
+   "type": "object",
+   "description": "The result of applying a mutation.",
+   "properties": {
+    "indexUpdates": {
+     "type": "integer",
+     "description": "Number of index writes.",
+     "format": "int32"
+    },
+    "insertAutoIdKeys": {
+     "type": "array",
+     "description": "Keys for insertAutoId entities. One per entity from the request, in the same order.",
+     "items": {
+      "$ref": "Key"
+     }
+    }
+   }
+  },
+  "PartitionId": {
+   "id": "PartitionId",
+   "type": "object",
+   "description": "An identifier for a particular subset of entities.\n\nEntities are partitioned into various subsets, each used by different datasets and different namespaces within a dataset and so forth.\n\nAll input partition IDs are normalized before use. A partition ID is normalized as follows: If the partition ID is unset, replace it with an empty partition ID. If the partition ID has no dataset ID, assign it the context dataset ID.\n\nPartition dimension: A dimension may be unset. A dimension's value must never contain \"!\". A dimension's value must never be \"\". If the value of any dimension matches regex \"__.*__\", the partition is reserved/read-only. A reserved/read-only partition ID is forbidden in certain documented contexts.",
+   "properties": {
+    "datasetId": {
+     "type": "string",
+     "description": "The dataset ID."
+    },
+    "namespace": {
+     "type": "string",
+     "description": "The namespace."
+    }
+   }
+  },
+  "Property": {
+   "id": "Property",
+   "type": "object",
+   "description": "An entity property.",
+   "properties": {
+    "multi": {
+     "type": "boolean",
+     "description": "If this property contains a list of values. Input values may explicitly set multi to false, but otherwise false is always represented by omitting multi."
+    },
+    "values": {
+     "type": "array",
+     "description": "The value(s) of the property. When multi is false there is always exactly one value. When multi is true there is always one or more values. Each value can have only one value property populated. For example, you cannot have a values list of { values: [ { integerValue: 22, stringValue: \"a\" } ] }, but you can have { multi: true, values: [ { integerValue: 22 }, { stringValue: \"a\" } ] }.",
+     "items": {
+      "$ref": "Value"
+     }
+    }
+   }
+  },
+  "PropertyExpression": {
+   "id": "PropertyExpression",
+   "type": "object",
+   "description": "A representation of a property in a projection.",
+   "properties": {
+    "aggregationFunction": {
+     "type": "string",
+     "description": "The aggregation function to apply to the property. Optional. Can only be used when grouping by at least one property. Must then be set on all properties in the projection that are not being grouped by. Aggregation functions: first selects the first result as determined by the query's order."
+    },
+    "property": {
+     "$ref": "PropertyReference",
+     "description": "The property to project."
+    }
+   }
+  },
+  "PropertyFilter": {
+   "id": "PropertyFilter",
+   "type": "object",
+   "description": "A filter on a specific property.",
+   "properties": {
+    "operator": {
+     "type": "string",
+     "description": "The operator to filter by. One of lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual, equal, or hasAncestor."
+    },
+    "property": {
+     "$ref": "PropertyReference",
+     "description": "The property to filter by."
+    },
+    "value": {
+     "$ref": "Value",
+     "description": "The value to compare the property to."
+    }
+   }
+  },
+  "PropertyOrder": {
+   "id": "PropertyOrder",
+   "type": "object",
+   "description": "The desired order for a specific property.",
+   "properties": {
+    "direction": {
+     "type": "string",
+     "description": "The direction to order by. One of ascending or descending. Optional, defaults to ascending."
+    },
+    "property": {
+     "$ref": "PropertyReference",
+     "description": "The property to order by."
+    }
+   }
+  },
+  "PropertyReference": {
+   "id": "PropertyReference",
+   "type": "object",
+   "description": "A reference to a property relative to the kind expressions.",
+   "properties": {
+    "name": {
+     "type": "string",
+     "description": "The name of the property."
+    }
+   }
+  },
+  "Query": {
+   "id": "Query",
+   "type": "object",
+   "description": "A query.",
+   "properties": {
+    "endCursor": {
+     "type": "string",
+     "description": "An ending point for the query results. Optional. Query cursors are returned in query result batches.",
+     "format": "byte"
+    },
+    "filter": {
+     "$ref": "Filter",
+     "description": "The filter to apply (optional)."
+    },
+    "groupBy": {
+     "type": "array",
+     "description": "The properties to group by (if empty, no grouping is applied to the result set).",
+     "items": {
+      "$ref": "PropertyReference"
+     }
+    },
+    "kinds": {
+     "type": "array",
+     "description": "The kinds to query (if empty, returns entities from all kinds).",
+     "items": {
+      "$ref": "KindExpression"
+     }
+    },
+    "limit": {
+     "type": "integer",
+     "description": "The maximum number of results to return. Applies after all other constraints. Optional.",
+     "format": "int32"
+    },
+    "offset": {
+     "type": "integer",
+     "description": "The number of results to skip. Applies before limit, but after all other constraints (optional, defaults to 0).",
+     "format": "int32"
+    },
+    "order": {
+     "type": "array",
+     "description": "The order to apply to the query results (if empty, order is unspecified).",
+     "items": {
+      "$ref": "PropertyOrder"
+     }
+    },
+    "projection": {
+     "type": "array",
+     "description": "The projection to return. If not set the entire entity is returned.",
+     "items": {
+      "$ref": "PropertyExpression"
+     }
+    },
+    "startCursor": {
+     "type": "string",
+     "description": "A starting point for the query results. Optional. Query cursors are returned in query result batches.",
+     "format": "byte"
+    }
+   }
+  },
+  "QueryResultBatch": {
+   "id": "QueryResultBatch",
+   "type": "object",
+   "description": "A batch of results produced by a query.",
+   "properties": {
+    "endCursor": {
+     "type": "string",
+     "description": "A cursor that points to the position after the last result in the batch. May be absent.",
+     "format": "byte"
+    },
+    "entityResultType": {
+     "type": "string",
+     "description": "The result type for every entity in entityResults. full for full entities, projection for entities with only projected properties, keyOnly for entities with only a key."
+    },
+    "entityResults": {
+     "type": "array",
+     "description": "The results for this batch.",
+     "items": {
+      "$ref": "EntityResult"
+     }
+    },
+    "moreResults": {
+     "type": "string",
+     "description": "The state of the query after the current batch. One of notFinished, moreResultsAfterLimit, noMoreResults."
+    },
+    "skippedResults": {
+     "type": "integer",
+     "description": "The number of results skipped because of Query.offset.",
+     "format": "int32"
+    }
+   }
+  },
+  "ReadOptions": {
+   "id": "ReadOptions",
+   "type": "object",
+   "description": "Options shared by read requests.",
+   "properties": {
+    "readConsistency": {
+     "type": "string",
+     "description": "The read consistency to use. One of default, strong, or eventual. Cannot be set when transaction is set. Lookup and ancestor queries default to strong, global queries default to eventual and cannot be set to strong. Optional. Default is default."
+    },
+    "transaction": {
+     "type": "string",
+     "description": "The transaction to use. Optional.",
+     "format": "byte"
+    }
+   }
+  },
+  "RollbackRequest": {
+   "id": "RollbackRequest",
+   "type": "object",
+   "description": "The request for Rollback.",
+   "properties": {
+    "transaction": {
+     "type": "string",
+     "description": "The transaction identifier, returned by a call to beginTransaction.",
+     "format": "byte"
+    }
+   }
+  },
+  "RollbackResponse": {
+   "id": "RollbackResponse",
+   "type": "object",
+   "description": "The response for Rollback.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"datastore#rollbackResponse\".",
+     "default": "datastore#rollbackResponse"
+    }
+   }
+  },
+  "RunQueryRequest": {
+   "id": "RunQueryRequest",
+   "type": "object",
+   "description": "The request for RunQuery.",
+   "properties": {
+    "partitionId": {
+     "$ref": "PartitionId",
+     "description": "Entities are partitioned into subsets, identified by a dataset (usually implicitly specified by the project) and namespace ID. Queries are scoped to a single partition."
+    },
+    "query": {
+     "$ref": "Query",
+     "description": "The query to run."
+    },
+    "readOptions": {
+     "$ref": "ReadOptions",
+     "description": "The options for this query."
+    }
+   }
+  },
+  "RunQueryResponse": {
+   "id": "RunQueryResponse",
+   "type": "object",
+   "description": "The response for RunQuery.",
+   "properties": {
+    "batch": {
+     "$ref": "QueryResultBatch",
+     "description": "A batch of query results (always present)."
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind, fixed to \"datastore#runQueryResponse\".",
+     "default": "datastore#runQueryResponse"
+    }
+   }
+  },
+  "Value": {
+   "id": "Value",
+   "type": "object",
+   "description": "A message that can hold any of the supported value types and associated metadata.\n\nAt most one of the Value fields may be set. If none are set the value is \"null\".",
+   "properties": {
+    "blobKeyValue": {
+     "type": "string",
+     "description": "A blob key value."
+    },
+    "blobValue": {
+     "type": "string",
+     "description": "A blob value.",
+     "format": "byte"
+    },
+    "booleanValue": {
+     "type": "boolean",
+     "description": "A boolean value."
+    },
+    "dateTimeValue": {
+     "type": "string",
+     "description": "A timestamp value.",
+     "format": "date-time"
+    },
+    "doubleValue": {
+     "type": "number",
+     "description": "A double value.",
+     "format": "double"
+    },
+    "entityValue": {
+     "$ref": "Entity",
+     "description": "An entity value. May have no key. May have a key with an incomplete key path. May have a reserved/read-only key."
+    },
+    "indexed": {
+     "type": "boolean",
+     "description": "If the value should be indexed.\n\nThe indexed property may be set to null. When indexed is true, stringValue is limited to 500 characters and the blob value is limited to 500 bytes. Input values by default have indexed set to true; however, you can explicitly set indexed to true if you want. (An output value never has indexed explicitly set to true.) If a value is itself an entity, it cannot have indexed set to true."
+    },
+    "integerValue": {
+     "type": "string",
+     "description": "An integer value.",
+     "format": "int64"
+    },
+    "keyValue": {
+     "$ref": "Key",
+     "description": "A key value."
+    },
+    "meaning": {
+     "type": "integer",
+     "description": "The meaning field is reserved and should not be used.",
+     "format": "int32"
+    },
+    "stringValue": {
+     "type": "string",
+     "description": "A UTF-8 encoded string value."
+    }
+   }
+  }
+ },
+ "resources": {
+  "datasets": {
+   "methods": {
+    "allocateIds": {
+     "id": "datastore.datasets.allocateIds",
+     "path": "{datasetId}/allocateIds",
+     "httpMethod": "POST",
+     "description": "Allocate IDs for incomplete keys (useful for referencing an entity before it is inserted).",
+     "parameters": {
+      "datasetId": {
+       "type": "string",
+       "description": "Identifies the dataset.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "datasetId"
+     ],
+     "request": {
+      "$ref": "AllocateIdsRequest"
+     },
+     "response": {
+      "$ref": "AllocateIdsResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/userinfo.email"
+     ]
+    },
+    "beginTransaction": {
+     "id": "datastore.datasets.beginTransaction",
+     "path": "{datasetId}/beginTransaction",
+     "httpMethod": "POST",
+     "description": "Begin a new transaction.",
+     "parameters": {
+      "datasetId": {
+       "type": "string",
+       "description": "Identifies the dataset.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "datasetId"
+     ],
+     "request": {
+      "$ref": "BeginTransactionRequest"
+     },
+     "response": {
+      "$ref": "BeginTransactionResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/userinfo.email"
+     ]
+    },
+    "blindWrite": {
+     "id": "datastore.datasets.blindWrite",
+     "path": "{datasetId}/blindWrite",
+     "httpMethod": "POST",
+     "description": "Create, delete or modify some entities outside a transaction.",
+     "parameters": {
+      "datasetId": {
+       "type": "string",
+       "description": "Identifies the dataset.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "datasetId"
+     ],
+     "request": {
+      "$ref": "BlindWriteRequest"
+     },
+     "response": {
+      "$ref": "BlindWriteResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/userinfo.email"
+     ]
+    },
+    "commit": {
+     "id": "datastore.datasets.commit",
+     "path": "{datasetId}/commit",
+     "httpMethod": "POST",
+     "description": "Commit a transaction, optionally creating, deleting or modifying some entities.",
+     "parameters": {
+      "datasetId": {
+       "type": "string",
+       "description": "Identifies the dataset.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "datasetId"
+     ],
+     "request": {
+      "$ref": "CommitRequest"
+     },
+     "response": {
+      "$ref": "CommitResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/userinfo.email"
+     ]
+    },
+    "lookup": {
+     "id": "datastore.datasets.lookup",
+     "path": "{datasetId}/lookup",
+     "httpMethod": "POST",
+     "description": "Look up some entities by key.",
+     "parameters": {
+      "datasetId": {
+       "type": "string",
+       "description": "Identifies the dataset.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "datasetId"
+     ],
+     "request": {
+      "$ref": "LookupRequest"
+     },
+     "response": {
+      "$ref": "LookupResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/userinfo.email"
+     ]
+    },
+    "rollback": {
+     "id": "datastore.datasets.rollback",
+     "path": "{datasetId}/rollback",
+     "httpMethod": "POST",
+     "description": "Roll back a transaction.",
+     "parameters": {
+      "datasetId": {
+       "type": "string",
+       "description": "Identifies the dataset.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "datasetId"
+     ],
+     "request": {
+      "$ref": "RollbackRequest"
+     },
+     "response": {
+      "$ref": "RollbackResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/userinfo.email"
+     ]
+    },
+    "runQuery": {
+     "id": "datastore.datasets.runQuery",
+     "path": "{datasetId}/runQuery",
+     "httpMethod": "POST",
+     "description": "Query for entities.",
+     "parameters": {
+      "datasetId": {
+       "type": "string",
+       "description": "Identifies the dataset.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "datasetId"
+     ],
+     "request": {
+      "$ref": "RunQueryRequest"
+     },
+     "response": {
+      "$ref": "RunQueryResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/userinfo.email"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/datastore/v1beta1/datastore-gen.go b/datastore/v1beta1/datastore-gen.go
new file mode 100644
index 0000000..dfd4817
--- /dev/null
+++ b/datastore/v1beta1/datastore-gen.go
@@ -0,0 +1,1006 @@
+// Package datastore provides access to the Google Cloud Datastore API.
+//
+// See https://developers.google.com/datastore/
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/datastore/v1beta1"
+//   ...
+//   datastoreService, err := datastore.New(oauthHttpClient)
+package datastore
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "datastore:v1beta1"
+const apiName = "datastore"
+const apiVersion = "v1beta1"
+const basePath = "https://www.googleapis.com/datastore/v1beta1/datasets/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View your email address
+	UserinfoEmailScope = "https://www.googleapis.com/auth/userinfo.email"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.Datasets = NewDatasetsService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	Datasets *DatasetsService
+}
+
+func NewDatasetsService(s *Service) *DatasetsService {
+	rs := &DatasetsService{s: s}
+	return rs
+}
+
+type DatasetsService struct {
+	s *Service
+}
+
+type AllocateIdsRequest struct {
+	// Keys: A list of keys with incomplete key paths to allocate IDs for.
+	// No key may be reserved/read-only.
+	Keys []*Key `json:"keys,omitempty"`
+}
+
+type AllocateIdsResponse struct {
+	// Keys: The keys specified in the request (in the same order), each
+	// with its key path completed with a newly allocated ID.
+	Keys []*Key `json:"keys,omitempty"`
+
+	// Kind: The kind, fixed to "datastore#allocateIdsResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type BeginTransactionRequest struct {
+	// IsolationLevel: The transaction isolation level. Either snapshot or
+	// serializable. The default isolation level is snapshot isolation,
+	// which means that another transaction may not concurrently modify the
+	// data that is modified by this transaction. Optionally, a transaction
+	// can request to be made serializable which means that another
+	// transaction cannot concurrently modify the data that is read or
+	// modified by this transaction.
+	IsolationLevel string `json:"isolationLevel,omitempty"`
+}
+
+type BeginTransactionResponse struct {
+	// Kind: The kind, fixed to "datastore#beginTransactionResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// Transaction: The transaction identifier (always present).
+	Transaction string `json:"transaction,omitempty"`
+}
+
+type BlindWriteRequest struct {
+	// Mutation: The mutation to perform.
+	Mutation *Mutation `json:"mutation,omitempty"`
+}
+
+type BlindWriteResponse struct {
+	// Kind: The kind, fixed to "datastore#blindWriteResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// MutationResult: The result of performing the mutation.
+	MutationResult *MutationResult `json:"mutationResult,omitempty"`
+}
+
+type CommitRequest struct {
+	// Mutation: The mutation to perform as part of this transaction.
+	// Optional.
+	Mutation *Mutation `json:"mutation,omitempty"`
+
+	// Transaction: The transaction identifier, returned by a call to
+	// beginTransaction.
+	Transaction string `json:"transaction,omitempty"`
+}
+
+type CommitResponse struct {
+	// Kind: The kind, fixed to "datastore#commitResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// MutationResult: The result of performing the mutation (if any).
+	MutationResult *MutationResult `json:"mutationResult,omitempty"`
+}
+
+type CompositeFilter struct {
+	// Filters: The list of filters to combine. Must contain at least one
+	// filter.
+	Filters []*Filter `json:"filters,omitempty"`
+
+	// Operator: The operator for combining multiple filters. Only "and" is
+	// currently supported.
+	Operator string `json:"operator,omitempty"`
+}
+
+type Entity struct {
+	// Key: The entity's key.
+	//
+	// An entity must have a key, unless otherwise
+	// documented (for example, an entity in Value.entityValue may have no
+	// key). An entity's kind is its key's path's last element's kind, or
+	// null if it has no key.
+	Key *Key `json:"key,omitempty"`
+
+	// Properties: The entity's properties.
+	Properties *EntityProperties `json:"properties,omitempty"`
+}
+
+type EntityProperties struct {
+}
+
+type EntityResult struct {
+	// Entity: The resulting entity.
+	Entity *Entity `json:"entity,omitempty"`
+}
+
+type Filter struct {
+	// CompositeFilter: A composite filter.
+	CompositeFilter *CompositeFilter `json:"compositeFilter,omitempty"`
+
+	// PropertyFilter: A filter on a property.
+	PropertyFilter *PropertyFilter `json:"propertyFilter,omitempty"`
+}
+
+type Key struct {
+	// PartitionId: Entities are partitioned into subsets, identified by a
+	// dataset (usually implicitly specified by the project) and namespace
+	// ID. Queries are scoped to a single partition.
+	PartitionId *PartitionId `json:"partitionId,omitempty"`
+
+	// Path: The entity path. An entity path consists of one or more
+	// elements composed of a kind and a string or numerical identifier,
+	// which identify entities. The first element identifies a root entity,
+	// the second element identifies a child of the root entity, the third
+	// element a child of the second entity, and so forth. The entities
+	// identified by all prefixes of the path are called the element's
+	// ancestors. An entity path is always fully complete: ALL of the
+	// entity's ancestors are required to be in the path along with the
+	// entity identifier itself. The only exception is that in some
+	// documented cases, the identifier in the last path element (for the
+	// entity) itself may be omitted. A path can never be empty.
+	Path []*KeyPathElement `json:"path,omitempty"`
+}
+
+type KeyPathElement struct {
+	// Id: The ID of the entity. Always > 0.
+	Id int64 `json:"id,omitempty,string"`
+
+	// Kind: The kind of the entity. Kinds matching regex "__.*__" are
+	// reserved/read-only. Cannot be "".
+	Kind string `json:"kind,omitempty"`
+
+	// Name: The name of the entity. Names matching regex "__.*__" are
+	// reserved/read-only. Cannot be "".
+	Name string `json:"name,omitempty"`
+}
+
+type KindExpression struct {
+	// Name: The name of the kind.
+	Name string `json:"name,omitempty"`
+}
+
+type LookupRequest struct {
+	// Keys: Keys of entities to look up from the datastore.
+	Keys []*Key `json:"keys,omitempty"`
+
+	// ReadOptions: Options for this lookup request. Optional.
+	ReadOptions *ReadOptions `json:"readOptions,omitempty"`
+}
+
+type LookupResponse struct {
+	// Deferred: A list of keys that were not looked up due to resource
+	// constraints.
+	Deferred []*Key `json:"deferred,omitempty"`
+
+	// Found: Entities found.
+	Found []*EntityResult `json:"found,omitempty"`
+
+	// Kind: The kind, fixed to "datastore#lookupResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// Missing: Entities not found, with only the key populated.
+	Missing []*EntityResult `json:"missing,omitempty"`
+}
+
+type Mutation struct {
+	// Delete: Keys of entities to delete. Each key must have a complete key
+	// path and must not be reserved/read-only.
+	Delete []*Key `json:"delete,omitempty"`
+
+	// Force: Ignore a user specified read-only period. Optional.
+	Force bool `json:"force,omitempty"`
+
+	// Insert: Entities to insert. Each inserted entity's key must have a
+	// complete path and must not be reserved/read-only.
+	Insert []*Entity `json:"insert,omitempty"`
+
+	// InsertAutoId: Insert entities with a newly allocated ID. Each
+	// inserted entity's key must omit the final identifier in its path and
+	// must not be reserved/read-only.
+	InsertAutoId []*Entity `json:"insertAutoId,omitempty"`
+
+	// Update: Entities to update. Each updated entity's key must have a
+	// complete path and must not be reserved/read-only.
+	Update []*Entity `json:"update,omitempty"`
+
+	// Upsert: Entities to upsert. Each upserted entity's key must have a
+	// complete path and must not be reserved/read-only.
+	Upsert []*Entity `json:"upsert,omitempty"`
+}
+
+type MutationResult struct {
+	// IndexUpdates: Number of index writes.
+	IndexUpdates int64 `json:"indexUpdates,omitempty"`
+
+	// InsertAutoIdKeys: Keys for insertAutoId entities. One per entity from
+	// the request, in the same order.
+	InsertAutoIdKeys []*Key `json:"insertAutoIdKeys,omitempty"`
+}
+
+type PartitionId struct {
+	// DatasetId: The dataset ID.
+	DatasetId string `json:"datasetId,omitempty"`
+
+	// Namespace: The namespace.
+	Namespace string `json:"namespace,omitempty"`
+}
+
+type Property struct {
+	// Multi: If this property contains a list of values. Input values may
+	// explicitly set multi to false, but otherwise false is always
+	// represented by omitting multi.
+	Multi bool `json:"multi,omitempty"`
+
+	// Values: The value(s) of the property. When multi is false there is
+	// always exactly one value. When multi is true there is always one or
+	// more values. Each value can have only one value property populated.
+	// For example, you cannot have a values list of { values: [ {
+	// integerValue: 22, stringValue: "a" } ] }, but you can have { multi:
+	// true, values: [ { integerValue: 22 }, { stringValue: "a" } ] }.
+	Values []*Value `json:"values,omitempty"`
+}
+
+type PropertyExpression struct {
+	// AggregationFunction: The aggregation function to apply to the
+	// property. Optional. Can only be used when grouping by at least one
+	// property. Must then be set on all properties in the projection that
+	// are not being grouped by. Aggregation functions: first selects the
+	// first result as determined by the query's order.
+	AggregationFunction string `json:"aggregationFunction,omitempty"`
+
+	// Property: The property to project.
+	Property *PropertyReference `json:"property,omitempty"`
+}
+
+type PropertyFilter struct {
+	// Operator: The operator to filter by. One of lessThan,
+	// lessThanOrEqual, greaterThan, greaterThanOrEqual, equal, or
+	// hasAncestor.
+	Operator string `json:"operator,omitempty"`
+
+	// Property: The property to filter by.
+	Property *PropertyReference `json:"property,omitempty"`
+
+	// Value: The value to compare the property to.
+	Value *Value `json:"value,omitempty"`
+}
+
+type PropertyOrder struct {
+	// Direction: The direction to order by. One of ascending or descending.
+	// Optional, defaults to ascending.
+	Direction string `json:"direction,omitempty"`
+
+	// Property: The property to order by.
+	Property *PropertyReference `json:"property,omitempty"`
+}
+
+type PropertyReference struct {
+	// Name: The name of the property.
+	Name string `json:"name,omitempty"`
+}
+
+type Query struct {
+	// EndCursor: An ending point for the query results. Optional. Query
+	// cursors are returned in query result batches.
+	EndCursor string `json:"endCursor,omitempty"`
+
+	// Filter: The filter to apply (optional).
+	Filter *Filter `json:"filter,omitempty"`
+
+	// GroupBy: The properties to group by (if empty, no grouping is applied
+	// to the result set).
+	GroupBy []*PropertyReference `json:"groupBy,omitempty"`
+
+	// Kinds: The kinds to query (if empty, returns entities from all
+	// kinds).
+	Kinds []*KindExpression `json:"kinds,omitempty"`
+
+	// Limit: The maximum number of results to return. Applies after all
+	// other constraints. Optional.
+	Limit int64 `json:"limit,omitempty"`
+
+	// Offset: The number of results to skip. Applies before limit, but
+	// after all other constraints (optional, defaults to 0).
+	Offset int64 `json:"offset,omitempty"`
+
+	// Order: The order to apply to the query results (if empty, order is
+	// unspecified).
+	Order []*PropertyOrder `json:"order,omitempty"`
+
+	// Projection: The projection to return. If not set the entire entity is
+	// returned.
+	Projection []*PropertyExpression `json:"projection,omitempty"`
+
+	// StartCursor: A starting point for the query results. Optional. Query
+	// cursors are returned in query result batches.
+	StartCursor string `json:"startCursor,omitempty"`
+}
+
+type QueryResultBatch struct {
+	// EndCursor: A cursor that points to the position after the last result
+	// in the batch. May be absent.
+	EndCursor string `json:"endCursor,omitempty"`
+
+	// EntityResultType: The result type for every entity in entityResults.
+	// full for full entities, projection for entities with only projected
+	// properties, keyOnly for entities with only a key.
+	EntityResultType string `json:"entityResultType,omitempty"`
+
+	// EntityResults: The results for this batch.
+	EntityResults []*EntityResult `json:"entityResults,omitempty"`
+
+	// MoreResults: The state of the query after the current batch. One of
+	// notFinished, moreResultsAfterLimit, noMoreResults.
+	MoreResults string `json:"moreResults,omitempty"`
+
+	// SkippedResults: The number of results skipped because of
+	// Query.offset.
+	SkippedResults int64 `json:"skippedResults,omitempty"`
+}
+
+type ReadOptions struct {
+	// ReadConsistency: The read consistency to use. One of default, strong,
+	// or eventual. Cannot be set when transaction is set. Lookup and
+	// ancestor queries default to strong, global queries default to
+	// eventual and cannot be set to strong. Optional. Default is default.
+	ReadConsistency string `json:"readConsistency,omitempty"`
+
+	// Transaction: The transaction to use. Optional.
+	Transaction string `json:"transaction,omitempty"`
+}
+
+type RollbackRequest struct {
+	// Transaction: The transaction identifier, returned by a call to
+	// beginTransaction.
+	Transaction string `json:"transaction,omitempty"`
+}
+
+type RollbackResponse struct {
+	// Kind: The kind, fixed to "datastore#rollbackResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type RunQueryRequest struct {
+	// PartitionId: Entities are partitioned into subsets, identified by a
+	// dataset (usually implicitly specified by the project) and namespace
+	// ID. Queries are scoped to a single partition.
+	PartitionId *PartitionId `json:"partitionId,omitempty"`
+
+	// Query: The query to run.
+	Query *Query `json:"query,omitempty"`
+
+	// ReadOptions: The options for this query.
+	ReadOptions *ReadOptions `json:"readOptions,omitempty"`
+}
+
+type RunQueryResponse struct {
+	// Batch: A batch of query results (always present).
+	Batch *QueryResultBatch `json:"batch,omitempty"`
+
+	// Kind: The kind, fixed to "datastore#runQueryResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type Value struct {
+	// BlobKeyValue: A blob key value.
+	BlobKeyValue string `json:"blobKeyValue,omitempty"`
+
+	// BlobValue: A blob value.
+	BlobValue string `json:"blobValue,omitempty"`
+
+	// BooleanValue: A boolean value.
+	BooleanValue bool `json:"booleanValue,omitempty"`
+
+	// DateTimeValue: A timestamp value.
+	DateTimeValue string `json:"dateTimeValue,omitempty"`
+
+	// DoubleValue: A double value.
+	DoubleValue float64 `json:"doubleValue,omitempty"`
+
+	// EntityValue: An entity value. May have no key. May have a key with an
+	// incomplete key path. May have a reserved/read-only key.
+	EntityValue *Entity `json:"entityValue,omitempty"`
+
+	// Indexed: If the value should be indexed.
+	//
+	// The indexed property may be
+	// set to null. When indexed is true, stringValue is limited to 500
+	// characters and the blob value is limited to 500 bytes. Input values
+	// by default have indexed set to true; however, you can explicitly set
+	// indexed to true if you want. (An output value never has indexed
+	// explicitly set to true.) If a value is itself an entity, it cannot
+	// have indexed set to true.
+	Indexed bool `json:"indexed,omitempty"`
+
+	// IntegerValue: An integer value.
+	IntegerValue int64 `json:"integerValue,omitempty,string"`
+
+	// KeyValue: A key value.
+	KeyValue *Key `json:"keyValue,omitempty"`
+
+	// Meaning: The meaning field is reserved and should not be used.
+	Meaning int64 `json:"meaning,omitempty"`
+
+	// StringValue: A UTF-8 encoded string value.
+	StringValue string `json:"stringValue,omitempty"`
+}
+
+// method id "datastore.datasets.allocateIds":
+
+type DatasetsAllocateIdsCall struct {
+	s                  *Service
+	datasetId          string
+	allocateidsrequest *AllocateIdsRequest
+	opt_               map[string]interface{}
+}
+
+// AllocateIds: Allocate IDs for incomplete keys (useful for referencing
+// an entity before it is inserted).
+func (r *DatasetsService) AllocateIds(datasetId string, allocateidsrequest *AllocateIdsRequest) *DatasetsAllocateIdsCall {
+	c := &DatasetsAllocateIdsCall{s: r.s, opt_: make(map[string]interface{})}
+	c.datasetId = datasetId
+	c.allocateidsrequest = allocateidsrequest
+	return c
+}
+
+func (c *DatasetsAllocateIdsCall) Do() (*AllocateIdsResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.allocateidsrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/datastore/v1beta1/datasets/", "{datasetId}/allocateIds")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(AllocateIdsResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Allocate IDs for incomplete keys (useful for referencing an entity before it is inserted).",
+	//   "httpMethod": "POST",
+	//   "id": "datastore.datasets.allocateIds",
+	//   "parameterOrder": [
+	//     "datasetId"
+	//   ],
+	//   "parameters": {
+	//     "datasetId": {
+	//       "description": "Identifies the dataset.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{datasetId}/allocateIds",
+	//   "request": {
+	//     "$ref": "AllocateIdsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "AllocateIdsResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/userinfo.email"
+	//   ]
+	// }
+
+}
+
+// method id "datastore.datasets.beginTransaction":
+
+type DatasetsBeginTransactionCall struct {
+	s                       *Service
+	datasetId               string
+	begintransactionrequest *BeginTransactionRequest
+	opt_                    map[string]interface{}
+}
+
+// BeginTransaction: Begin a new transaction.
+func (r *DatasetsService) BeginTransaction(datasetId string, begintransactionrequest *BeginTransactionRequest) *DatasetsBeginTransactionCall {
+	c := &DatasetsBeginTransactionCall{s: r.s, opt_: make(map[string]interface{})}
+	c.datasetId = datasetId
+	c.begintransactionrequest = begintransactionrequest
+	return c
+}
+
+func (c *DatasetsBeginTransactionCall) Do() (*BeginTransactionResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.begintransactionrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/datastore/v1beta1/datasets/", "{datasetId}/beginTransaction")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(BeginTransactionResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Begin a new transaction.",
+	//   "httpMethod": "POST",
+	//   "id": "datastore.datasets.beginTransaction",
+	//   "parameterOrder": [
+	//     "datasetId"
+	//   ],
+	//   "parameters": {
+	//     "datasetId": {
+	//       "description": "Identifies the dataset.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{datasetId}/beginTransaction",
+	//   "request": {
+	//     "$ref": "BeginTransactionRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "BeginTransactionResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/userinfo.email"
+	//   ]
+	// }
+
+}
+
+// method id "datastore.datasets.blindWrite":
+
+type DatasetsBlindWriteCall struct {
+	s                 *Service
+	datasetId         string
+	blindwriterequest *BlindWriteRequest
+	opt_              map[string]interface{}
+}
+
+// BlindWrite: Create, delete or modify some entities outside a
+// transaction.
+func (r *DatasetsService) BlindWrite(datasetId string, blindwriterequest *BlindWriteRequest) *DatasetsBlindWriteCall {
+	c := &DatasetsBlindWriteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.datasetId = datasetId
+	c.blindwriterequest = blindwriterequest
+	return c
+}
+
+func (c *DatasetsBlindWriteCall) Do() (*BlindWriteResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.blindwriterequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/datastore/v1beta1/datasets/", "{datasetId}/blindWrite")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(BlindWriteResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Create, delete or modify some entities outside a transaction.",
+	//   "httpMethod": "POST",
+	//   "id": "datastore.datasets.blindWrite",
+	//   "parameterOrder": [
+	//     "datasetId"
+	//   ],
+	//   "parameters": {
+	//     "datasetId": {
+	//       "description": "Identifies the dataset.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{datasetId}/blindWrite",
+	//   "request": {
+	//     "$ref": "BlindWriteRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "BlindWriteResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/userinfo.email"
+	//   ]
+	// }
+
+}
+
+// method id "datastore.datasets.commit":
+
+type DatasetsCommitCall struct {
+	s             *Service
+	datasetId     string
+	commitrequest *CommitRequest
+	opt_          map[string]interface{}
+}
+
+// Commit: Commit a transaction, optionally creating, deleting or
+// modifying some entities.
+func (r *DatasetsService) Commit(datasetId string, commitrequest *CommitRequest) *DatasetsCommitCall {
+	c := &DatasetsCommitCall{s: r.s, opt_: make(map[string]interface{})}
+	c.datasetId = datasetId
+	c.commitrequest = commitrequest
+	return c
+}
+
+func (c *DatasetsCommitCall) Do() (*CommitResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commitrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/datastore/v1beta1/datasets/", "{datasetId}/commit")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(CommitResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Commit a transaction, optionally creating, deleting or modifying some entities.",
+	//   "httpMethod": "POST",
+	//   "id": "datastore.datasets.commit",
+	//   "parameterOrder": [
+	//     "datasetId"
+	//   ],
+	//   "parameters": {
+	//     "datasetId": {
+	//       "description": "Identifies the dataset.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{datasetId}/commit",
+	//   "request": {
+	//     "$ref": "CommitRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "CommitResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/userinfo.email"
+	//   ]
+	// }
+
+}
+
+// method id "datastore.datasets.lookup":
+
+type DatasetsLookupCall struct {
+	s             *Service
+	datasetId     string
+	lookuprequest *LookupRequest
+	opt_          map[string]interface{}
+}
+
+// Lookup: Look up some entities by key.
+func (r *DatasetsService) Lookup(datasetId string, lookuprequest *LookupRequest) *DatasetsLookupCall {
+	c := &DatasetsLookupCall{s: r.s, opt_: make(map[string]interface{})}
+	c.datasetId = datasetId
+	c.lookuprequest = lookuprequest
+	return c
+}
+
+func (c *DatasetsLookupCall) Do() (*LookupResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.lookuprequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/datastore/v1beta1/datasets/", "{datasetId}/lookup")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(LookupResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Look up some entities by key.",
+	//   "httpMethod": "POST",
+	//   "id": "datastore.datasets.lookup",
+	//   "parameterOrder": [
+	//     "datasetId"
+	//   ],
+	//   "parameters": {
+	//     "datasetId": {
+	//       "description": "Identifies the dataset.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{datasetId}/lookup",
+	//   "request": {
+	//     "$ref": "LookupRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "LookupResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/userinfo.email"
+	//   ]
+	// }
+
+}
+
+// method id "datastore.datasets.rollback":
+
+type DatasetsRollbackCall struct {
+	s               *Service
+	datasetId       string
+	rollbackrequest *RollbackRequest
+	opt_            map[string]interface{}
+}
+
+// Rollback: Roll back a transaction.
+func (r *DatasetsService) Rollback(datasetId string, rollbackrequest *RollbackRequest) *DatasetsRollbackCall {
+	c := &DatasetsRollbackCall{s: r.s, opt_: make(map[string]interface{})}
+	c.datasetId = datasetId
+	c.rollbackrequest = rollbackrequest
+	return c
+}
+
+func (c *DatasetsRollbackCall) Do() (*RollbackResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbackrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/datastore/v1beta1/datasets/", "{datasetId}/rollback")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(RollbackResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Roll back a transaction.",
+	//   "httpMethod": "POST",
+	//   "id": "datastore.datasets.rollback",
+	//   "parameterOrder": [
+	//     "datasetId"
+	//   ],
+	//   "parameters": {
+	//     "datasetId": {
+	//       "description": "Identifies the dataset.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{datasetId}/rollback",
+	//   "request": {
+	//     "$ref": "RollbackRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "RollbackResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/userinfo.email"
+	//   ]
+	// }
+
+}
+
+// method id "datastore.datasets.runQuery":
+
+type DatasetsRunQueryCall struct {
+	s               *Service
+	datasetId       string
+	runqueryrequest *RunQueryRequest
+	opt_            map[string]interface{}
+}
+
+// RunQuery: Query for entities.
+func (r *DatasetsService) RunQuery(datasetId string, runqueryrequest *RunQueryRequest) *DatasetsRunQueryCall {
+	c := &DatasetsRunQueryCall{s: r.s, opt_: make(map[string]interface{})}
+	c.datasetId = datasetId
+	c.runqueryrequest = runqueryrequest
+	return c
+}
+
+func (c *DatasetsRunQueryCall) Do() (*RunQueryResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runqueryrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/datastore/v1beta1/datasets/", "{datasetId}/runQuery")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{datasetId}", url.QueryEscape(c.datasetId), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(RunQueryResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Query for entities.",
+	//   "httpMethod": "POST",
+	//   "id": "datastore.datasets.runQuery",
+	//   "parameterOrder": [
+	//     "datasetId"
+	//   ],
+	//   "parameters": {
+	//     "datasetId": {
+	//       "description": "Identifies the dataset.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{datasetId}/runQuery",
+	//   "request": {
+	//     "$ref": "RunQueryRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "RunQueryResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/userinfo.email"
+	//   ]
+	// }
+
+}
diff --git a/dfareporting/v1.1/dfareporting-api.json b/dfareporting/v1.1/dfareporting-api.json
index 7c7e267..c27de65 100644
--- a/dfareporting/v1.1/dfareporting-api.json
+++ b/dfareporting/v1.1/dfareporting-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/7WnkCdHInvFoI-RGKhUt7664RmI\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/J0i_0Y9Bf2selpAnvC84hJoZsn8\"",
  "discoveryVersion": "v1",
  "id": "dfareporting:v1.1",
  "name": "dfareporting",
@@ -8,6 +8,8 @@
  "revision": "20130307",
  "title": "DFA Reporting API",
  "description": "Lets you create, run and download reports.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif",
   "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/dfareporting/v1.1/dfareporting-gen.go b/dfareporting/v1.1/dfareporting-gen.go
index 5451615..98b5635 100644
--- a/dfareporting/v1.1/dfareporting-gen.go
+++ b/dfareporting/v1.1/dfareporting-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "dfareporting:v1.1"
 const apiName = "dfareporting"
@@ -825,15 +828,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/dimensionvalues/query")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -945,14 +950,16 @@
 		params.Set("sortOrder", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/files")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1051,15 +1058,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1118,15 +1127,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1197,15 +1208,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1304,14 +1317,16 @@
 		params.Set("sortOrder", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1419,16 +1434,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1507,15 +1524,17 @@
 		params.Set("synchronous", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports/{reportId}/run")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1593,16 +1612,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1673,16 +1694,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports/{reportId}/files/{fileId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
-	urls = strings.Replace(urls, "{fileId}", strconv.FormatInt(c.fileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", strconv.FormatInt(c.fileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1796,15 +1819,17 @@
 		params.Set("sortOrder", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}/reports/{reportId}/files")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1909,14 +1934,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles/{profileId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1972,11 +1999,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.1/", "userprofiles")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1999,12 +2028,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/dfareporting/v1.2/dfareporting-api.json b/dfareporting/v1.2/dfareporting-api.json
new file mode 100644
index 0000000..6be1790
--- /dev/null
+++ b/dfareporting/v1.2/dfareporting-api.json
@@ -0,0 +1,1589 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/8pvqFGIHjCzK5Y-IqyVpfkLRHpE\"",
+ "discoveryVersion": "v1",
+ "id": "dfareporting:v1.2",
+ "name": "dfareporting",
+ "version": "v1.2",
+ "revision": "20130307",
+ "title": "DFA Reporting API",
+ "description": "Lets you create, run and download reports.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif",
+  "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif"
+ },
+ "documentationLink": "https://developers.google.com/doubleclick-advertisers/reporting/",
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/dfareporting/v1.2/",
+ "basePath": "/dfareporting/v1.2/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "dfareporting/v1.2/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/dfareporting": {
+     "description": "View and manage DoubleClick for Advertisers reports"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "Activities": {
+   "id": "Activities",
+   "type": "object",
+   "description": "Represents an activity group.",
+   "properties": {
+    "filters": {
+     "type": "array",
+     "description": "List of activity filters. The dimension values need to be all either of type \"dfa:activity\" or \"dfa:activityGroup\".",
+     "items": {
+      "$ref": "DimensionValue"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#activities.",
+     "default": "dfareporting#activities"
+    },
+    "metricNames": {
+     "type": "array",
+     "description": "List of names of floodlight activity metrics.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "CustomRichMediaEvents": {
+   "id": "CustomRichMediaEvents",
+   "type": "object",
+   "description": "Represents a Custom Rich Media Events group.",
+   "properties": {
+    "filteredEventIds": {
+     "type": "array",
+     "description": "List of custom rich media event IDs. Dimension values must be all of type dfa:richMediaEventTypeIdAndName.",
+     "items": {
+      "$ref": "DimensionValue"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#customRichMediaEvents.",
+     "default": "dfareporting#customRichMediaEvents"
+    }
+   }
+  },
+  "DateRange": {
+   "id": "DateRange",
+   "type": "object",
+   "description": "Represents a date range.",
+   "properties": {
+    "endDate": {
+     "type": "string",
+     "description": "The end date of the date range, inclusive. A string of the format: \"yyyy-MM-dd\".",
+     "format": "date"
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#dateRange.",
+     "default": "dfareporting#dateRange"
+    },
+    "relativeDateRange": {
+     "type": "string",
+     "description": "The date range relative to the date of when the report is run, one of:  \n- \"TODAY\" \n- \"YESTERDAY\" \n- \"WEEK_TO_DATE\" \n- \"MONTH_TO_DATE\" \n- \"QUARTER_TO_DATE\" \n- \"YEAR_TO_DATE\" \n- \"PREVIOUS_WEEK\" \n- \"PREVIOUS_MONTH\" \n- \"PREVIOUS_QUARTER\" \n- \"PREVIOUS_YEAR\" \n- \"LAST_7_DAYS\" \n- \"LAST_30_DAYS\" \n- \"LAST_90_DAYS\" \n- \"LAST_365_DAYS\" \n- \"LAST_24_MONTHS\""
+    },
+    "startDate": {
+     "type": "string",
+     "description": "The start date of the date range, inclusive. A string of the format: \"yyyy-MM-dd\".",
+     "format": "date"
+    }
+   }
+  },
+  "DimensionFilter": {
+   "id": "DimensionFilter",
+   "type": "object",
+   "description": "Represents a dimension filter.",
+   "properties": {
+    "dimensionName": {
+     "type": "string",
+     "description": "The name of the dimension to filter."
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#dimensionFilter.",
+     "default": "dfareporting#dimensionFilter"
+    },
+    "value": {
+     "type": "string",
+     "description": "The value of the dimension to filter."
+    }
+   }
+  },
+  "DimensionValue": {
+   "id": "DimensionValue",
+   "type": "object",
+   "description": "Represents a DimensionValue resource.",
+   "properties": {
+    "dimensionName": {
+     "type": "string",
+     "description": "The name of the dimension."
+    },
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "id": {
+     "type": "string",
+     "description": "The ID associated with the value if available."
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#dimensionValue.",
+     "default": "dfareporting#dimensionValue"
+    },
+    "matchType": {
+     "type": "string",
+     "description": "Determines how the 'value' field is matched when filtering. One of:  \n- EXACT (default if not specified) \n- CONTAINS \n- BEGINS_WITH \n- WILDCARD_EXPRESSION (allowing '*' as a placeholder for variable length character sequences, it can be escaped with a backslash.)  Note, only paid search dimensions ('dfa:paidSearch*') allow a matchType other than EXACT."
+    },
+    "value": {
+     "type": "string",
+     "description": "The value of the dimension."
+    }
+   }
+  },
+  "DimensionValueList": {
+   "id": "DimensionValueList",
+   "type": "object",
+   "description": "Represents the list of DimensionValue resources.",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The dimension values returned in this response.",
+     "items": {
+      "$ref": "DimensionValue"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of list this is, in this case dfareporting#dimensionValueList.",
+     "default": "dfareporting#dimensionValueList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through dimension values. To retrieve the next page of results, set the next request's \"pageToken\" to the value of this field. The page token is only valid for a limited amount of time and should not be persisted."
+    }
+   }
+  },
+  "DimensionValueRequest": {
+   "id": "DimensionValueRequest",
+   "type": "object",
+   "description": "Represents a DimensionValuesRequest.",
+   "properties": {
+    "dimensionName": {
+     "type": "string",
+     "description": "The name of the dimension for which values should be requested."
+    },
+    "endDate": {
+     "type": "string",
+     "description": "The end date of the date range for which to retrieve dimension values. A string of the format: \"yyyy-MM-dd\".",
+     "format": "date"
+    },
+    "filters": {
+     "type": "array",
+     "description": "The list of filters by which to filter values. The filters are ANDed.",
+     "items": {
+      "$ref": "DimensionFilter"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of request this is, in this case dfareporting#dimensionValueRequest.",
+     "default": "dfareporting#dimensionValueRequest"
+    },
+    "startDate": {
+     "type": "string",
+     "description": "The start date of the date range for which to retrieve dimension values. A string of the format: \"yyyy-MM-dd\".",
+     "format": "date"
+    }
+   }
+  },
+  "File": {
+   "id": "File",
+   "type": "object",
+   "description": "Represents a File resource. A File contains the meta-data for a report run. It shows the status of the run and holds the urls to the generated report data if the run is finished and the status is \"REPORT_AVAILABLE\".",
+   "properties": {
+    "dateRange": {
+     "$ref": "DateRange",
+     "description": "The date range for which the file has report data. The date range will always be the absolute date range for which the report is run."
+    },
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "fileName": {
+     "type": "string",
+     "description": "The file name of the file."
+    },
+    "format": {
+     "type": "string",
+     "description": "The output format of the report. Only available once the file is available."
+    },
+    "id": {
+     "type": "string",
+     "description": "The unique ID of this report file.",
+     "format": "int64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#file.",
+     "default": "dfareporting#file"
+    },
+    "lastModifiedTime": {
+     "type": "string",
+     "description": "The timestamp in milliseconds since epoch when this file was last modified.",
+     "format": "int64"
+    },
+    "reportId": {
+     "type": "string",
+     "description": "The ID of the report this file was generated from.",
+     "format": "int64"
+    },
+    "status": {
+     "type": "string",
+     "description": "The status of the report file, one of:  \n- \"PROCESSING\" \n- \"REPORT_AVAILABLE\" \n- \"FAILED\" \n- \"CANCELLED\""
+    },
+    "urls": {
+     "type": "object",
+     "description": "The urls where the completed report file can be downloaded.",
+     "properties": {
+      "apiUrl": {
+       "type": "string",
+       "description": "The url for downloading the report data through the API."
+      },
+      "browserUrl": {
+       "type": "string",
+       "description": "The url for downloading the report data through a browser."
+      }
+     }
+    }
+   }
+  },
+  "FileList": {
+   "id": "FileList",
+   "type": "object",
+   "description": "Represents the list of File resources.",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The files returned in this response.",
+     "items": {
+      "$ref": "File"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of list this is, in this case dfareporting#fileList.",
+     "default": "dfareporting#fileList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through files. To retrieve the next page of results, set the next request's \"pageToken\" to the value of this field. The page token is only valid for a limited amount of time and should not be persisted."
+    }
+   }
+  },
+  "Recipient": {
+   "id": "Recipient",
+   "type": "object",
+   "description": "Represents a recipient.",
+   "properties": {
+    "deliveryType": {
+     "type": "string",
+     "description": "The delivery type for the recipient, one of:  \n- \"ATTACHMENT\" \n- \"LINK\"",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.insert",
+       "dfareporting.reports.update"
+      ]
+     }
+    },
+    "email": {
+     "type": "string",
+     "description": "The email address of the recipient.",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.insert",
+       "dfareporting.reports.update"
+      ]
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#recipient.",
+     "default": "dfareporting#recipient"
+    }
+   }
+  },
+  "Report": {
+   "id": "Report",
+   "type": "object",
+   "description": "Represents a Report resource.",
+   "properties": {
+    "accountId": {
+     "type": "string",
+     "description": "The account ID to which this report belongs.",
+     "format": "int64",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.update"
+      ]
+     }
+    },
+    "activeGrpCriteria": {
+     "type": "object",
+     "description": "The report criteria for a report of type \"ACTIVE_GRP\".",
+     "properties": {
+      "dateRange": {
+       "$ref": "DateRange",
+       "description": "The date range this report should be run for."
+      },
+      "dimensionFilters": {
+       "type": "array",
+       "description": "The list of filters on which dimensions are filtered.\nFilters for different dimensions are ANDed, filters for the same dimension are grouped together and ORed.\nA valid active GRP report needs to have exactly one DimensionValue for the United States in addition to any advertiser or campaign dimension values.",
+       "items": {
+        "$ref": "DimensionValue"
+       }
+      },
+      "dimensions": {
+       "type": "array",
+       "description": "The list of dimensions the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "metricNames": {
+       "type": "array",
+       "description": "The list of names of metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      }
+     }
+    },
+    "criteria": {
+     "type": "object",
+     "description": "The report criteria for a report of type \"STANDARD\".",
+     "properties": {
+      "activities": {
+       "$ref": "Activities",
+       "description": "Activity group."
+      },
+      "customRichMediaEvents": {
+       "$ref": "CustomRichMediaEvents",
+       "description": "Custom Rich Media Events group."
+      },
+      "dateRange": {
+       "$ref": "DateRange",
+       "description": "The date range for which this report should be run."
+      },
+      "dimensionFilters": {
+       "type": "array",
+       "description": "The list of filters on which dimensions are filtered.\nFilters for different dimensions are ANDed, filters for the same dimension are grouped together and ORed.",
+       "items": {
+        "$ref": "DimensionValue"
+       }
+      },
+      "dimensions": {
+       "type": "array",
+       "description": "The list of standard dimensions the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "metricNames": {
+       "type": "array",
+       "description": "The list of names of metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      }
+     }
+    },
+    "crossDimensionReachCriteria": {
+     "type": "object",
+     "description": "The report criteria for a report of type \"CROSS_DIMENSION_REACH\".",
+     "properties": {
+      "breakdown": {
+       "type": "array",
+       "description": "The list of dimensions the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "dateRange": {
+       "$ref": "DateRange",
+       "description": "The date range this report should be run for."
+      },
+      "dimension": {
+       "type": "string",
+       "description": "The dimension option, one of:  \n- \"ADVERTISER\" \n- \"CAMPAIGN\" \n- \"SITE_BY_ADVERTISER\" \n- \"SITE_BY_CAMPAIGN\""
+      },
+      "dimensionFilters": {
+       "type": "array",
+       "description": "The list of filters on which dimensions are filtered.",
+       "items": {
+        "$ref": "DimensionValue"
+       }
+      },
+      "metricNames": {
+       "type": "array",
+       "description": "The list of names of metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      },
+      "overlapMetricNames": {
+       "type": "array",
+       "description": "The list of names of overlap metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      },
+      "pivoted": {
+       "type": "boolean",
+       "description": "Whether the report is pivoted or not. Defaults to true."
+      }
+     }
+    },
+    "delivery": {
+     "type": "object",
+     "description": "The report's email delivery settings.",
+     "properties": {
+      "emailOwner": {
+       "type": "boolean",
+       "description": "Whether the report should be emailed to the report owner."
+      },
+      "emailOwnerDeliveryType": {
+       "type": "string",
+       "description": "The type of delivery for the owner to receive, if enabled. One of:  \n- \"ATTACHMENT\" \n- \"LINK\""
+      },
+      "message": {
+       "type": "string",
+       "description": "The message to be sent with each email."
+      },
+      "recipients": {
+       "type": "array",
+       "description": "The list of recipients to which to email the report.",
+       "items": {
+        "$ref": "Recipient"
+       }
+      }
+     }
+    },
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "fileName": {
+     "type": "string",
+     "description": "The file name used when generating report files for this report."
+    },
+    "floodlightCriteria": {
+     "type": "object",
+     "description": "The report criteria for a report of type \"FLOODLIGHT\".",
+     "properties": {
+      "dateRange": {
+       "$ref": "DateRange",
+       "description": "The date range this report should be run for."
+      },
+      "dimensionFilters": {
+       "type": "array",
+       "description": "The list of filters on which dimensions are filtered.\nFilters for different dimensions are ANDed, filters for the same dimension are grouped together and ORed.",
+       "items": {
+        "$ref": "DimensionValue"
+       }
+      },
+      "dimensions": {
+       "type": "array",
+       "description": "The list of dimensions the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "floodlightConfigId": {
+       "$ref": "DimensionValue",
+       "description": "The floodlight ID for which to show data in this report. All advertisers associated with that ID will automatically be added. The dimension of the value needs to be 'dfa:floodlightConfigId'."
+      },
+      "metricNames": {
+       "type": "array",
+       "description": "The list of names of metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      },
+      "reportProperties": {
+       "type": "object",
+       "description": "The properties of the report.",
+       "properties": {
+        "includeAttributedIPConversions": {
+         "type": "boolean",
+         "description": "Include conversions that have no cookie, but do have an exposure path."
+        },
+        "includeUnattributedCookieConversions": {
+         "type": "boolean",
+         "description": "Include conversions of users with a DoubleClick cookie but without an exposure. That means the user did not click or see an ad from the advertiser within the Floodlight group, or that the interaction happened outside the lookback window."
+        },
+        "includeUnattributedIPConversions": {
+         "type": "boolean",
+         "description": "Include conversions that have no associated cookies and no exposures. It’s therefore impossible to know how the user was exposed to your ads during the lookback window prior to a conversion."
+        }
+       }
+      }
+     }
+    },
+    "format": {
+     "type": "string",
+     "description": "The output format of the report, one of:  \n- \"CSV\" \n- \"EXCEL\"  If not specified, default format is \"CSV\". Note that the actual format in the completed report file might differ if for instance the report's size exceeds the format's capabilities. \"CSV\" will then be the fallback format."
+    },
+    "id": {
+     "type": "string",
+     "description": "The unique ID identifying this report resource.",
+     "format": "int64",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.update"
+      ]
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#report.",
+     "default": "dfareporting#report"
+    },
+    "lastModifiedTime": {
+     "type": "string",
+     "description": "The timestamp (in milliseconds since epoch) of when this report was last modified.",
+     "format": "uint64",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.update"
+      ]
+     }
+    },
+    "name": {
+     "type": "string",
+     "description": "The name of the report.",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.insert",
+       "dfareporting.reports.update"
+      ]
+     }
+    },
+    "ownerProfileId": {
+     "type": "string",
+     "description": "The user profile id of the owner of this report.",
+     "format": "int64",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.update"
+      ]
+     }
+    },
+    "pathToConversionCriteria": {
+     "type": "object",
+     "description": "The report criteria for a report of type \"PATH_TO_CONVERSION\".",
+     "properties": {
+      "activityFilters": {
+       "type": "array",
+       "description": "The list of 'dfa:activity' values to filter on.",
+       "items": {
+        "$ref": "DimensionValue"
+       }
+      },
+      "conversionDimensions": {
+       "type": "array",
+       "description": "The list of conversion dimensions the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "customFloodlightVariables": {
+       "type": "array",
+       "description": "The list of custom floodlight variables the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "dateRange": {
+       "$ref": "DateRange",
+       "description": "The date range this report should be run for."
+      },
+      "floodlightConfigId": {
+       "$ref": "DimensionValue",
+       "description": "The floodlight ID for which to show data in this report. All advertisers associated with that ID will automatically be added. The dimension of the value needs to be 'dfa:floodlightConfigId'."
+      },
+      "metricNames": {
+       "type": "array",
+       "description": "The list of names of metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      },
+      "perInteractionDimensions": {
+       "type": "array",
+       "description": "The list of per interaction dimensions the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "reportProperties": {
+       "type": "object",
+       "description": "The properties of the report.",
+       "properties": {
+        "clicksLookbackWindow": {
+         "type": "integer",
+         "description": "DFA checks to see if a click interaction occurred within the specified period of time before a conversion. By default the value is pulled from Floodlight or you can manually enter a custom value. Valid values: 1-90.",
+         "format": "int32"
+        },
+        "impressionsLookbackWindow": {
+         "type": "integer",
+         "description": "DFA checks to see if an impression interaction occurred within the specified period of time before a conversion. By default the value is pulled from Floodlight or you can manually enter a custom value. Valid values: 1-90.",
+         "format": "int32"
+        },
+        "includeAttributedIPConversions": {
+         "type": "boolean",
+         "description": "Include conversions that have no cookie, but do have an exposure path."
+        },
+        "includeUnattributedCookieConversions": {
+         "type": "boolean",
+         "description": "Include conversions of users with a DoubleClick cookie but without an exposure. That means the user did not click or see an ad from the advertiser within the Floodlight group, or that the interaction happened outside the lookback window."
+        },
+        "includeUnattributedIPConversions": {
+         "type": "boolean",
+         "description": "Include conversions that have no associated cookies and no exposures. It’s therefore impossible to know how the user was exposed to your ads during the lookback window prior to a conversion."
+        },
+        "maximumClickInteractions": {
+         "type": "integer",
+         "description": "The maximum number of click interactions to include in the report. Advertisers currently paying for E2C reports get up to 200 (100 clicks, 100 impressions). If another advertiser in your network is paying for E2C, you can have up to 5 total exposures per report.",
+         "format": "int32"
+        },
+        "maximumImpressionInteractions": {
+         "type": "integer",
+         "description": "The maximum number of click interactions to include in the report. Advertisers currently paying for E2C reports get up to 200 (100 clicks, 100 impressions). If another advertiser in your network is paying for E2C, you can have up to 5 total exposures per report.",
+         "format": "int32"
+        },
+        "maximumInteractionGap": {
+         "type": "integer",
+         "description": "The maximum amount of time that can take place between interactions (clicks or impressions) by the same user. Valid values: 1-90.",
+         "format": "int32"
+        },
+        "pivotOnInteractionPath": {
+         "type": "boolean",
+         "description": "Enable pivoting on interaction path."
+        }
+       }
+      }
+     }
+    },
+    "reachCriteria": {
+     "type": "object",
+     "description": "The report criteria for a report of type \"REACH\".",
+     "properties": {
+      "activities": {
+       "$ref": "Activities",
+       "description": "Activity group."
+      },
+      "customRichMediaEvents": {
+       "$ref": "CustomRichMediaEvents",
+       "description": "Custom Rich Media Events group."
+      },
+      "dateRange": {
+       "$ref": "DateRange",
+       "description": "The date range this report should be run for."
+      },
+      "dimensionFilters": {
+       "type": "array",
+       "description": "The list of filters on which dimensions are filtered.\nFilters for different dimensions are ANDed, filters for the same dimension are grouped together and ORed.",
+       "items": {
+        "$ref": "DimensionValue"
+       }
+      },
+      "dimensions": {
+       "type": "array",
+       "description": "The list of dimensions the report should include.",
+       "items": {
+        "$ref": "SortedDimension"
+       }
+      },
+      "metricNames": {
+       "type": "array",
+       "description": "The list of names of metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      },
+      "reachByFrequencyMetricNames": {
+       "type": "array",
+       "description": "The list of names of  Reach By Frequency metrics the report should include.",
+       "items": {
+        "type": "string"
+       }
+      }
+     }
+    },
+    "schedule": {
+     "type": "object",
+     "description": "The report's schedule. Can only be set if the report's 'dateRange' is a relative date range and the relative date range is not \"TODAY\".",
+     "properties": {
+      "active": {
+       "type": "boolean",
+       "description": "Whether the schedule is active or not. Must be set to either true or false.",
+       "annotations": {
+        "required": [
+         "dfareporting.reports.insert",
+         "dfareporting.reports.update"
+        ]
+       }
+      },
+      "every": {
+       "type": "integer",
+       "description": "Defines every how many days, weeks or months the report should be run. Needs to be set when \"repeats\" is either \"DAILY\", \"WEEKLY\" or \"MONTHLY\".",
+       "format": "int32"
+      },
+      "expirationDate": {
+       "type": "string",
+       "description": "The expiration date when the scheduled report stops running.",
+       "format": "date",
+       "annotations": {
+        "required": [
+         "dfareporting.reports.insert",
+         "dfareporting.reports.update"
+        ]
+       }
+      },
+      "repeats": {
+       "type": "string",
+       "description": "The interval for which the report is repeated, one of:  \n- \"DAILY\", also requires field \"every\" to be set. \n- \"WEEKLY\", also requires fields \"every\" and \"repeatsOnWeekDays\" to be set. \n- \"TWICE_A_MONTH\" \n- \"MONTHLY\", also requires fields \"every\" and \"runsOnDayOfMonth\" to be set. \n- \"QUARTERLY\" \n- \"YEARLY\"",
+       "annotations": {
+        "required": [
+         "dfareporting.reports.insert",
+         "dfareporting.reports.update"
+        ]
+       }
+      },
+      "repeatsOnWeekDays": {
+       "type": "array",
+       "description": "List of week days \"WEEKLY\" on which scheduled reports should run.",
+       "items": {
+        "type": "string"
+       }
+      },
+      "runsOnDayOfMonth": {
+       "type": "string",
+       "description": "Enum to define for \"MONTHLY\" scheduled reports whether reports should be repeated on the same day of the month as \"startDate\" or the same day of the week of the month. Possible values are:  \n- DAY_OF_MONTH \n- WEEK_OF_MONTH  \nExample: If 'startDate' is Monday, April 2nd 2012 (2012-04-02), \"DAY_OF_MONTH\" would run subsequent reports on the 2nd of every Month, and \"WEEK_OF_MONTH\" would run subsequent reports on the first Monday of the month."
+      },
+      "startDate": {
+       "type": "string",
+       "description": "Start date of date range for which scheduled reports should be run.",
+       "format": "date",
+       "annotations": {
+        "required": [
+         "dfareporting.reports.insert",
+         "dfareporting.reports.update"
+        ]
+       }
+      }
+     }
+    },
+    "subAccountId": {
+     "type": "string",
+     "description": "The subbaccount ID to which this report belongs if applicable.",
+     "format": "int64"
+    },
+    "type": {
+     "type": "string",
+     "description": "The type of the report, one of:  \n- STANDARD \n- REACH \n- ACTIVE_GRP \n- PATH_TO_CONVERSION \n- FLOODLIGHT \n- CROSS_DIMENSION_REACH",
+     "annotations": {
+      "required": [
+       "dfareporting.reports.insert",
+       "dfareporting.reports.update"
+      ]
+     }
+    }
+   }
+  },
+  "ReportList": {
+   "id": "ReportList",
+   "type": "object",
+   "description": "Represents the list of reports.",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The reports returned in this response.",
+     "items": {
+      "$ref": "Report"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of list this is, in this case dfareporting#reportList.",
+     "default": "dfareporting#reportList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "Continuation token used to page through reports. To retrieve the next page of results, set the next request's \"pageToken\" to the value of this field. The page token is only valid for a limited amount of time and should not be persisted."
+    }
+   }
+  },
+  "SortedDimension": {
+   "id": "SortedDimension",
+   "type": "object",
+   "description": "Represents a sorted dimension.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#sortedDimension.",
+     "default": "dfareporting#sortedDimension"
+    },
+    "name": {
+     "type": "string",
+     "description": "The name of the dimension."
+    },
+    "sortOrder": {
+     "type": "string",
+     "description": "An optional sort order for the dimension column, one of:  \n- \"ASCENDING\" \n- \"DESCENDING\""
+    }
+   }
+  },
+  "UserProfile": {
+   "id": "UserProfile",
+   "type": "object",
+   "description": "Represents a UserProfile resource.",
+   "properties": {
+    "accountId": {
+     "type": "string",
+     "description": "The account ID to which this profile belongs.",
+     "format": "int64"
+    },
+    "accountName": {
+     "type": "string",
+     "description": "The account name this profile belongs to."
+    },
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of resource this is, in this case dfareporting#userProfile.",
+     "default": "dfareporting#userProfile"
+    },
+    "profileId": {
+     "type": "string",
+     "description": "The unique ID of the user profile.",
+     "format": "int64"
+    },
+    "subAccountId": {
+     "type": "string",
+     "description": "The sub account ID this profile belongs to if applicable.",
+     "format": "int64"
+    },
+    "subAccountName": {
+     "type": "string",
+     "description": "The sub account name this profile belongs to if applicable."
+    },
+    "userName": {
+     "type": "string",
+     "description": "The user name."
+    }
+   }
+  },
+  "UserProfileList": {
+   "id": "UserProfileList",
+   "type": "object",
+   "description": "Represents the list of user profiles.",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "The eTag of this response for caching purposes."
+    },
+    "items": {
+     "type": "array",
+     "description": "The user profiles returned in this response.",
+     "items": {
+      "$ref": "UserProfile"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The kind of list this is, in this case dfareporting#userProfileList.",
+     "default": "dfareporting#userProfileList"
+    }
+   }
+  }
+ },
+ "resources": {
+  "dimensionValues": {
+   "methods": {
+    "query": {
+     "id": "dfareporting.dimensionValues.query",
+     "path": "userprofiles/{profileId}/dimensionvalues/query",
+     "httpMethod": "POST",
+     "description": "Retrieves list of report dimension values for a list of filters.",
+     "parameters": {
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "100",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The value of the nextToken from the previous result page.",
+       "location": "query"
+      },
+      "profileId": {
+       "type": "string",
+       "description": "The DFA user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "profileId"
+     ],
+     "request": {
+      "$ref": "DimensionValueRequest"
+     },
+     "response": {
+      "$ref": "DimensionValueList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    }
+   }
+  },
+  "files": {
+   "methods": {
+    "get": {
+     "id": "dfareporting.files.get",
+     "path": "reports/{reportId}/files/{fileId}",
+     "httpMethod": "GET",
+     "description": "Retrieves a report file by its report ID and file ID.",
+     "parameters": {
+      "fileId": {
+       "type": "string",
+       "description": "The ID of the report file.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "reportId": {
+       "type": "string",
+       "description": "The ID of the report.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "reportId",
+      "fileId"
+     ],
+     "response": {
+      "$ref": "File"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ],
+     "supportsMediaDownload": true
+    },
+    "list": {
+     "id": "dfareporting.files.list",
+     "path": "userprofiles/{profileId}/files",
+     "httpMethod": "GET",
+     "description": "Lists files for a user profile.",
+     "parameters": {
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The value of the nextToken from the previous result page.",
+       "location": "query"
+      },
+      "profileId": {
+       "type": "string",
+       "description": "The DFA profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "scope": {
+       "type": "string",
+       "description": "The scope that defines which results are returned, default is 'MINE'.",
+       "default": "MINE",
+       "enum": [
+        "ALL",
+        "MINE",
+        "SHARED_WITH_ME"
+       ],
+       "enumDescriptions": [
+        "All files in account.",
+        "My files.",
+        "Files shared with me."
+       ],
+       "location": "query"
+      },
+      "sortField": {
+       "type": "string",
+       "description": "The field by which to sort the list.",
+       "default": "LAST_MODIFIED_TIME",
+       "enum": [
+        "ID",
+        "LAST_MODIFIED_TIME"
+       ],
+       "enumDescriptions": [
+        "Sort by file ID.",
+        "Sort by 'lastmodifiedAt' field."
+       ],
+       "location": "query"
+      },
+      "sortOrder": {
+       "type": "string",
+       "description": "Order of sorted results, default is 'DESCENDING'.",
+       "default": "DESCENDING",
+       "enum": [
+        "ASCENDING",
+        "DESCENDING"
+       ],
+       "enumDescriptions": [
+        "Ascending order.",
+        "Descending order."
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "profileId"
+     ],
+     "response": {
+      "$ref": "FileList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    }
+   }
+  },
+  "reports": {
+   "methods": {
+    "delete": {
+     "id": "dfareporting.reports.delete",
+     "path": "userprofiles/{profileId}/reports/{reportId}",
+     "httpMethod": "DELETE",
+     "description": "Deletes a report by its ID.",
+     "parameters": {
+      "profileId": {
+       "type": "string",
+       "description": "The DFA user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "reportId": {
+       "type": "string",
+       "description": "The ID of the report.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "profileId",
+      "reportId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    },
+    "get": {
+     "id": "dfareporting.reports.get",
+     "path": "userprofiles/{profileId}/reports/{reportId}",
+     "httpMethod": "GET",
+     "description": "Retrieves a report by its ID.",
+     "parameters": {
+      "profileId": {
+       "type": "string",
+       "description": "The DFA user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "reportId": {
+       "type": "string",
+       "description": "The ID of the report.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "profileId",
+      "reportId"
+     ],
+     "response": {
+      "$ref": "Report"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    },
+    "insert": {
+     "id": "dfareporting.reports.insert",
+     "path": "userprofiles/{profileId}/reports",
+     "httpMethod": "POST",
+     "description": "Creates a report.",
+     "parameters": {
+      "profileId": {
+       "type": "string",
+       "description": "The DFA user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "profileId"
+     ],
+     "request": {
+      "$ref": "Report"
+     },
+     "response": {
+      "$ref": "Report"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    },
+    "list": {
+     "id": "dfareporting.reports.list",
+     "path": "userprofiles/{profileId}/reports",
+     "httpMethod": "GET",
+     "description": "Retrieves list of reports.",
+     "parameters": {
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of results to return.",
+       "format": "int32",
+       "minimum": "0",
+       "maximum": "10",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "The value of the nextToken from the previous result page.",
+       "location": "query"
+      },
+      "profileId": {
+       "type": "string",
+       "description": "The DFA user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "scope": {
+       "type": "string",
+       "description": "The scope that defines which results are returned, default is 'MINE'.",
+       "default": "MINE",
+       "enum": [
+        "ALL",
+        "MINE"
+       ],
+       "enumDescriptions": [
+        "All reports in account.",
+        "My reports."
+       ],
+       "location": "query"
+      },
+      "sortField": {
+       "type": "string",
+       "description": "The field by which to sort the list.",
+       "default": "LAST_MODIFIED_TIME",
+       "enum": [
+        "ID",
+        "LAST_MODIFIED_TIME",
+        "NAME"
+       ],
+       "enumDescriptions": [
+        "Sort by report ID.",
+        "Sort by 'lastModifiedTime' field.",
+        "Sort by name of reports."
+       ],
+       "location": "query"
+      },
+      "sortOrder": {
+       "type": "string",
+       "description": "Order of sorted results, default is 'DESCENDING'.",
+       "default": "DESCENDING",
+       "enum": [
+        "ASCENDING",
+        "DESCENDING"
+       ],
+       "enumDescriptions": [
+        "Ascending order.",
+        "Descending order."
+       ],
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "profileId"
+     ],
+     "response": {
+      "$ref": "ReportList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    },
+    "patch": {
+     "id": "dfareporting.reports.patch",
+     "path": "userprofiles/{profileId}/reports/{reportId}",
+     "httpMethod": "PATCH",
+     "description": "Updates a report. This method supports patch semantics.",
+     "parameters": {
+      "profileId": {
+       "type": "string",
+       "description": "The DFA user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "reportId": {
+       "type": "string",
+       "description": "The ID of the report.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "profileId",
+      "reportId"
+     ],
+     "request": {
+      "$ref": "Report"
+     },
+     "response": {
+      "$ref": "Report"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    },
+    "run": {
+     "id": "dfareporting.reports.run",
+     "path": "userprofiles/{profileId}/reports/{reportId}/run",
+     "httpMethod": "POST",
+     "description": "Runs a report.",
+     "parameters": {
+      "profileId": {
+       "type": "string",
+       "description": "The DFA profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "reportId": {
+       "type": "string",
+       "description": "The ID of the report.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "synchronous": {
+       "type": "boolean",
+       "description": "If set and true, tries to run the report synchronously.",
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "profileId",
+      "reportId"
+     ],
+     "response": {
+      "$ref": "File"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    },
+    "update": {
+     "id": "dfareporting.reports.update",
+     "path": "userprofiles/{profileId}/reports/{reportId}",
+     "httpMethod": "PUT",
+     "description": "Updates a report.",
+     "parameters": {
+      "profileId": {
+       "type": "string",
+       "description": "The DFA user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      },
+      "reportId": {
+       "type": "string",
+       "description": "The ID of the report.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "profileId",
+      "reportId"
+     ],
+     "request": {
+      "$ref": "Report"
+     },
+     "response": {
+      "$ref": "Report"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    }
+   },
+   "resources": {
+    "files": {
+     "methods": {
+      "get": {
+       "id": "dfareporting.reports.files.get",
+       "path": "userprofiles/{profileId}/reports/{reportId}/files/{fileId}",
+       "httpMethod": "GET",
+       "description": "Retrieves a report file.",
+       "parameters": {
+        "fileId": {
+         "type": "string",
+         "description": "The ID of the report file.",
+         "required": true,
+         "format": "int64",
+         "location": "path"
+        },
+        "profileId": {
+         "type": "string",
+         "description": "The DFA profile ID.",
+         "required": true,
+         "format": "int64",
+         "location": "path"
+        },
+        "reportId": {
+         "type": "string",
+         "description": "The ID of the report.",
+         "required": true,
+         "format": "int64",
+         "location": "path"
+        }
+       },
+       "parameterOrder": [
+        "profileId",
+        "reportId",
+        "fileId"
+       ],
+       "response": {
+        "$ref": "File"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/dfareporting"
+       ],
+       "supportsMediaDownload": true
+      },
+      "list": {
+       "id": "dfareporting.reports.files.list",
+       "path": "userprofiles/{profileId}/reports/{reportId}/files",
+       "httpMethod": "GET",
+       "description": "Lists files for a report.",
+       "parameters": {
+        "maxResults": {
+         "type": "integer",
+         "description": "Maximum number of results to return.",
+         "format": "int32",
+         "minimum": "0",
+         "maximum": "10",
+         "location": "query"
+        },
+        "pageToken": {
+         "type": "string",
+         "description": "The value of the nextToken from the previous result page.",
+         "location": "query"
+        },
+        "profileId": {
+         "type": "string",
+         "description": "The DFA profile ID.",
+         "required": true,
+         "format": "int64",
+         "location": "path"
+        },
+        "reportId": {
+         "type": "string",
+         "description": "The ID of the parent report.",
+         "required": true,
+         "format": "int64",
+         "location": "path"
+        },
+        "sortField": {
+         "type": "string",
+         "description": "The field by which to sort the list.",
+         "default": "LAST_MODIFIED_TIME",
+         "enum": [
+          "ID",
+          "LAST_MODIFIED_TIME"
+         ],
+         "enumDescriptions": [
+          "Sort by file ID.",
+          "Sort by 'lastmodifiedAt' field."
+         ],
+         "location": "query"
+        },
+        "sortOrder": {
+         "type": "string",
+         "description": "Order of sorted results, default is 'DESCENDING'.",
+         "default": "DESCENDING",
+         "enum": [
+          "ASCENDING",
+          "DESCENDING"
+         ],
+         "enumDescriptions": [
+          "Ascending order.",
+          "Descending order."
+         ],
+         "location": "query"
+        }
+       },
+       "parameterOrder": [
+        "profileId",
+        "reportId"
+       ],
+       "response": {
+        "$ref": "FileList"
+       },
+       "scopes": [
+        "https://www.googleapis.com/auth/dfareporting"
+       ]
+      }
+     }
+    }
+   }
+  },
+  "userProfiles": {
+   "methods": {
+    "get": {
+     "id": "dfareporting.userProfiles.get",
+     "path": "userprofiles/{profileId}",
+     "httpMethod": "GET",
+     "description": "Gets one user profile by ID.",
+     "parameters": {
+      "profileId": {
+       "type": "string",
+       "description": "The user profile ID.",
+       "required": true,
+       "format": "int64",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "profileId"
+     ],
+     "response": {
+      "$ref": "UserProfile"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    },
+    "list": {
+     "id": "dfareporting.userProfiles.list",
+     "path": "userprofiles",
+     "httpMethod": "GET",
+     "description": "Retrieves list of user profiles for a user.",
+     "response": {
+      "$ref": "UserProfileList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/dfareporting"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/dfareporting/v1.2/dfareporting-gen.go b/dfareporting/v1.2/dfareporting-gen.go
new file mode 100644
index 0000000..1d948cf
--- /dev/null
+++ b/dfareporting/v1.2/dfareporting-gen.go
@@ -0,0 +1,2170 @@
+// Package dfareporting provides access to the DFA Reporting API.
+//
+// See https://developers.google.com/doubleclick-advertisers/reporting/
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/dfareporting/v1.2"
+//   ...
+//   dfareportingService, err := dfareporting.New(oauthHttpClient)
+package dfareporting
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "dfareporting:v1.2"
+const apiName = "dfareporting"
+const apiVersion = "v1.2"
+const basePath = "https://www.googleapis.com/dfareporting/v1.2/"
+
+// OAuth2 scopes used by this API.
+const (
+	// View and manage DoubleClick for Advertisers reports
+	DfareportingScope = "https://www.googleapis.com/auth/dfareporting"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.DimensionValues = NewDimensionValuesService(s)
+	s.Files = NewFilesService(s)
+	s.Reports = NewReportsService(s)
+	s.UserProfiles = NewUserProfilesService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	DimensionValues *DimensionValuesService
+
+	Files *FilesService
+
+	Reports *ReportsService
+
+	UserProfiles *UserProfilesService
+}
+
+func NewDimensionValuesService(s *Service) *DimensionValuesService {
+	rs := &DimensionValuesService{s: s}
+	return rs
+}
+
+type DimensionValuesService struct {
+	s *Service
+}
+
+func NewFilesService(s *Service) *FilesService {
+	rs := &FilesService{s: s}
+	return rs
+}
+
+type FilesService struct {
+	s *Service
+}
+
+func NewReportsService(s *Service) *ReportsService {
+	rs := &ReportsService{s: s}
+	rs.Files = NewReportsFilesService(s)
+	return rs
+}
+
+type ReportsService struct {
+	s *Service
+
+	Files *ReportsFilesService
+}
+
+func NewReportsFilesService(s *Service) *ReportsFilesService {
+	rs := &ReportsFilesService{s: s}
+	return rs
+}
+
+type ReportsFilesService struct {
+	s *Service
+}
+
+func NewUserProfilesService(s *Service) *UserProfilesService {
+	rs := &UserProfilesService{s: s}
+	return rs
+}
+
+type UserProfilesService struct {
+	s *Service
+}
+
+type Activities struct {
+	// Filters: List of activity filters. The dimension values need to be
+	// all either of type "dfa:activity" or "dfa:activityGroup".
+	Filters []*DimensionValue `json:"filters,omitempty"`
+
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#activities.
+	Kind string `json:"kind,omitempty"`
+
+	// MetricNames: List of names of floodlight activity metrics.
+	MetricNames []string `json:"metricNames,omitempty"`
+}
+
+type CustomRichMediaEvents struct {
+	// FilteredEventIds: List of custom rich media event IDs. Dimension
+	// values must be all of type dfa:richMediaEventTypeIdAndName.
+	FilteredEventIds []*DimensionValue `json:"filteredEventIds,omitempty"`
+
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#customRichMediaEvents.
+	Kind string `json:"kind,omitempty"`
+}
+
+type DateRange struct {
+	// EndDate: The end date of the date range, inclusive. A string of the
+	// format: "yyyy-MM-dd".
+	EndDate string `json:"endDate,omitempty"`
+
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#dateRange.
+	Kind string `json:"kind,omitempty"`
+
+	// RelativeDateRange: The date range relative to the date of when the
+	// report is run, one of:
+	// - "TODAY"
+	// - "YESTERDAY"
+	// - "WEEK_TO_DATE"
+	//
+	// - "MONTH_TO_DATE"
+	// - "QUARTER_TO_DATE"
+	// - "YEAR_TO_DATE"
+	// -
+	// "PREVIOUS_WEEK"
+	// - "PREVIOUS_MONTH"
+	// - "PREVIOUS_QUARTER"
+	// -
+	// "PREVIOUS_YEAR"
+	// - "LAST_7_DAYS"
+	// - "LAST_30_DAYS"
+	// - "LAST_90_DAYS"
+	//
+	// - "LAST_365_DAYS"
+	// - "LAST_24_MONTHS"
+	RelativeDateRange string `json:"relativeDateRange,omitempty"`
+
+	// StartDate: The start date of the date range, inclusive. A string of
+	// the format: "yyyy-MM-dd".
+	StartDate string `json:"startDate,omitempty"`
+}
+
+type DimensionFilter struct {
+	// DimensionName: The name of the dimension to filter.
+	DimensionName string `json:"dimensionName,omitempty"`
+
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#dimensionFilter.
+	Kind string `json:"kind,omitempty"`
+
+	// Value: The value of the dimension to filter.
+	Value string `json:"value,omitempty"`
+}
+
+type DimensionValue struct {
+	// DimensionName: The name of the dimension.
+	DimensionName string `json:"dimensionName,omitempty"`
+
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Id: The ID associated with the value if available.
+	Id string `json:"id,omitempty"`
+
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#dimensionValue.
+	Kind string `json:"kind,omitempty"`
+
+	// MatchType: Determines how the 'value' field is matched when
+	// filtering. One of:
+	// - EXACT (default if not specified)
+	// - CONTAINS
+	//
+	// - BEGINS_WITH
+	// - WILDCARD_EXPRESSION (allowing '*' as a placeholder
+	// for variable length character sequences, it can be escaped with a
+	// backslash.)  Note, only paid search dimensions ('dfa:paidSearch*')
+	// allow a matchType other than EXACT.
+	MatchType string `json:"matchType,omitempty"`
+
+	// Value: The value of the dimension.
+	Value string `json:"value,omitempty"`
+}
+
+type DimensionValueList struct {
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The dimension values returned in this response.
+	Items []*DimensionValue `json:"items,omitempty"`
+
+	// Kind: The kind of list this is, in this case
+	// dfareporting#dimensionValueList.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through dimension
+	// values. To retrieve the next page of results, set the next request's
+	// "pageToken" to the value of this field. The page token is only valid
+	// for a limited amount of time and should not be persisted.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type DimensionValueRequest struct {
+	// DimensionName: The name of the dimension for which values should be
+	// requested.
+	DimensionName string `json:"dimensionName,omitempty"`
+
+	// EndDate: The end date of the date range for which to retrieve
+	// dimension values. A string of the format: "yyyy-MM-dd".
+	EndDate string `json:"endDate,omitempty"`
+
+	// Filters: The list of filters by which to filter values. The filters
+	// are ANDed.
+	Filters []*DimensionFilter `json:"filters,omitempty"`
+
+	// Kind: The kind of request this is, in this case
+	// dfareporting#dimensionValueRequest.
+	Kind string `json:"kind,omitempty"`
+
+	// StartDate: The start date of the date range for which to retrieve
+	// dimension values. A string of the format: "yyyy-MM-dd".
+	StartDate string `json:"startDate,omitempty"`
+}
+
+type File struct {
+	// DateRange: The date range for which the file has report data. The
+	// date range will always be the absolute date range for which the
+	// report is run.
+	DateRange *DateRange `json:"dateRange,omitempty"`
+
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// FileName: The file name of the file.
+	FileName string `json:"fileName,omitempty"`
+
+	// Format: The output format of the report. Only available once the file
+	// is available.
+	Format string `json:"format,omitempty"`
+
+	// Id: The unique ID of this report file.
+	Id int64 `json:"id,omitempty,string"`
+
+	// Kind: The kind of resource this is, in this case dfareporting#file.
+	Kind string `json:"kind,omitempty"`
+
+	// LastModifiedTime: The timestamp in milliseconds since epoch when this
+	// file was last modified.
+	LastModifiedTime int64 `json:"lastModifiedTime,omitempty,string"`
+
+	// ReportId: The ID of the report this file was generated from.
+	ReportId int64 `json:"reportId,omitempty,string"`
+
+	// Status: The status of the report file, one of:
+	// - "PROCESSING"
+	// -
+	// "REPORT_AVAILABLE"
+	// - "FAILED"
+	// - "CANCELLED"
+	Status string `json:"status,omitempty"`
+
+	// Urls: The urls where the completed report file can be downloaded.
+	Urls *FileUrls `json:"urls,omitempty"`
+}
+
+type FileUrls struct {
+	// ApiUrl: The url for downloading the report data through the API.
+	ApiUrl string `json:"apiUrl,omitempty"`
+
+	// BrowserUrl: The url for downloading the report data through a
+	// browser.
+	BrowserUrl string `json:"browserUrl,omitempty"`
+}
+
+type FileList struct {
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The files returned in this response.
+	Items []*File `json:"items,omitempty"`
+
+	// Kind: The kind of list this is, in this case dfareporting#fileList.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through files. To
+	// retrieve the next page of results, set the next request's "pageToken"
+	// to the value of this field. The page token is only valid for a
+	// limited amount of time and should not be persisted.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type Recipient struct {
+	// DeliveryType: The delivery type for the recipient, one of:
+	// -
+	// "ATTACHMENT"
+	// - "LINK"
+	DeliveryType string `json:"deliveryType,omitempty"`
+
+	// Email: The email address of the recipient.
+	Email string `json:"email,omitempty"`
+
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#recipient.
+	Kind string `json:"kind,omitempty"`
+}
+
+type Report struct {
+	// AccountId: The account ID to which this report belongs.
+	AccountId int64 `json:"accountId,omitempty,string"`
+
+	// ActiveGrpCriteria: The report criteria for a report of type
+	// "ACTIVE_GRP".
+	ActiveGrpCriteria *ReportActiveGrpCriteria `json:"activeGrpCriteria,omitempty"`
+
+	// Criteria: The report criteria for a report of type "STANDARD".
+	Criteria *ReportCriteria `json:"criteria,omitempty"`
+
+	// CrossDimensionReachCriteria: The report criteria for a report of type
+	// "CROSS_DIMENSION_REACH".
+	CrossDimensionReachCriteria *ReportCrossDimensionReachCriteria `json:"crossDimensionReachCriteria,omitempty"`
+
+	// Delivery: The report's email delivery settings.
+	Delivery *ReportDelivery `json:"delivery,omitempty"`
+
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// FileName: The file name used when generating report files for this
+	// report.
+	FileName string `json:"fileName,omitempty"`
+
+	// FloodlightCriteria: The report criteria for a report of type
+	// "FLOODLIGHT".
+	FloodlightCriteria *ReportFloodlightCriteria `json:"floodlightCriteria,omitempty"`
+
+	// Format: The output format of the report, one of:
+	// - "CSV"
+	// - "EXCEL"
+	//  If not specified, default format is "CSV". Note that the actual
+	// format in the completed report file might differ if for instance the
+	// report's size exceeds the format's capabilities. "CSV" will then be
+	// the fallback format.
+	Format string `json:"format,omitempty"`
+
+	// Id: The unique ID identifying this report resource.
+	Id int64 `json:"id,omitempty,string"`
+
+	// Kind: The kind of resource this is, in this case dfareporting#report.
+	Kind string `json:"kind,omitempty"`
+
+	// LastModifiedTime: The timestamp (in milliseconds since epoch) of when
+	// this report was last modified.
+	LastModifiedTime uint64 `json:"lastModifiedTime,omitempty,string"`
+
+	// Name: The name of the report.
+	Name string `json:"name,omitempty"`
+
+	// OwnerProfileId: The user profile id of the owner of this report.
+	OwnerProfileId int64 `json:"ownerProfileId,omitempty,string"`
+
+	// PathToConversionCriteria: The report criteria for a report of type
+	// "PATH_TO_CONVERSION".
+	PathToConversionCriteria *ReportPathToConversionCriteria `json:"pathToConversionCriteria,omitempty"`
+
+	// ReachCriteria: The report criteria for a report of type "REACH".
+	ReachCriteria *ReportReachCriteria `json:"reachCriteria,omitempty"`
+
+	// Schedule: The report's schedule. Can only be set if the report's
+	// 'dateRange' is a relative date range and the relative date range is
+	// not "TODAY".
+	Schedule *ReportSchedule `json:"schedule,omitempty"`
+
+	// SubAccountId: The subbaccount ID to which this report belongs if
+	// applicable.
+	SubAccountId int64 `json:"subAccountId,omitempty,string"`
+
+	// Type: The type of the report, one of:
+	// - STANDARD
+	// - REACH
+	// -
+	// ACTIVE_GRP
+	// - PATH_TO_CONVERSION
+	// - FLOODLIGHT
+	// -
+	// CROSS_DIMENSION_REACH
+	Type string `json:"type,omitempty"`
+}
+
+type ReportActiveGrpCriteria struct {
+	// DateRange: The date range this report should be run for.
+	DateRange *DateRange `json:"dateRange,omitempty"`
+
+	// DimensionFilters: The list of filters on which dimensions are
+	// filtered.
+	// Filters for different dimensions are ANDed, filters for the
+	// same dimension are grouped together and ORed.
+	// A valid active GRP
+	// report needs to have exactly one DimensionValue for the United States
+	// in addition to any advertiser or campaign dimension values.
+	DimensionFilters []*DimensionValue `json:"dimensionFilters,omitempty"`
+
+	// Dimensions: The list of dimensions the report should include.
+	Dimensions []*SortedDimension `json:"dimensions,omitempty"`
+
+	// MetricNames: The list of names of metrics the report should include.
+	MetricNames []string `json:"metricNames,omitempty"`
+}
+
+type ReportCriteria struct {
+	// Activities: Activity group.
+	Activities *Activities `json:"activities,omitempty"`
+
+	// CustomRichMediaEvents: Custom Rich Media Events group.
+	CustomRichMediaEvents *CustomRichMediaEvents `json:"customRichMediaEvents,omitempty"`
+
+	// DateRange: The date range for which this report should be run.
+	DateRange *DateRange `json:"dateRange,omitempty"`
+
+	// DimensionFilters: The list of filters on which dimensions are
+	// filtered.
+	// Filters for different dimensions are ANDed, filters for the
+	// same dimension are grouped together and ORed.
+	DimensionFilters []*DimensionValue `json:"dimensionFilters,omitempty"`
+
+	// Dimensions: The list of standard dimensions the report should
+	// include.
+	Dimensions []*SortedDimension `json:"dimensions,omitempty"`
+
+	// MetricNames: The list of names of metrics the report should include.
+	MetricNames []string `json:"metricNames,omitempty"`
+}
+
+type ReportCrossDimensionReachCriteria struct {
+	// Breakdown: The list of dimensions the report should include.
+	Breakdown []*SortedDimension `json:"breakdown,omitempty"`
+
+	// DateRange: The date range this report should be run for.
+	DateRange *DateRange `json:"dateRange,omitempty"`
+
+	// Dimension: The dimension option, one of:
+	// - "ADVERTISER"
+	// -
+	// "CAMPAIGN"
+	// - "SITE_BY_ADVERTISER"
+	// - "SITE_BY_CAMPAIGN"
+	Dimension string `json:"dimension,omitempty"`
+
+	// DimensionFilters: The list of filters on which dimensions are
+	// filtered.
+	DimensionFilters []*DimensionValue `json:"dimensionFilters,omitempty"`
+
+	// MetricNames: The list of names of metrics the report should include.
+	MetricNames []string `json:"metricNames,omitempty"`
+
+	// OverlapMetricNames: The list of names of overlap metrics the report
+	// should include.
+	OverlapMetricNames []string `json:"overlapMetricNames,omitempty"`
+
+	// Pivoted: Whether the report is pivoted or not. Defaults to true.
+	Pivoted bool `json:"pivoted,omitempty"`
+}
+
+type ReportDelivery struct {
+	// EmailOwner: Whether the report should be emailed to the report owner.
+	EmailOwner bool `json:"emailOwner,omitempty"`
+
+	// EmailOwnerDeliveryType: The type of delivery for the owner to
+	// receive, if enabled. One of:
+	// - "ATTACHMENT"
+	// - "LINK"
+	EmailOwnerDeliveryType string `json:"emailOwnerDeliveryType,omitempty"`
+
+	// Message: The message to be sent with each email.
+	Message string `json:"message,omitempty"`
+
+	// Recipients: The list of recipients to which to email the report.
+	Recipients []*Recipient `json:"recipients,omitempty"`
+}
+
+type ReportFloodlightCriteria struct {
+	// DateRange: The date range this report should be run for.
+	DateRange *DateRange `json:"dateRange,omitempty"`
+
+	// DimensionFilters: The list of filters on which dimensions are
+	// filtered.
+	// Filters for different dimensions are ANDed, filters for the
+	// same dimension are grouped together and ORed.
+	DimensionFilters []*DimensionValue `json:"dimensionFilters,omitempty"`
+
+	// Dimensions: The list of dimensions the report should include.
+	Dimensions []*SortedDimension `json:"dimensions,omitempty"`
+
+	// FloodlightConfigId: The floodlight ID for which to show data in this
+	// report. All advertisers associated with that ID will automatically be
+	// added. The dimension of the value needs to be
+	// 'dfa:floodlightConfigId'.
+	FloodlightConfigId *DimensionValue `json:"floodlightConfigId,omitempty"`
+
+	// MetricNames: The list of names of metrics the report should include.
+	MetricNames []string `json:"metricNames,omitempty"`
+
+	// ReportProperties: The properties of the report.
+	ReportProperties *ReportFloodlightCriteriaReportProperties `json:"reportProperties,omitempty"`
+}
+
+type ReportFloodlightCriteriaReportProperties struct {
+	// IncludeAttributedIPConversions: Include conversions that have no
+	// cookie, but do have an exposure path.
+	IncludeAttributedIPConversions bool `json:"includeAttributedIPConversions,omitempty"`
+
+	// IncludeUnattributedCookieConversions: Include conversions of users
+	// with a DoubleClick cookie but without an exposure. That means the
+	// user did not click or see an ad from the advertiser within the
+	// Floodlight group, or that the interaction happened outside the
+	// lookback window.
+	IncludeUnattributedCookieConversions bool `json:"includeUnattributedCookieConversions,omitempty"`
+
+	// IncludeUnattributedIPConversions: Include conversions that have no
+	// associated cookies and no exposures. It’s therefore impossible to
+	// know how the user was exposed to your ads during the lookback window
+	// prior to a conversion.
+	IncludeUnattributedIPConversions bool `json:"includeUnattributedIPConversions,omitempty"`
+}
+
+type ReportPathToConversionCriteria struct {
+	// ActivityFilters: The list of 'dfa:activity' values to filter on.
+	ActivityFilters []*DimensionValue `json:"activityFilters,omitempty"`
+
+	// ConversionDimensions: The list of conversion dimensions the report
+	// should include.
+	ConversionDimensions []*SortedDimension `json:"conversionDimensions,omitempty"`
+
+	// CustomFloodlightVariables: The list of custom floodlight variables
+	// the report should include.
+	CustomFloodlightVariables []*SortedDimension `json:"customFloodlightVariables,omitempty"`
+
+	// DateRange: The date range this report should be run for.
+	DateRange *DateRange `json:"dateRange,omitempty"`
+
+	// FloodlightConfigId: The floodlight ID for which to show data in this
+	// report. All advertisers associated with that ID will automatically be
+	// added. The dimension of the value needs to be
+	// 'dfa:floodlightConfigId'.
+	FloodlightConfigId *DimensionValue `json:"floodlightConfigId,omitempty"`
+
+	// MetricNames: The list of names of metrics the report should include.
+	MetricNames []string `json:"metricNames,omitempty"`
+
+	// PerInteractionDimensions: The list of per interaction dimensions the
+	// report should include.
+	PerInteractionDimensions []*SortedDimension `json:"perInteractionDimensions,omitempty"`
+
+	// ReportProperties: The properties of the report.
+	ReportProperties *ReportPathToConversionCriteriaReportProperties `json:"reportProperties,omitempty"`
+}
+
+type ReportPathToConversionCriteriaReportProperties struct {
+	// ClicksLookbackWindow: DFA checks to see if a click interaction
+	// occurred within the specified period of time before a conversion. By
+	// default the value is pulled from Floodlight or you can manually enter
+	// a custom value. Valid values: 1-90.
+	ClicksLookbackWindow int64 `json:"clicksLookbackWindow,omitempty"`
+
+	// ImpressionsLookbackWindow: DFA checks to see if an impression
+	// interaction occurred within the specified period of time before a
+	// conversion. By default the value is pulled from Floodlight or you can
+	// manually enter a custom value. Valid values: 1-90.
+	ImpressionsLookbackWindow int64 `json:"impressionsLookbackWindow,omitempty"`
+
+	// IncludeAttributedIPConversions: Include conversions that have no
+	// cookie, but do have an exposure path.
+	IncludeAttributedIPConversions bool `json:"includeAttributedIPConversions,omitempty"`
+
+	// IncludeUnattributedCookieConversions: Include conversions of users
+	// with a DoubleClick cookie but without an exposure. That means the
+	// user did not click or see an ad from the advertiser within the
+	// Floodlight group, or that the interaction happened outside the
+	// lookback window.
+	IncludeUnattributedCookieConversions bool `json:"includeUnattributedCookieConversions,omitempty"`
+
+	// IncludeUnattributedIPConversions: Include conversions that have no
+	// associated cookies and no exposures. It’s therefore impossible to
+	// know how the user was exposed to your ads during the lookback window
+	// prior to a conversion.
+	IncludeUnattributedIPConversions bool `json:"includeUnattributedIPConversions,omitempty"`
+
+	// MaximumClickInteractions: The maximum number of click interactions to
+	// include in the report. Advertisers currently paying for E2C reports
+	// get up to 200 (100 clicks, 100 impressions). If another advertiser in
+	// your network is paying for E2C, you can have up to 5 total exposures
+	// per report.
+	MaximumClickInteractions int64 `json:"maximumClickInteractions,omitempty"`
+
+	// MaximumImpressionInteractions: The maximum number of click
+	// interactions to include in the report. Advertisers currently paying
+	// for E2C reports get up to 200 (100 clicks, 100 impressions). If
+	// another advertiser in your network is paying for E2C, you can have up
+	// to 5 total exposures per report.
+	MaximumImpressionInteractions int64 `json:"maximumImpressionInteractions,omitempty"`
+
+	// MaximumInteractionGap: The maximum amount of time that can take place
+	// between interactions (clicks or impressions) by the same user. Valid
+	// values: 1-90.
+	MaximumInteractionGap int64 `json:"maximumInteractionGap,omitempty"`
+
+	// PivotOnInteractionPath: Enable pivoting on interaction path.
+	PivotOnInteractionPath bool `json:"pivotOnInteractionPath,omitempty"`
+}
+
+type ReportReachCriteria struct {
+	// Activities: Activity group.
+	Activities *Activities `json:"activities,omitempty"`
+
+	// CustomRichMediaEvents: Custom Rich Media Events group.
+	CustomRichMediaEvents *CustomRichMediaEvents `json:"customRichMediaEvents,omitempty"`
+
+	// DateRange: The date range this report should be run for.
+	DateRange *DateRange `json:"dateRange,omitempty"`
+
+	// DimensionFilters: The list of filters on which dimensions are
+	// filtered.
+	// Filters for different dimensions are ANDed, filters for the
+	// same dimension are grouped together and ORed.
+	DimensionFilters []*DimensionValue `json:"dimensionFilters,omitempty"`
+
+	// Dimensions: The list of dimensions the report should include.
+	Dimensions []*SortedDimension `json:"dimensions,omitempty"`
+
+	// MetricNames: The list of names of metrics the report should include.
+	MetricNames []string `json:"metricNames,omitempty"`
+
+	// ReachByFrequencyMetricNames: The list of names of  Reach By Frequency
+	// metrics the report should include.
+	ReachByFrequencyMetricNames []string `json:"reachByFrequencyMetricNames,omitempty"`
+}
+
+type ReportSchedule struct {
+	// Active: Whether the schedule is active or not. Must be set to either
+	// true or false.
+	Active bool `json:"active,omitempty"`
+
+	// Every: Defines every how many days, weeks or months the report should
+	// be run. Needs to be set when "repeats" is either "DAILY", "WEEKLY" or
+	// "MONTHLY".
+	Every int64 `json:"every,omitempty"`
+
+	// ExpirationDate: The expiration date when the scheduled report stops
+	// running.
+	ExpirationDate string `json:"expirationDate,omitempty"`
+
+	// Repeats: The interval for which the report is repeated, one of:
+	// -
+	// "DAILY", also requires field "every" to be set.
+	// - "WEEKLY", also
+	// requires fields "every" and "repeatsOnWeekDays" to be set.
+	// -
+	// "TWICE_A_MONTH"
+	// - "MONTHLY", also requires fields "every" and
+	// "runsOnDayOfMonth" to be set.
+	// - "QUARTERLY"
+	// - "YEARLY"
+	Repeats string `json:"repeats,omitempty"`
+
+	// RepeatsOnWeekDays: List of week days "WEEKLY" on which scheduled
+	// reports should run.
+	RepeatsOnWeekDays []string `json:"repeatsOnWeekDays,omitempty"`
+
+	// RunsOnDayOfMonth: Enum to define for "MONTHLY" scheduled reports
+	// whether reports should be repeated on the same day of the month as
+	// "startDate" or the same day of the week of the month. Possible values
+	// are:
+	// - DAY_OF_MONTH
+	// - WEEK_OF_MONTH
+	// Example: If 'startDate' is
+	// Monday, April 2nd 2012 (2012-04-02), "DAY_OF_MONTH" would run
+	// subsequent reports on the 2nd of every Month, and "WEEK_OF_MONTH"
+	// would run subsequent reports on the first Monday of the month.
+	RunsOnDayOfMonth string `json:"runsOnDayOfMonth,omitempty"`
+
+	// StartDate: Start date of date range for which scheduled reports
+	// should be run.
+	StartDate string `json:"startDate,omitempty"`
+}
+
+type ReportList struct {
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The reports returned in this response.
+	Items []*Report `json:"items,omitempty"`
+
+	// Kind: The kind of list this is, in this case dfareporting#reportList.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: Continuation token used to page through reports. To
+	// retrieve the next page of results, set the next request's "pageToken"
+	// to the value of this field. The page token is only valid for a
+	// limited amount of time and should not be persisted.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type SortedDimension struct {
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#sortedDimension.
+	Kind string `json:"kind,omitempty"`
+
+	// Name: The name of the dimension.
+	Name string `json:"name,omitempty"`
+
+	// SortOrder: An optional sort order for the dimension column, one of:
+	//
+	// - "ASCENDING"
+	// - "DESCENDING"
+	SortOrder string `json:"sortOrder,omitempty"`
+}
+
+type UserProfile struct {
+	// AccountId: The account ID to which this profile belongs.
+	AccountId int64 `json:"accountId,omitempty,string"`
+
+	// AccountName: The account name this profile belongs to.
+	AccountName string `json:"accountName,omitempty"`
+
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Kind: The kind of resource this is, in this case
+	// dfareporting#userProfile.
+	Kind string `json:"kind,omitempty"`
+
+	// ProfileId: The unique ID of the user profile.
+	ProfileId int64 `json:"profileId,omitempty,string"`
+
+	// SubAccountId: The sub account ID this profile belongs to if
+	// applicable.
+	SubAccountId int64 `json:"subAccountId,omitempty,string"`
+
+	// SubAccountName: The sub account name this profile belongs to if
+	// applicable.
+	SubAccountName string `json:"subAccountName,omitempty"`
+
+	// UserName: The user name.
+	UserName string `json:"userName,omitempty"`
+}
+
+type UserProfileList struct {
+	// Etag: The eTag of this response for caching purposes.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: The user profiles returned in this response.
+	Items []*UserProfile `json:"items,omitempty"`
+
+	// Kind: The kind of list this is, in this case
+	// dfareporting#userProfileList.
+	Kind string `json:"kind,omitempty"`
+}
+
+// method id "dfareporting.dimensionValues.query":
+
+type DimensionValuesQueryCall struct {
+	s                     *Service
+	profileId             int64
+	dimensionvaluerequest *DimensionValueRequest
+	opt_                  map[string]interface{}
+}
+
+// Query: Retrieves list of report dimension values for a list of
+// filters.
+func (r *DimensionValuesService) Query(profileId int64, dimensionvaluerequest *DimensionValueRequest) *DimensionValuesQueryCall {
+	c := &DimensionValuesQueryCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.dimensionvaluerequest = dimensionvaluerequest
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return.
+func (c *DimensionValuesQueryCall) MaxResults(maxResults int64) *DimensionValuesQueryCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": The value of the
+// nextToken from the previous result page.
+func (c *DimensionValuesQueryCall) PageToken(pageToken string) *DimensionValuesQueryCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *DimensionValuesQueryCall) Do() (*DimensionValueList, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dimensionvaluerequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/dimensionvalues/query")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(DimensionValueList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves list of report dimension values for a list of filters.",
+	//   "httpMethod": "POST",
+	//   "id": "dfareporting.dimensionValues.query",
+	//   "parameterOrder": [
+	//     "profileId"
+	//   ],
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "100",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "The value of the nextToken from the previous result page.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "profileId": {
+	//       "description": "The DFA user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/dimensionvalues/query",
+	//   "request": {
+	//     "$ref": "DimensionValueRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "DimensionValueList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.files.get":
+
+type FilesGetCall struct {
+	s        *Service
+	reportId int64
+	fileId   int64
+	opt_     map[string]interface{}
+}
+
+// Get: Retrieves a report file by its report ID and file ID.
+func (r *FilesService) Get(reportId int64, fileId int64) *FilesGetCall {
+	c := &FilesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.reportId = reportId
+	c.fileId = fileId
+	return c
+}
+
+func (c *FilesGetCall) Do() (*File, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "reports/{reportId}/files/{fileId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", strconv.FormatInt(c.fileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(File)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a report file by its report ID and file ID.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.files.get",
+	//   "parameterOrder": [
+	//     "reportId",
+	//     "fileId"
+	//   ],
+	//   "parameters": {
+	//     "fileId": {
+	//       "description": "The ID of the report file.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "reports/{reportId}/files/{fileId}",
+	//   "response": {
+	//     "$ref": "File"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ],
+	//   "supportsMediaDownload": true
+	// }
+
+}
+
+// method id "dfareporting.files.list":
+
+type FilesListCall struct {
+	s         *Service
+	profileId int64
+	opt_      map[string]interface{}
+}
+
+// List: Lists files for a user profile.
+func (r *FilesService) List(profileId int64) *FilesListCall {
+	c := &FilesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return.
+func (c *FilesListCall) MaxResults(maxResults int64) *FilesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": The value of the
+// nextToken from the previous result page.
+func (c *FilesListCall) PageToken(pageToken string) *FilesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Scope sets the optional parameter "scope": The scope that defines
+// which results are returned, default is 'MINE'.
+func (c *FilesListCall) Scope(scope string) *FilesListCall {
+	c.opt_["scope"] = scope
+	return c
+}
+
+// SortField sets the optional parameter "sortField": The field by which
+// to sort the list.
+func (c *FilesListCall) SortField(sortField string) *FilesListCall {
+	c.opt_["sortField"] = sortField
+	return c
+}
+
+// SortOrder sets the optional parameter "sortOrder": Order of sorted
+// results, default is 'DESCENDING'.
+func (c *FilesListCall) SortOrder(sortOrder string) *FilesListCall {
+	c.opt_["sortOrder"] = sortOrder
+	return c
+}
+
+func (c *FilesListCall) Do() (*FileList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["scope"]; ok {
+		params.Set("scope", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortField"]; ok {
+		params.Set("sortField", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortOrder"]; ok {
+		params.Set("sortOrder", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/files")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(FileList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists files for a user profile.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.files.list",
+	//   "parameterOrder": [
+	//     "profileId"
+	//   ],
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "The value of the nextToken from the previous result page.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "profileId": {
+	//       "description": "The DFA profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "scope": {
+	//       "default": "MINE",
+	//       "description": "The scope that defines which results are returned, default is 'MINE'.",
+	//       "enum": [
+	//         "ALL",
+	//         "MINE",
+	//         "SHARED_WITH_ME"
+	//       ],
+	//       "enumDescriptions": [
+	//         "All files in account.",
+	//         "My files.",
+	//         "Files shared with me."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortField": {
+	//       "default": "LAST_MODIFIED_TIME",
+	//       "description": "The field by which to sort the list.",
+	//       "enum": [
+	//         "ID",
+	//         "LAST_MODIFIED_TIME"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Sort by file ID.",
+	//         "Sort by 'lastmodifiedAt' field."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortOrder": {
+	//       "default": "DESCENDING",
+	//       "description": "Order of sorted results, default is 'DESCENDING'.",
+	//       "enum": [
+	//         "ASCENDING",
+	//         "DESCENDING"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Ascending order.",
+	//         "Descending order."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/files",
+	//   "response": {
+	//     "$ref": "FileList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.delete":
+
+type ReportsDeleteCall struct {
+	s         *Service
+	profileId int64
+	reportId  int64
+	opt_      map[string]interface{}
+}
+
+// Delete: Deletes a report by its ID.
+func (r *ReportsService) Delete(profileId int64, reportId int64) *ReportsDeleteCall {
+	c := &ReportsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.reportId = reportId
+	return c
+}
+
+func (c *ReportsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports/{reportId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes a report by its ID.",
+	//   "httpMethod": "DELETE",
+	//   "id": "dfareporting.reports.delete",
+	//   "parameterOrder": [
+	//     "profileId",
+	//     "reportId"
+	//   ],
+	//   "parameters": {
+	//     "profileId": {
+	//       "description": "The DFA user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports/{reportId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.get":
+
+type ReportsGetCall struct {
+	s         *Service
+	profileId int64
+	reportId  int64
+	opt_      map[string]interface{}
+}
+
+// Get: Retrieves a report by its ID.
+func (r *ReportsService) Get(profileId int64, reportId int64) *ReportsGetCall {
+	c := &ReportsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.reportId = reportId
+	return c
+}
+
+func (c *ReportsGetCall) Do() (*Report, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports/{reportId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Report)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a report by its ID.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.reports.get",
+	//   "parameterOrder": [
+	//     "profileId",
+	//     "reportId"
+	//   ],
+	//   "parameters": {
+	//     "profileId": {
+	//       "description": "The DFA user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports/{reportId}",
+	//   "response": {
+	//     "$ref": "Report"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.insert":
+
+type ReportsInsertCall struct {
+	s         *Service
+	profileId int64
+	report    *Report
+	opt_      map[string]interface{}
+}
+
+// Insert: Creates a report.
+func (r *ReportsService) Insert(profileId int64, report *Report) *ReportsInsertCall {
+	c := &ReportsInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.report = report
+	return c
+}
+
+func (c *ReportsInsertCall) Do() (*Report, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Report)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a report.",
+	//   "httpMethod": "POST",
+	//   "id": "dfareporting.reports.insert",
+	//   "parameterOrder": [
+	//     "profileId"
+	//   ],
+	//   "parameters": {
+	//     "profileId": {
+	//       "description": "The DFA user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports",
+	//   "request": {
+	//     "$ref": "Report"
+	//   },
+	//   "response": {
+	//     "$ref": "Report"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.list":
+
+type ReportsListCall struct {
+	s         *Service
+	profileId int64
+	opt_      map[string]interface{}
+}
+
+// List: Retrieves list of reports.
+func (r *ReportsService) List(profileId int64) *ReportsListCall {
+	c := &ReportsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return.
+func (c *ReportsListCall) MaxResults(maxResults int64) *ReportsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": The value of the
+// nextToken from the previous result page.
+func (c *ReportsListCall) PageToken(pageToken string) *ReportsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// Scope sets the optional parameter "scope": The scope that defines
+// which results are returned, default is 'MINE'.
+func (c *ReportsListCall) Scope(scope string) *ReportsListCall {
+	c.opt_["scope"] = scope
+	return c
+}
+
+// SortField sets the optional parameter "sortField": The field by which
+// to sort the list.
+func (c *ReportsListCall) SortField(sortField string) *ReportsListCall {
+	c.opt_["sortField"] = sortField
+	return c
+}
+
+// SortOrder sets the optional parameter "sortOrder": Order of sorted
+// results, default is 'DESCENDING'.
+func (c *ReportsListCall) SortOrder(sortOrder string) *ReportsListCall {
+	c.opt_["sortOrder"] = sortOrder
+	return c
+}
+
+func (c *ReportsListCall) Do() (*ReportList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["scope"]; ok {
+		params.Set("scope", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortField"]; ok {
+		params.Set("sortField", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortOrder"]; ok {
+		params.Set("sortOrder", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ReportList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves list of reports.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.reports.list",
+	//   "parameterOrder": [
+	//     "profileId"
+	//   ],
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "The value of the nextToken from the previous result page.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "profileId": {
+	//       "description": "The DFA user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "scope": {
+	//       "default": "MINE",
+	//       "description": "The scope that defines which results are returned, default is 'MINE'.",
+	//       "enum": [
+	//         "ALL",
+	//         "MINE"
+	//       ],
+	//       "enumDescriptions": [
+	//         "All reports in account.",
+	//         "My reports."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortField": {
+	//       "default": "LAST_MODIFIED_TIME",
+	//       "description": "The field by which to sort the list.",
+	//       "enum": [
+	//         "ID",
+	//         "LAST_MODIFIED_TIME",
+	//         "NAME"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Sort by report ID.",
+	//         "Sort by 'lastModifiedTime' field.",
+	//         "Sort by name of reports."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortOrder": {
+	//       "default": "DESCENDING",
+	//       "description": "Order of sorted results, default is 'DESCENDING'.",
+	//       "enum": [
+	//         "ASCENDING",
+	//         "DESCENDING"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Ascending order.",
+	//         "Descending order."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports",
+	//   "response": {
+	//     "$ref": "ReportList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.patch":
+
+type ReportsPatchCall struct {
+	s         *Service
+	profileId int64
+	reportId  int64
+	report    *Report
+	opt_      map[string]interface{}
+}
+
+// Patch: Updates a report. This method supports patch semantics.
+func (r *ReportsService) Patch(profileId int64, reportId int64, report *Report) *ReportsPatchCall {
+	c := &ReportsPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.reportId = reportId
+	c.report = report
+	return c
+}
+
+func (c *ReportsPatchCall) Do() (*Report, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports/{reportId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Report)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a report. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "dfareporting.reports.patch",
+	//   "parameterOrder": [
+	//     "profileId",
+	//     "reportId"
+	//   ],
+	//   "parameters": {
+	//     "profileId": {
+	//       "description": "The DFA user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports/{reportId}",
+	//   "request": {
+	//     "$ref": "Report"
+	//   },
+	//   "response": {
+	//     "$ref": "Report"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.run":
+
+type ReportsRunCall struct {
+	s         *Service
+	profileId int64
+	reportId  int64
+	opt_      map[string]interface{}
+}
+
+// Run: Runs a report.
+func (r *ReportsService) Run(profileId int64, reportId int64) *ReportsRunCall {
+	c := &ReportsRunCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.reportId = reportId
+	return c
+}
+
+// Synchronous sets the optional parameter "synchronous": If set and
+// true, tries to run the report synchronously.
+func (c *ReportsRunCall) Synchronous(synchronous bool) *ReportsRunCall {
+	c.opt_["synchronous"] = synchronous
+	return c
+}
+
+func (c *ReportsRunCall) Do() (*File, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["synchronous"]; ok {
+		params.Set("synchronous", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports/{reportId}/run")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(File)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Runs a report.",
+	//   "httpMethod": "POST",
+	//   "id": "dfareporting.reports.run",
+	//   "parameterOrder": [
+	//     "profileId",
+	//     "reportId"
+	//   ],
+	//   "parameters": {
+	//     "profileId": {
+	//       "description": "The DFA profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "synchronous": {
+	//       "description": "If set and true, tries to run the report synchronously.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports/{reportId}/run",
+	//   "response": {
+	//     "$ref": "File"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.update":
+
+type ReportsUpdateCall struct {
+	s         *Service
+	profileId int64
+	reportId  int64
+	report    *Report
+	opt_      map[string]interface{}
+}
+
+// Update: Updates a report.
+func (r *ReportsService) Update(profileId int64, reportId int64, report *Report) *ReportsUpdateCall {
+	c := &ReportsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.reportId = reportId
+	c.report = report
+	return c
+}
+
+func (c *ReportsUpdateCall) Do() (*Report, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports/{reportId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Report)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a report.",
+	//   "httpMethod": "PUT",
+	//   "id": "dfareporting.reports.update",
+	//   "parameterOrder": [
+	//     "profileId",
+	//     "reportId"
+	//   ],
+	//   "parameters": {
+	//     "profileId": {
+	//       "description": "The DFA user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports/{reportId}",
+	//   "request": {
+	//     "$ref": "Report"
+	//   },
+	//   "response": {
+	//     "$ref": "Report"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.reports.files.get":
+
+type ReportsFilesGetCall struct {
+	s         *Service
+	profileId int64
+	reportId  int64
+	fileId    int64
+	opt_      map[string]interface{}
+}
+
+// Get: Retrieves a report file.
+func (r *ReportsFilesService) Get(profileId int64, reportId int64, fileId int64) *ReportsFilesGetCall {
+	c := &ReportsFilesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.reportId = reportId
+	c.fileId = fileId
+	return c
+}
+
+func (c *ReportsFilesGetCall) Do() (*File, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports/{reportId}/files/{fileId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", strconv.FormatInt(c.fileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(File)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a report file.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.reports.files.get",
+	//   "parameterOrder": [
+	//     "profileId",
+	//     "reportId",
+	//     "fileId"
+	//   ],
+	//   "parameters": {
+	//     "fileId": {
+	//       "description": "The ID of the report file.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "profileId": {
+	//       "description": "The DFA profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports/{reportId}/files/{fileId}",
+	//   "response": {
+	//     "$ref": "File"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ],
+	//   "supportsMediaDownload": true
+	// }
+
+}
+
+// method id "dfareporting.reports.files.list":
+
+type ReportsFilesListCall struct {
+	s         *Service
+	profileId int64
+	reportId  int64
+	opt_      map[string]interface{}
+}
+
+// List: Lists files for a report.
+func (r *ReportsFilesService) List(profileId int64, reportId int64) *ReportsFilesListCall {
+	c := &ReportsFilesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	c.reportId = reportId
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of results to return.
+func (c *ReportsFilesListCall) MaxResults(maxResults int64) *ReportsFilesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": The value of the
+// nextToken from the previous result page.
+func (c *ReportsFilesListCall) PageToken(pageToken string) *ReportsFilesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+// SortField sets the optional parameter "sortField": The field by which
+// to sort the list.
+func (c *ReportsFilesListCall) SortField(sortField string) *ReportsFilesListCall {
+	c.opt_["sortField"] = sortField
+	return c
+}
+
+// SortOrder sets the optional parameter "sortOrder": Order of sorted
+// results, default is 'DESCENDING'.
+func (c *ReportsFilesListCall) SortOrder(sortOrder string) *ReportsFilesListCall {
+	c.opt_["sortOrder"] = sortOrder
+	return c
+}
+
+func (c *ReportsFilesListCall) Do() (*FileList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortField"]; ok {
+		params.Set("sortField", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["sortOrder"]; ok {
+		params.Set("sortOrder", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}/reports/{reportId}/files")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(FileList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists files for a report.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.reports.files.list",
+	//   "parameterOrder": [
+	//     "profileId",
+	//     "reportId"
+	//   ],
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "Maximum number of results to return.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "maximum": "10",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "The value of the nextToken from the previous result page.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "profileId": {
+	//       "description": "The DFA profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "reportId": {
+	//       "description": "The ID of the parent report.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sortField": {
+	//       "default": "LAST_MODIFIED_TIME",
+	//       "description": "The field by which to sort the list.",
+	//       "enum": [
+	//         "ID",
+	//         "LAST_MODIFIED_TIME"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Sort by file ID.",
+	//         "Sort by 'lastmodifiedAt' field."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "sortOrder": {
+	//       "default": "DESCENDING",
+	//       "description": "Order of sorted results, default is 'DESCENDING'.",
+	//       "enum": [
+	//         "ASCENDING",
+	//         "DESCENDING"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Ascending order.",
+	//         "Descending order."
+	//       ],
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}/reports/{reportId}/files",
+	//   "response": {
+	//     "$ref": "FileList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.userProfiles.get":
+
+type UserProfilesGetCall struct {
+	s         *Service
+	profileId int64
+	opt_      map[string]interface{}
+}
+
+// Get: Gets one user profile by ID.
+func (r *UserProfilesService) Get(profileId int64) *UserProfilesGetCall {
+	c := &UserProfilesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.profileId = profileId
+	return c
+}
+
+func (c *UserProfilesGetCall) Do() (*UserProfile, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles/{profileId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UserProfile)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Gets one user profile by ID.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.userProfiles.get",
+	//   "parameterOrder": [
+	//     "profileId"
+	//   ],
+	//   "parameters": {
+	//     "profileId": {
+	//       "description": "The user profile ID.",
+	//       "format": "int64",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "userprofiles/{profileId}",
+	//   "response": {
+	//     "$ref": "UserProfile"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
+
+// method id "dfareporting.userProfiles.list":
+
+type UserProfilesListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: Retrieves list of user profiles for a user.
+func (r *UserProfilesService) List() *UserProfilesListCall {
+	c := &UserProfilesListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+func (c *UserProfilesListCall) Do() (*UserProfileList, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1.2/", "userprofiles")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(UserProfileList)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves list of user profiles for a user.",
+	//   "httpMethod": "GET",
+	//   "id": "dfareporting.userProfiles.list",
+	//   "path": "userprofiles",
+	//   "response": {
+	//     "$ref": "UserProfileList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/dfareporting"
+	//   ]
+	// }
+
+}
diff --git a/dfareporting/v1/dfareporting-api.json b/dfareporting/v1/dfareporting-api.json
index e59e043..a31ba6b 100644
--- a/dfareporting/v1/dfareporting-api.json
+++ b/dfareporting/v1/dfareporting-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/5lPlrXkysBNBiqMLDXMb0ovtUjQ\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/3P-pIYojQGviGhPLLntVIzhAzX4\"",
  "discoveryVersion": "v1",
  "id": "dfareporting:v1",
  "name": "dfareporting",
@@ -8,6 +8,8 @@
  "revision": "20130307",
  "title": "DFA Reporting API",
  "description": "Lets you create, run and download reports.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif",
   "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif"
diff --git a/dfareporting/v1/dfareporting-gen.go b/dfareporting/v1/dfareporting-gen.go
index d638286..27c4ba4 100644
--- a/dfareporting/v1/dfareporting-gen.go
+++ b/dfareporting/v1/dfareporting-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "dfareporting:v1"
 const apiName = "dfareporting"
@@ -542,15 +545,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/dimensionvalues/query")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -662,14 +667,16 @@
 		params.Set("sortOrder", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/files")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -768,15 +775,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -835,15 +844,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -914,15 +925,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1021,14 +1034,16 @@
 		params.Set("sortOrder", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1136,16 +1151,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1224,15 +1241,17 @@
 		params.Set("synchronous", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports/{reportId}/run")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1310,16 +1329,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports/{reportId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1390,16 +1411,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports/{reportId}/files/{fileId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
-	urls = strings.Replace(urls, "{fileId}", strconv.FormatInt(c.fileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", strconv.FormatInt(c.fileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1513,15 +1536,17 @@
 		params.Set("sortOrder", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}/reports/{reportId}/files")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
-	urls = strings.Replace(urls, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportId}", strconv.FormatInt(c.reportId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1626,14 +1651,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles/{profileId}")
-	urls = strings.Replace(urls, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{profileId}", strconv.FormatInt(c.profileId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1689,11 +1716,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/dfareporting/v1/", "userprofiles")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1716,12 +1745,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/discovery/v1/discovery-api.json b/discovery/v1/discovery-api.json
index 45f4575..de46afd 100644
--- a/discovery/v1/discovery-api.json
+++ b/discovery/v1/discovery-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/3IDkeesDbYEUw9SeTJcIF0nfhAk\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/TAXbS3ndwF7SDaFThlHgSNrey8E\"",
  "discoveryVersion": "v1",
  "id": "discovery:v1",
  "name": "discovery",
  "version": "v1",
- "revision": "20130106",
+ "revision": "20130411",
  "title": "APIs Discovery Service",
- "description": "Lets you discover information about other Google APIs, such as what APIs are available, the resource and method details for each API",
+ "description": "Lets you discover information about other Google APIs, such as what APIs are available, the resource and method details for each API.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/feature/filing_cabinet_search-g16.png",
   "x32": "http://www.google.com/images/icons/feature/filing_cabinet_search-g32.png"
@@ -90,7 +92,7 @@
        },
        "discoveryRestUrl": {
         "type": "string",
-        "description": "The url for the discovery REST document."
+        "description": "The URL for the discovery REST document."
        },
        "documentationLink": {
         "type": "string",
@@ -102,11 +104,11 @@
         "properties": {
          "x16": {
           "type": "string",
-          "description": "The url of the 16x16 icon."
+          "description": "The URL of the 16x16 icon."
          },
          "x32": {
           "type": "string",
-          "description": "The url of the 32x32 icon."
+          "description": "The URL of the 32x32 icon."
          }
         }
        },
@@ -237,7 +239,7 @@
     },
     "readOnly": {
      "type": "boolean",
-     "description": "The value is read-only, generated by the service. The value can not be modified by the client. It the value is included in a POST, PUT or PATCH request, it will be ignored by the service."
+     "description": "The value is read-only, generated by the service. The value cannot be modified by the client. If the value is included in a POST, PUT, or PATCH request, it is ignored by the service."
     },
     "repeated": {
      "type": "boolean",
@@ -315,7 +317,8 @@
     },
     "etag": {
      "type": "string",
-     "description": "The etag for this response."
+     "description": "The ETag for this response.",
+     "readOnly": true
     },
     "features": {
      "type": "array",
@@ -330,17 +333,17 @@
      "properties": {
       "x16": {
        "type": "string",
-       "description": "The url of the 16x16 icon."
+       "description": "The URL of the 16x16 icon."
       },
       "x32": {
        "type": "string",
-       "description": "The url of the 32x32 icon."
+       "description": "The URL of the 32x32 icon."
       }
      }
     },
     "id": {
      "type": "string",
-     "description": "The id of this API."
+     "description": "The ID of this API."
     },
     "kind": {
      "type": "string",
@@ -366,6 +369,18 @@
      "type": "string",
      "description": "The name of this API."
     },
+    "ownerDomain": {
+     "type": "string",
+     "description": "The domain of the owner of this API. Together with the ownerName and a packagePath values, this can be used to generate a library for this API which would have a unique fully qualified name."
+    },
+    "ownerName": {
+     "type": "string",
+     "description": "The name of the owner of this API. See ownerDomain."
+    },
+    "packagePath": {
+     "type": "string",
+     "description": "The package of the owner of this API. See ownerDomain."
+    },
     "parameters": {
      "type": "object",
      "description": "Common parameters that apply across all apis.",
@@ -393,7 +408,7 @@
     },
     "rootUrl": {
      "type": "string",
-     "description": "The root url under which all API services live."
+     "description": "The root URL under which all API services live."
     },
     "schemas": {
      "type": "object",
@@ -609,21 +624,6 @@
      "httpMethod": "GET",
      "description": "Retrieve the list of APIs supported at this endpoint.",
      "parameters": {
-      "label": {
-       "type": "string",
-       "description": "Only include APIs with a matching label, such as 'graduated' or 'labs'.",
-       "enum": [
-        "deprecated",
-        "graduated",
-        "labs"
-       ],
-       "enumDescriptions": [
-        "APIs that have been deprecated.",
-        "Supported APIs that have graduated from labs.",
-        "APIs that are experimental"
-       ],
-       "location": "query"
-      },
       "name": {
        "type": "string",
        "description": "Only include APIs with the given name.",
diff --git a/discovery/v1/discovery-gen.go b/discovery/v1/discovery-gen.go
index 1d4d7eb..fb5a8bd 100644
--- a/discovery/v1/discovery-gen.go
+++ b/discovery/v1/discovery-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "discovery:v1"
 const apiName = "discovery"
@@ -80,7 +83,7 @@
 	// DiscoveryLink: A link to the discovery document.
 	DiscoveryLink string `json:"discoveryLink,omitempty"`
 
-	// DiscoveryRestUrl: The url for the discovery REST document.
+	// DiscoveryRestUrl: The URL for the discovery REST document.
 	DiscoveryRestUrl string `json:"discoveryRestUrl,omitempty"`
 
 	// DocumentationLink: A link to human readable documentation for the
@@ -114,10 +117,10 @@
 }
 
 type DirectoryListItemsIcons struct {
-	// X16: The url of the 16x16 icon.
+	// X16: The URL of the 16x16 icon.
 	X16 string `json:"x16,omitempty"`
 
-	// X32: The url of the 32x32 icon.
+	// X32: The URL of the 32x32 icon.
 	X32 string `json:"x32,omitempty"`
 }
 
@@ -179,8 +182,8 @@
 	Properties *JsonSchemaProperties `json:"properties,omitempty"`
 
 	// ReadOnly: The value is read-only, generated by the service. The value
-	// can not be modified by the client. It the value is included in a
-	// POST, PUT or PATCH request, it will be ignored by the service.
+	// cannot be modified by the client. If the value is included in a POST,
+	// PUT, or PATCH request, it is ignored by the service.
 	ReadOnly bool `json:"readOnly,omitempty"`
 
 	// Repeated: Whether this parameter may appear multiple times.
@@ -231,7 +234,7 @@
 	// API.
 	DocumentationLink string `json:"documentationLink,omitempty"`
 
-	// Etag: The etag for this response.
+	// Etag: The ETag for this response.
 	Etag string `json:"etag,omitempty"`
 
 	// Features: A list of supported features for this API.
@@ -240,7 +243,7 @@
 	// Icons: Links to 16x16 and 32x32 icons representing the API.
 	Icons *RestDescriptionIcons `json:"icons,omitempty"`
 
-	// Id: The id of this API.
+	// Id: The ID of this API.
 	Id string `json:"id,omitempty"`
 
 	// Kind: The kind for this response.
@@ -256,6 +259,17 @@
 	// Name: The name of this API.
 	Name string `json:"name,omitempty"`
 
+	// OwnerDomain: The domain of the owner of this API. Together with the
+	// ownerName and a packagePath values, this can be used to generate a
+	// library for this API which would have a unique fully qualified name.
+	OwnerDomain string `json:"ownerDomain,omitempty"`
+
+	// OwnerName: The name of the owner of this API. See ownerDomain.
+	OwnerName string `json:"ownerName,omitempty"`
+
+	// PackagePath: The package of the owner of this API. See ownerDomain.
+	PackagePath string `json:"packagePath,omitempty"`
+
 	// Parameters: Common parameters that apply across all apis.
 	Parameters *RestDescriptionParameters `json:"parameters,omitempty"`
 
@@ -268,7 +282,7 @@
 	// Revision: The version of this API.
 	Revision string `json:"revision,omitempty"`
 
-	// RootUrl: The root url under which all API services live.
+	// RootUrl: The root URL under which all API services live.
 	RootUrl string `json:"rootUrl,omitempty"`
 
 	// Schemas: The schemas for this API.
@@ -298,10 +312,10 @@
 }
 
 type RestDescriptionIcons struct {
-	// X16: The url of the 16x16 icon.
+	// X16: The URL of the 16x16 icon.
 	X16 string `json:"x16,omitempty"`
 
-	// X32: The url of the 32x32 icon.
+	// X32: The URL of the 32x32 icon.
 	X32 string `json:"x32,omitempty"`
 }
 
@@ -454,15 +468,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/discovery/v1/", "apis/{api}/{version}/rest")
-	urls = strings.Replace(urls, "{api}", cleanPathString(c.api), 1)
-	urls = strings.Replace(urls, "{version}", cleanPathString(c.version), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{api}", url.QueryEscape(c.api), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{version}", url.QueryEscape(c.version), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -514,13 +530,6 @@
 	return c
 }
 
-// Label sets the optional parameter "label": Only include APIs with a
-// matching label, such as 'graduated' or 'labs'.
-func (c *ApisListCall) Label(label string) *ApisListCall {
-	c.opt_["label"] = label
-	return c
-}
-
 // Name sets the optional parameter "name": Only include APIs with the
 // given name.
 func (c *ApisListCall) Name(name string) *ApisListCall {
@@ -539,9 +548,6 @@
 	var body io.Reader = nil
 	params := make(url.Values)
 	params.Set("alt", "json")
-	if v, ok := c.opt_["label"]; ok {
-		params.Set("label", fmt.Sprintf("%v", v))
-	}
 	if v, ok := c.opt_["name"]; ok {
 		params.Set("name", fmt.Sprintf("%v", v))
 	}
@@ -551,11 +557,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/discovery/v1/", "apis")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -569,21 +577,6 @@
 	//   "httpMethod": "GET",
 	//   "id": "discovery.apis.list",
 	//   "parameters": {
-	//     "label": {
-	//       "description": "Only include APIs with a matching label, such as 'graduated' or 'labs'.",
-	//       "enum": [
-	//         "deprecated",
-	//         "graduated",
-	//         "labs"
-	//       ],
-	//       "enumDescriptions": [
-	//         "APIs that have been deprecated.",
-	//         "Supported APIs that have graduated from labs.",
-	//         "APIs that are experimental"
-	//       ],
-	//       "location": "query",
-	//       "type": "string"
-	//     },
 	//     "name": {
 	//       "description": "Only include APIs with the given name.",
 	//       "location": "query",
@@ -603,12 +596,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/drive/v1/drive-api.json b/drive/v1/drive-api.json
index fe1d874..5646477 100644
--- a/drive/v1/drive-api.json
+++ b/drive/v1/drive-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"DsY8aw3zSOMYNAy_X4JnK21hrvA/Y4pqCwwideuG2u2Tm6UtLnFG_WE\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/iyE7P0-vxlu5wcyyk5CFHB2cx8Y\"",
  "discoveryVersion": "v1",
  "id": "drive:v1",
  "name": "drive",
  "version": "v1",
- "revision": "20130404",
+ "revision": "20130423",
  "title": "Drive API",
  "description": "The API to interact with Drive.",
  "ownerDomain": "google.com",
diff --git a/drive/v1/drive-gen.go b/drive/v1/drive-gen.go
index bde658e..9530818 100644
--- a/drive/v1/drive-gen.go
+++ b/drive/v1/drive-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "drive:v1"
 const apiName = "drive"
@@ -224,14 +227,16 @@
 		params.Set("updateViewedDate", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v1/", "files/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -323,6 +328,7 @@
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -332,6 +338,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -438,15 +445,17 @@
 		params.Set("updateViewedDate", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v1/", "files/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -573,10 +582,11 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -586,6 +596,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -657,12 +668,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/drive/v2/drive-api.json b/drive/v2/drive-api.json
index 3f6953e..0eee9b1 100644
--- a/drive/v2/drive-api.json
+++ b/drive/v2/drive-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/91Bv0kFY3qaTMJ7ejWDpXwf36R4\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/CTtqLVHYlr3oaVFhOo6MFMIw6vc\"",
  "discoveryVersion": "v1",
  "id": "drive:v2",
  "name": "drive",
  "version": "v2",
- "revision": "20130404",
+ "revision": "20130423",
  "title": "Drive API",
  "description": "The API to interact with Drive.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png",
   "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png"
@@ -328,6 +330,10 @@
      "type": "string",
      "description": "The type of object this app creates (e.g. Chart). If empty, the app name should be used instead."
     },
+    "openUrlTemplate": {
+     "type": "string",
+     "description": "The template url for opening files with this app. The template will contain {ids} and/or {exportIds} to be replaced by the actual file ids."
+    },
     "primaryFileExtensions": {
      "type": "array",
      "description": "The list of primary file extensions.",
@@ -342,9 +348,13 @@
       "type": "string"
      }
     },
+    "productId": {
+     "type": "string",
+     "description": "The ID of the product listing for this app."
+    },
     "productUrl": {
      "type": "string",
-     "description": "The product URL."
+     "description": "A link to the product listing for this app."
     },
     "secondaryFileExtensions": {
      "type": "array",
@@ -372,6 +382,10 @@
      "type": "boolean",
      "description": "Whether this app supports importing Google Docs."
     },
+    "supportsMultiOpen": {
+     "type": "boolean",
+     "description": "Whether this app supports opening more than one file."
+    },
     "useByDefault": {
      "type": "boolean",
      "description": "Whether the app is selected as the default handler for the types it supports."
@@ -1601,6 +1615,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file",
       "https://www.googleapis.com/auth/drive.metadata.readonly",
       "https://www.googleapis.com/auth/drive.readonly"
@@ -1649,6 +1664,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file",
       "https://www.googleapis.com/auth/drive.metadata.readonly",
       "https://www.googleapis.com/auth/drive.readonly"
@@ -2069,6 +2085,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file"
      ]
     },
@@ -2133,6 +2150,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file",
       "https://www.googleapis.com/auth/drive.metadata.readonly",
       "https://www.googleapis.com/auth/drive.readonly"
@@ -2193,6 +2211,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file"
      ],
      "supportsMediaUpload": true,
@@ -2257,6 +2276,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file",
       "https://www.googleapis.com/auth/drive.metadata.readonly",
       "https://www.googleapis.com/auth/drive.readonly"
@@ -2343,6 +2363,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file",
       "https://www.googleapis.com/auth/drive.scripts"
      ]
@@ -2368,6 +2389,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file"
      ]
     },
@@ -2392,6 +2414,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file"
      ]
     },
@@ -2416,6 +2439,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file"
      ]
     },
@@ -2500,6 +2524,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
       "https://www.googleapis.com/auth/drive.file",
       "https://www.googleapis.com/auth/drive.scripts"
      ],
diff --git a/drive/v2/drive-gen.go b/drive/v2/drive-gen.go
index d304788..cf39214 100644
--- a/drive/v2/drive-gen.go
+++ b/drive/v2/drive-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "drive:v2"
 const apiName = "drive"
@@ -347,13 +350,21 @@
 	// empty, the app name should be used instead.
 	ObjectType string `json:"objectType,omitempty"`
 
+	// OpenUrlTemplate: The template url for opening files with this app.
+	// The template will contain {ids} and/or {exportIds} to be replaced by
+	// the actual file ids.
+	OpenUrlTemplate string `json:"openUrlTemplate,omitempty"`
+
 	// PrimaryFileExtensions: The list of primary file extensions.
 	PrimaryFileExtensions []string `json:"primaryFileExtensions,omitempty"`
 
 	// PrimaryMimeTypes: The list of primary mime types.
 	PrimaryMimeTypes []string `json:"primaryMimeTypes,omitempty"`
 
-	// ProductUrl: The product URL.
+	// ProductId: The ID of the product listing for this app.
+	ProductId string `json:"productId,omitempty"`
+
+	// ProductUrl: A link to the product listing for this app.
 	ProductUrl string `json:"productUrl,omitempty"`
 
 	// SecondaryFileExtensions: The list of secondary file extensions.
@@ -371,6 +382,10 @@
 	// SupportsImport: Whether this app supports importing Google Docs.
 	SupportsImport bool `json:"supportsImport,omitempty"`
 
+	// SupportsMultiOpen: Whether this app supports opening more than one
+	// file.
+	SupportsMultiOpen bool `json:"supportsMultiOpen,omitempty"`
+
 	// UseByDefault: Whether the app is selected as the default handler for
 	// the types it supports.
 	UseByDefault bool `json:"useByDefault,omitempty"`
@@ -1226,11 +1241,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "about")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1298,14 +1315,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "apps/{appId}")
-	urls = strings.Replace(urls, "{appId}", cleanPathString(c.appId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{appId}", url.QueryEscape(c.appId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1360,11 +1379,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "apps")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1408,14 +1429,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "changes/{changeId}")
-	urls = strings.Replace(urls, "{changeId}", cleanPathString(c.changeId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{changeId}", url.QueryEscape(c.changeId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1445,6 +1468,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file",
 	//     "https://www.googleapis.com/auth/drive.metadata.readonly",
 	//     "https://www.googleapis.com/auth/drive.readonly"
@@ -1525,11 +1549,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "changes")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1581,6 +1607,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file",
 	//     "https://www.googleapis.com/auth/drive.metadata.readonly",
 	//     "https://www.googleapis.com/auth/drive.readonly"
@@ -1612,15 +1639,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{folderId}/children/{childId}")
-	urls = strings.Replace(urls, "{folderId}", cleanPathString(c.folderId), 1)
-	urls = strings.Replace(urls, "{childId}", cleanPathString(c.childId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{folderId}", url.QueryEscape(c.folderId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{childId}", url.QueryEscape(c.childId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1678,15 +1707,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{folderId}/children/{childId}")
-	urls = strings.Replace(urls, "{folderId}", cleanPathString(c.folderId), 1)
-	urls = strings.Replace(urls, "{childId}", cleanPathString(c.childId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{folderId}", url.QueryEscape(c.folderId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{childId}", url.QueryEscape(c.childId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1758,15 +1789,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{folderId}/children")
-	urls = strings.Replace(urls, "{folderId}", cleanPathString(c.folderId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{folderId}", url.QueryEscape(c.folderId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1855,14 +1888,16 @@
 		params.Set("q", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{folderId}/children")
-	urls = strings.Replace(urls, "{folderId}", cleanPathString(c.folderId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{folderId}", url.QueryEscape(c.folderId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1940,15 +1975,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2018,15 +2055,17 @@
 		params.Set("includeDeleted", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2103,15 +2142,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2215,14 +2256,16 @@
 		params.Set("updatedMin", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2314,16 +2357,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2398,16 +2443,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2540,15 +2587,17 @@
 		params.Set("timedTextTrackName", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/copy")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2614,6 +2663,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file"
 	//   ]
 	// }
@@ -2640,14 +2690,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2717,14 +2769,16 @@
 		params.Set("updateViewedDate", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2773,6 +2827,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file",
 	//     "https://www.googleapis.com/auth/drive.metadata.readonly",
 	//     "https://www.googleapis.com/auth/drive.readonly"
@@ -2890,6 +2945,7 @@
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -2899,6 +2955,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2977,6 +3034,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file"
 	//   ],
 	//   "supportsMediaUpload": true,
@@ -3044,11 +3102,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3100,6 +3160,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file",
 	//     "https://www.googleapis.com/auth/drive.metadata.readonly",
 	//     "https://www.googleapis.com/auth/drive.readonly"
@@ -3240,15 +3301,17 @@
 		params.Set("useContentAsIndexableText", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3338,6 +3401,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file",
 	//     "https://www.googleapis.com/auth/drive.scripts"
 	//   ]
@@ -3365,14 +3429,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/touch")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3402,6 +3468,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file"
 	//   ]
 	// }
@@ -3428,14 +3495,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/trash")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3465,6 +3534,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file"
 	//   ]
 	// }
@@ -3491,14 +3561,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/untrash")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3528,6 +3600,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file"
 	//   ]
 	// }
@@ -3674,10 +3747,11 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -3687,6 +3761,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3792,6 +3867,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
 	//     "https://www.googleapis.com/auth/drive.file",
 	//     "https://www.googleapis.com/auth/drive.scripts"
 	//   ],
@@ -3822,15 +3898,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/parents/{parentId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{parentId}", cleanPathString(c.parentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{parentId}", url.QueryEscape(c.parentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3888,15 +3966,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/parents/{parentId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{parentId}", cleanPathString(c.parentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{parentId}", url.QueryEscape(c.parentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3968,15 +4048,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/parents")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4035,14 +4117,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/parents")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4102,15 +4186,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/permissions/{permissionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{permissionId}", cleanPathString(c.permissionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{permissionId}", url.QueryEscape(c.permissionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -4168,15 +4254,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/permissions/{permissionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{permissionId}", cleanPathString(c.permissionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{permissionId}", url.QueryEscape(c.permissionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4269,15 +4357,17 @@
 		params.Set("sendNotificationEmails", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/permissions")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4347,14 +4437,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/permissions")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4432,16 +4524,18 @@
 		params.Set("transferOwnership", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/permissions/{permissionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{permissionId}", cleanPathString(c.permissionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{permissionId}", url.QueryEscape(c.permissionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4533,16 +4627,18 @@
 		params.Set("transferOwnership", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/permissions/{permissionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{permissionId}", cleanPathString(c.permissionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{permissionId}", url.QueryEscape(c.permissionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4626,15 +4722,17 @@
 		params.Set("visibility", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/properties/{propertyKey}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{propertyKey}", cleanPathString(c.propertyKey), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{propertyKey}", url.QueryEscape(c.propertyKey), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -4708,15 +4806,17 @@
 		params.Set("visibility", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/properties/{propertyKey}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{propertyKey}", cleanPathString(c.propertyKey), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{propertyKey}", url.QueryEscape(c.propertyKey), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4794,15 +4894,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/properties")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4861,14 +4963,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/properties")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4945,16 +5049,18 @@
 		params.Set("visibility", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/properties/{propertyKey}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{propertyKey}", cleanPathString(c.propertyKey), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{propertyKey}", url.QueryEscape(c.propertyKey), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5045,16 +5151,18 @@
 		params.Set("visibility", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/properties/{propertyKey}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{propertyKey}", cleanPathString(c.propertyKey), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{propertyKey}", url.QueryEscape(c.propertyKey), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5130,16 +5238,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}/replies/{replyId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
-	urls = strings.Replace(urls, "{replyId}", cleanPathString(c.replyId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{replyId}", url.QueryEscape(c.replyId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -5216,16 +5326,18 @@
 		params.Set("includeDeleted", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}/replies/{replyId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
-	urls = strings.Replace(urls, "{replyId}", cleanPathString(c.replyId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{replyId}", url.QueryEscape(c.replyId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5311,16 +5423,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}/replies")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5421,15 +5535,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}/replies")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5525,17 +5641,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}/replies/{replyId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
-	urls = strings.Replace(urls, "{replyId}", cleanPathString(c.replyId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{replyId}", url.QueryEscape(c.replyId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5619,17 +5737,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/comments/{commentId}/replies/{replyId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
-	urls = strings.Replace(urls, "{replyId}", cleanPathString(c.replyId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{replyId}", url.QueryEscape(c.replyId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5704,15 +5824,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/revisions/{revisionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{revisionId}", cleanPathString(c.revisionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{revisionId}", url.QueryEscape(c.revisionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -5770,15 +5892,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/revisions/{revisionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{revisionId}", cleanPathString(c.revisionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{revisionId}", url.QueryEscape(c.revisionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5843,14 +5967,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/revisions")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5917,16 +6043,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/revisions/{revisionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{revisionId}", cleanPathString(c.revisionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{revisionId}", url.QueryEscape(c.revisionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -6001,16 +6129,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/drive/v2/", "files/{fileId}/revisions/{revisionId}")
-	urls = strings.Replace(urls, "{fileId}", cleanPathString(c.fileId), 1)
-	urls = strings.Replace(urls, "{revisionId}", cleanPathString(c.revisionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{fileId}", url.QueryEscape(c.fileId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{revisionId}", url.QueryEscape(c.revisionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -6055,12 +6185,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/freebase/v1/freebase-api.json b/freebase/v1/freebase-api.json
index 0a3f043..356a5d8 100644
--- a/freebase/v1/freebase-api.json
+++ b/freebase/v1/freebase-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/vrdPJmkVunCo_Y66TJj8GOM9xwo\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/enTN-nwspL5qtzfL3-mgNVdv4II\"",
  "discoveryVersion": "v1",
  "id": "freebase:v1",
  "name": "freebase",
  "version": "v1",
- "revision": "20130422",
+ "revision": "20130514",
  "title": "Freebase API",
  "description": "Topic and MQL APIs provide you structured access to Freebase data.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/freebase-16.png",
   "x32": "http://www.google.com/images/icons/product/freebase-32.png"
diff --git a/freebase/v1/freebase-gen.go b/freebase/v1/freebase-gen.go
index 9e48270..e67678c 100644
--- a/freebase/v1/freebase-gen.go
+++ b/freebase/v1/freebase-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "freebase:v1"
 const apiName = "freebase"
@@ -235,14 +238,16 @@
 		params.Set("pad", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1/", "image{/id*}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id[0]), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id[0]), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -425,11 +430,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1/", "mqlread")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -579,11 +586,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1/", "mqlwrite")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -676,14 +685,16 @@
 		params.Set("maxlength", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1/", "text{/id*}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id[0]), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id[0]), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -809,14 +820,16 @@
 		params.Set("raw", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1/", "topic{/id*}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id[0]), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id[0]), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -878,12 +891,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/freebase/v1sandbox/freebase-api.json b/freebase/v1sandbox/freebase-api.json
index d187584..18eda9d 100644
--- a/freebase/v1sandbox/freebase-api.json
+++ b/freebase/v1sandbox/freebase-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/g-sR85xFKAo6khWsloVFcpi1DjE\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/7efVY9JUFpQ5nbUwCFkHXTT0ysw\"",
  "discoveryVersion": "v1",
  "id": "freebase:v1sandbox",
  "name": "freebase",
  "version": "v1sandbox",
- "revision": "20130422",
+ "revision": "20130514",
  "title": "Freebase API",
  "description": "Topic and MQL APIs provide you structured access to Freebase data.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/freebase-16.png",
   "x32": "http://www.google.com/images/icons/product/freebase-32.png"
diff --git a/freebase/v1sandbox/freebase-gen.go b/freebase/v1sandbox/freebase-gen.go
index ba2c193..fb3baef 100644
--- a/freebase/v1sandbox/freebase-gen.go
+++ b/freebase/v1sandbox/freebase-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "freebase:v1sandbox"
 const apiName = "freebase"
@@ -235,14 +238,16 @@
 		params.Set("pad", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1sandbox/", "image{/id*}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id[0]), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id[0]), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -425,11 +430,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1sandbox/", "mqlread")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -579,11 +586,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1sandbox/", "mqlwrite")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -676,14 +685,16 @@
 		params.Set("maxlength", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1sandbox/", "text{/id*}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id[0]), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id[0]), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -809,14 +820,16 @@
 		params.Set("raw", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/freebase/v1sandbox/", "topic{/id*}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id[0]), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id[0]), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -878,12 +891,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/gan/v1beta1/gan-api.json b/gan/v1beta1/gan-api.json
index 4a6b55b..1f63ea6 100644
--- a/gan/v1beta1/gan-api.json
+++ b/gan/v1beta1/gan-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/re3vWINLXKZMYrG_vD3gHJ8J5TQ\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/pFw7MDyrO_AOc96_PhfOCrqFSg0\"",
  "discoveryVersion": "v1",
  "id": "gan:v1beta1",
  "name": "gan",
@@ -8,6 +8,8 @@
  "revision": "20130205",
  "title": "Google Affiliate Network API",
  "description": "Lets you have programmatic access to your Google Affiliate Network data.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/affiliatenetwork-16.png",
   "x32": "http://www.google.com/images/icons/product/affiliatenetwork-32.png"
diff --git a/gan/v1beta1/gan-gen.go b/gan/v1beta1/gan-gen.go
index 0604eb9..3039226 100644
--- a/gan/v1beta1/gan-gen.go
+++ b/gan/v1beta1/gan-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "gan:v1beta1"
 const apiName = "gan"
@@ -869,15 +872,17 @@
 		params.Set("advertiserId", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/advertiser")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1037,15 +1042,17 @@
 		params.Set("relationshipStatus", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/advertisers")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1194,14 +1201,16 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "publishers/{publisher}/ccOffers")
-	urls = strings.Replace(urls, "{publisher}", cleanPathString(c.publisher), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{publisher}", url.QueryEscape(c.publisher), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1457,15 +1466,17 @@
 		params.Set("type", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/events")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1660,16 +1671,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/link/{linkId}")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
-	urls = strings.Replace(urls, "{linkId}", strconv.FormatInt(c.linkId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{linkId}", strconv.FormatInt(c.linkId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1757,16 +1770,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/link")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1972,15 +1987,17 @@
 		params.Set("startDateMin", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/links")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2176,15 +2193,17 @@
 		params.Set("publisherId", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/publisher")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2344,15 +2363,17 @@
 		params.Set("relationshipStatus", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/publishers")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2598,16 +2619,18 @@
 		params.Set("status", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/gan/v1beta1/", "{role}/{roleId}/report/{reportType}")
-	urls = strings.Replace(urls, "{role}", cleanPathString(c.role), 1)
-	urls = strings.Replace(urls, "{roleId}", cleanPathString(c.roleId), 1)
-	urls = strings.Replace(urls, "{reportType}", cleanPathString(c.reportType), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{role}", url.QueryEscape(c.role), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{roleId}", url.QueryEscape(c.roleId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{reportType}", url.QueryEscape(c.reportType), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2753,12 +2776,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/groupsmigration/v1/groupsmigration-api.json b/groupsmigration/v1/groupsmigration-api.json
index b4ccf4c..3522f08 100644
--- a/groupsmigration/v1/groupsmigration-api.json
+++ b/groupsmigration/v1/groupsmigration-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/1pu0huYUKJy8LIeWkMn7AUodjl8\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/z1awUu0pSGFBQmu8riRPYN3Z4rQ\"",
  "discoveryVersion": "v1",
  "id": "groupsmigration:v1",
  "name": "groupsmigration",
@@ -9,6 +9,8 @@
  "revision": "20130121",
  "title": "Groups Migration API",
  "description": "Groups Migration Api.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/discussions-16.gif",
   "x32": "http://www.google.com/images/icons/product/discussions-32.gif"
diff --git a/groupsmigration/v1/groupsmigration-gen.go b/groupsmigration/v1/groupsmigration-gen.go
index eea5ce6..403b9b7 100644
--- a/groupsmigration/v1/groupsmigration-gen.go
+++ b/groupsmigration/v1/groupsmigration-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "groupsmigration:v1"
 const apiName = "groupsmigration"
@@ -97,12 +100,13 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{groupId}", cleanPathString(c.groupId), 1)
 	urls += "?" + params.Encode()
 	body = new(bytes.Buffer)
 	ctype := "application/json"
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupId}", url.QueryEscape(c.groupId), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -112,6 +116,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -159,12 +164,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/groupssettings/v1/groupssettings-api.json b/groupssettings/v1/groupssettings-api.json
index 1b6aad0..4dae567 100644
--- a/groupssettings/v1/groupssettings-api.json
+++ b/groupssettings/v1/groupssettings-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"DsY8aw3zSOMYNAy_X4JnK21hrvA/ztQYAY1M_NO_OIJnc0YuQu3XpuY\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/ztQYAY1M_NO_OIJnc0YuQu3XpuY\"",
  "discoveryVersion": "v1",
  "id": "groupssettings:v1",
  "name": "groupssettings",
diff --git a/groupssettings/v1/groupssettings-gen.go b/groupssettings/v1/groupssettings-gen.go
index f7dffdd..cf89848 100644
--- a/groupssettings/v1/groupssettings-gen.go
+++ b/groupssettings/v1/groupssettings-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "groupssettings:v1"
 const apiName = "groupssettings"
@@ -185,14 +188,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/groups/v1/groups/", "{groupUniqueId}")
-	urls = strings.Replace(urls, "{groupUniqueId}", cleanPathString(c.groupUniqueId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupUniqueId}", url.QueryEscape(c.groupUniqueId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -255,15 +260,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/groups/v1/groups/", "{groupUniqueId}")
-	urls = strings.Replace(urls, "{groupUniqueId}", cleanPathString(c.groupUniqueId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupUniqueId}", url.QueryEscape(c.groupUniqueId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -328,15 +335,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/groups/v1/groups/", "{groupUniqueId}")
-	urls = strings.Replace(urls, "{groupUniqueId}", cleanPathString(c.groupUniqueId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{groupUniqueId}", url.QueryEscape(c.groupUniqueId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -373,12 +382,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/latitude/v1/latitude-api.json b/latitude/v1/latitude-api.json
index 6c2d258..fe3021e 100644
--- a/latitude/v1/latitude-api.json
+++ b/latitude/v1/latitude-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/DR_yWjwnEWtBlFNS-iLjzY9140I\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/SBUiHvY_omwVBCSErpnpITu6tVY\"",
  "discoveryVersion": "v1",
  "id": "latitude:v1",
  "name": "latitude",
@@ -8,6 +8,8 @@
  "revision": "20120710",
  "title": "Google Latitude API",
  "description": "Lets you read and update your current location and work with your location history",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/latitude/v1/latitude-gen.go b/latitude/v1/latitude-gen.go
index b175920..c118846 100644
--- a/latitude/v1/latitude-gen.go
+++ b/latitude/v1/latitude-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "latitude:v1"
 const apiName = "latitude"
@@ -157,11 +160,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/latitude/v1/", "currentLocation")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -211,11 +216,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/latitude/v1/", "currentLocation")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -285,12 +292,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/latitude/v1/", "currentLocation")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -340,14 +349,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/latitude/v1/", "location/{locationId}")
-	urls = strings.Replace(urls, "{locationId}", cleanPathString(c.locationId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{locationId}", url.QueryEscape(c.locationId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -406,14 +417,16 @@
 		params.Set("granularity", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/latitude/v1/", "location/{locationId}")
-	urls = strings.Replace(urls, "{locationId}", cleanPathString(c.locationId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{locationId}", url.QueryEscape(c.locationId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -490,12 +503,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/latitude/v1/", "location")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -583,11 +598,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/latitude/v1/", "location")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -642,12 +659,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/licensing/v1/licensing-api.json b/licensing/v1/licensing-api.json
index 6a17cbf..2de910f 100644
--- a/licensing/v1/licensing-api.json
+++ b/licensing/v1/licensing-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/1fPEmvlGXsJXR9xUFYrcsF-eQt8\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/UDsE7UjrxlHD-KfN0dYjER_FjQU\"",
  "discoveryVersion": "v1",
  "id": "licensing:v1",
  "name": "licensing",
@@ -8,6 +8,8 @@
  "revision": "20120724",
  "title": "Enterprise License Manager API",
  "description": "Licensing API to view and manage license for your domain.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/licensing/v1/licensing-gen.go b/licensing/v1/licensing-gen.go
index e55dd37..03c981c 100644
--- a/licensing/v1/licensing-gen.go
+++ b/licensing/v1/licensing-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "licensing:v1"
 const apiName = "licensing"
@@ -125,16 +128,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/licensing/v1/product/", "{productId}/sku/{skuId}/user/{userId}")
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
-	urls = strings.Replace(urls, "{skuId}", cleanPathString(c.skuId), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{skuId}", url.QueryEscape(c.skuId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -198,16 +203,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/licensing/v1/product/", "{productId}/sku/{skuId}/user/{userId}")
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
-	urls = strings.Replace(urls, "{skuId}", cleanPathString(c.skuId), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{skuId}", url.QueryEscape(c.skuId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -282,16 +289,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/licensing/v1/product/", "{productId}/sku/{skuId}/user")
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
-	urls = strings.Replace(urls, "{skuId}", cleanPathString(c.skuId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{skuId}", url.QueryEscape(c.skuId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -378,14 +387,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/licensing/v1/product/", "{productId}/users")
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -486,15 +497,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/licensing/v1/product/", "{productId}/sku/{skuId}/users")
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
-	urls = strings.Replace(urls, "{skuId}", cleanPathString(c.skuId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{skuId}", url.QueryEscape(c.skuId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -586,17 +599,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/licensing/v1/product/", "{productId}/sku/{skuId}/user/{userId}")
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
-	urls = strings.Replace(urls, "{skuId}", cleanPathString(c.skuId), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{skuId}", url.QueryEscape(c.skuId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -676,17 +691,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/licensing/v1/product/", "{productId}/sku/{skuId}/user/{userId}")
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
-	urls = strings.Replace(urls, "{skuId}", cleanPathString(c.skuId), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{skuId}", url.QueryEscape(c.skuId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -734,12 +751,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/mirror/v1/mirror-api.json b/mirror/v1/mirror-api.json
index 4dc23df..c19cced 100644
--- a/mirror/v1/mirror-api.json
+++ b/mirror/v1/mirror-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/Sf3JCaeK5AsOg-flbpZrYCqycvI\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/XXPYvQ7C4sSjsanSbYvihpmjoNE\"",
  "discoveryVersion": "v1",
  "id": "mirror:v1",
  "name": "mirror",
  "version": "v1",
- "revision": "20130329",
+ "revision": "20130614",
  "title": "Google Mirror API",
  "description": "API for interacting with Glass users via the timeline.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -442,7 +444,7 @@
    "properties": {
     "attachments": {
      "type": "array",
-     "description": "A list of media attachments associated with this item.",
+     "description": "A list of media attachments associated with this item. As a convenience, you can refer to attachments in your HTML payloads with the attachment or cid scheme. For example:  \n- attachment: \u003cimg src=\"attachment:attachment_index\"\u003e where attachment_index is the 0-based index of this array. \n- cid: \u003cimg src=\"cid:attachment_id\"\u003e where attachment_id is the ID of the attachment.",
      "items": {
       "$ref": "Attachment"
      }
@@ -475,7 +477,7 @@
     },
     "html": {
      "type": "string",
-     "description": "HTML content for this item. If both text and html are provided for an item, the html will be rendered in the timeline."
+     "description": "HTML content for this item. If both text and html are provided for an item, the html will be rendered in the timeline.\nAllowed HTML elements - You can use these elements in your timeline cards.\n \n- Headers: h1, h2, h3, h4, h5, h6 \n- Images: img \n- Lists: li, ol, ul \n- HTML5 semantics: article, aside, details, figure, figcaption, footer, header, nav, section, summary, time \n- Structural: blockquote, br, div, hr, p, span \n- Style: b, big, center, em, i, u, s, small, strike, strong, style, sub, sup \n- Tables: table, tbody, td, tfoot, th, thead, tr  \nBlocked HTML elements: These elements and their contents are removed from HTML payloads.\n \n- Document headers: head, title \n- Embeds: audio, embed, object, source, video \n- Frames: frame, frameset \n- Scripting: applet, script  \nOther elements: Any elements that aren't listed are removed, but their contents are preserved."
     },
     "htmlPages": {
      "type": "array",
@@ -502,7 +504,7 @@
     },
     "isPinned": {
      "type": "boolean",
-     "description": "When true, indicates this item is pinned, which means it's grouped alongside \"active\" items like navigation and hangouts, on the opposite side of the home screen from historical (non-pinned) timeline items."
+     "description": "When true, indicates this item is pinned, which means it's grouped alongside \"active\" items like navigation and hangouts, on the opposite side of the home screen from historical (non-pinned) timeline items. You can allow the user to toggle the value of this property with the TOGGLE_PINNED built-in menu item."
     },
     "kind": {
      "type": "string",
@@ -546,7 +548,7 @@
     },
     "speakableText": {
      "type": "string",
-     "description": "The speakable version of the content of this item. Along with the READ_ALOUD menu item, use this field to provide text that would be clearer when read aloud, or to provide extended information to what is displayed visually on Glass."
+     "description": "The speakable version of the content of this item. Along with the READ_ALOUD menu item, use this field to provide text that would be clearer when read aloud, or to provide extended information to what is displayed visually on Glass. If you specified html content, use this property instead of text to specify the text to read aloud."
     },
     "text": {
      "type": "string",
diff --git a/mirror/v1/mirror-gen.go b/mirror/v1/mirror-gen.go
index e74148d..3be0bb7 100644
--- a/mirror/v1/mirror-gen.go
+++ b/mirror/v1/mirror-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "mirror:v1"
 const apiName = "mirror"
@@ -377,6 +380,13 @@
 
 type TimelineItem struct {
 	// Attachments: A list of media attachments associated with this item.
+	// As a convenience, you can refer to attachments in your HTML payloads
+	// with the attachment or cid scheme. For example:
+	// - attachment: <img
+	// src="attachment:attachment_index"> where attachment_index is the
+	// 0-based index of this array.
+	// - cid: <img src="cid:attachment_id">
+	// where attachment_id is the ID of the attachment.
 	Attachments []*Attachment `json:"attachments,omitempty"`
 
 	// BundleId: The bundle ID for this item. Services can specify a
@@ -407,6 +417,34 @@
 
 	// Html: HTML content for this item. If both text and html are provided
 	// for an item, the html will be rendered in the timeline.
+	// Allowed HTML
+	// elements - You can use these elements in your timeline cards.
+	//
+	// -
+	// Headers: h1, h2, h3, h4, h5, h6
+	// - Images: img
+	// - Lists: li, ol, ul
+	//
+	// - HTML5 semantics: article, aside, details, figure, figcaption,
+	// footer, header, nav, section, summary, time
+	// - Structural:
+	// blockquote, br, div, hr, p, span
+	// - Style: b, big, center, em, i, u,
+	// s, small, strike, strong, style, sub, sup
+	// - Tables: table, tbody,
+	// td, tfoot, th, thead, tr
+	// Blocked HTML elements: These elements and
+	// their contents are removed from HTML payloads.
+	//
+	// - Document headers:
+	// head, title
+	// - Embeds: audio, embed, object, source, video
+	// - Frames:
+	// frame, frameset
+	// - Scripting: applet, script
+	// Other elements: Any
+	// elements that aren't listed are removed, but their contents are
+	// preserved.
 	Html string `json:"html,omitempty"`
 
 	// HtmlPages: Additional pages of HTML content associated with this
@@ -449,7 +487,8 @@
 	// IsPinned: When true, indicates this item is pinned, which means it's
 	// grouped alongside "active" items like navigation and hangouts, on the
 	// opposite side of the home screen from historical (non-pinned)
-	// timeline items.
+	// timeline items. You can allow the user to toggle the value of this
+	// property with the TOGGLE_PINNED built-in menu item.
 	IsPinned bool `json:"isPinned,omitempty"`
 
 	// Kind: The type of resource. This is always mirror#timelineItem.
@@ -486,7 +525,9 @@
 	// SpeakableText: The speakable version of the content of this item.
 	// Along with the READ_ALOUD menu item, use this field to provide text
 	// that would be clearer when read aloud, or to provide extended
-	// information to what is displayed visually on Glass.
+	// information to what is displayed visually on Glass. If you specified
+	// html content, use this property instead of text to specify the text
+	// to read aloud.
 	SpeakableText string `json:"speakableText,omitempty"`
 
 	// Text: Text content of this item.
@@ -557,14 +598,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "contacts/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -609,14 +652,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "contacts/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -675,12 +720,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "contacts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -724,11 +771,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "contacts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -777,15 +826,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "contacts/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -847,15 +898,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "contacts/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -910,14 +963,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "locations/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -969,11 +1024,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "locations")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1014,14 +1071,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "subscriptions/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1073,12 +1132,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "subscriptions")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1123,11 +1184,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "subscriptions")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1175,15 +1238,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "subscriptions/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1238,14 +1303,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "timeline/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1290,14 +1357,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "timeline/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1366,6 +1435,7 @@
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -1375,6 +1445,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1507,11 +1578,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "timeline")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1606,15 +1679,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "timeline/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1685,10 +1760,11 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -1698,6 +1774,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1773,15 +1850,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "timeline/{itemId}/attachments/{attachmentId}")
-	urls = strings.Replace(urls, "{itemId}", cleanPathString(c.itemId), 1)
-	urls = strings.Replace(urls, "{attachmentId}", cleanPathString(c.attachmentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{itemId}", url.QueryEscape(c.itemId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{attachmentId}", url.QueryEscape(c.attachmentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1836,15 +1915,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "timeline/{itemId}/attachments/{attachmentId}")
-	urls = strings.Replace(urls, "{itemId}", cleanPathString(c.itemId), 1)
-	urls = strings.Replace(urls, "{attachmentId}", cleanPathString(c.attachmentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{itemId}", url.QueryEscape(c.itemId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{attachmentId}", url.QueryEscape(c.attachmentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1913,12 +1994,13 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{itemId}", cleanPathString(c.itemId), 1)
 	urls += "?" + params.Encode()
 	body = new(bytes.Buffer)
 	ctype := "application/json"
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{itemId}", url.QueryEscape(c.itemId), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -1928,6 +2010,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1998,14 +2081,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/mirror/v1/", "timeline/{itemId}/attachments")
-	urls = strings.Replace(urls, "{itemId}", cleanPathString(c.itemId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{itemId}", url.QueryEscape(c.itemId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2036,12 +2121,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/oauth2/v1/oauth2-api.json b/oauth2/v1/oauth2-api.json
index 4e9e13d..6613d83 100644
--- a/oauth2/v1/oauth2-api.json
+++ b/oauth2/v1/oauth2-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/9P4dDccMUBjXBG5qg-jCAJQHJ-I\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/wSO6xATyMyVzWi5XYGGjDiXaucI\"",
  "discoveryVersion": "v1",
  "id": "oauth2:v1",
  "name": "oauth2",
  "version": "v1",
- "revision": "20130328",
+ "revision": "20130510",
  "title": "Google OAuth2 API",
  "description": "Lets you access OAuth2 protocol related APIs.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/oauth2/v1/oauth2-gen.go b/oauth2/v1/oauth2-gen.go
index b0b2317..008d9b7 100644
--- a/oauth2/v1/oauth2-gen.go
+++ b/oauth2/v1/oauth2-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "oauth2:v1"
 const apiName = "oauth2"
@@ -227,11 +230,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/", "oauth2/v1/tokeninfo")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -284,11 +289,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/", "oauth2/v1/userinfo")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -335,11 +342,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/", "userinfo/v2/me")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -365,12 +374,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/oauth2/v2/oauth2-api.json b/oauth2/v2/oauth2-api.json
index de7e952..0b18c70 100644
--- a/oauth2/v2/oauth2-api.json
+++ b/oauth2/v2/oauth2-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/XnMIJpFvFsVSEqgjRxarXF4-Yo0\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/_Rxo1xnvBjhAUbm_XuYfyXrKEbI\"",
  "discoveryVersion": "v1",
  "id": "oauth2:v2",
  "name": "oauth2",
  "version": "v2",
- "revision": "20130328",
+ "revision": "20130510",
  "title": "Google OAuth2 API",
  "description": "Lets you access OAuth2 protocol related APIs.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/oauth2/v2/oauth2-gen.go b/oauth2/v2/oauth2-gen.go
index 9626304..ffc626d 100644
--- a/oauth2/v2/oauth2-gen.go
+++ b/oauth2/v2/oauth2-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "oauth2:v2"
 const apiName = "oauth2"
@@ -213,11 +216,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/", "oauth2/v2/tokeninfo")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -267,11 +272,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/", "oauth2/v2/userinfo")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -317,11 +324,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/", "userinfo/v2/me")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -346,12 +355,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/orkut/v2/orkut-api.json b/orkut/v2/orkut-api.json
index 2d5c52a..cf47105 100644
--- a/orkut/v2/orkut-api.json
+++ b/orkut/v2/orkut-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/ZQjH7GIxQML9864WR3mPJz1ZMlo\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/qCYcIF9SU9Hl8Qg-et4yd-nbiwI\"",
  "discoveryVersion": "v1",
  "id": "orkut:v2",
  "name": "orkut",
@@ -8,6 +8,8 @@
  "revision": "20120223",
  "title": "Orkut API",
  "description": "Lets you manage activities, comments and badges in Orkut. More stuff coming in time.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/orkut-16.png",
   "x32": "http://www.google.com/images/icons/product/orkut-32.png"
diff --git a/orkut/v2/orkut-gen.go b/orkut/v2/orkut-gen.go
index 249abf9..9988462 100644
--- a/orkut/v2/orkut-gen.go
+++ b/orkut/v2/orkut-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "orkut:v2"
 const apiName = "orkut"
@@ -1076,15 +1079,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/{activityId}/acl/{userId}")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1140,14 +1145,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/{activityId}")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1227,15 +1234,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "people/{userId}/activities/{collection}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{collection}", cleanPathString(c.collection), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{collection}", url.QueryEscape(c.collection), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1326,14 +1335,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/{activityId}/visibility")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1397,15 +1408,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/{activityId}/visibility")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1470,15 +1483,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/{activityId}/visibility")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1538,15 +1553,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "people/{userId}/badges/{badgeId}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{badgeId}", strconv.FormatInt(c.badgeId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{badgeId}", strconv.FormatInt(c.badgeId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1610,14 +1627,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "people/{userId}/badges")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1673,14 +1692,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "comments/{commentId}")
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1738,14 +1759,16 @@
 		params.Set("hl", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "comments/{commentId}")
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1813,15 +1836,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/{activityId}/comments")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1918,14 +1943,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/{activityId}/comments")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2022,14 +2049,16 @@
 		params.Set("hl", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2122,14 +2151,16 @@
 		params.Set("orderBy", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "people/{userId}/communities")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2212,15 +2243,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/followers/{userId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2278,15 +2311,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/followers/{userId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2351,15 +2386,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/members/{userId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2427,15 +2464,17 @@
 		params.Set("hl", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/members/{userId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2506,15 +2545,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/members/{userId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2620,14 +2661,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/members")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2710,16 +2753,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/topics/{topicId}/messages/{messageId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
-	urls = strings.Replace(urls, "{messageId}", strconv.FormatInt(c.messageId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{messageId}", strconv.FormatInt(c.messageId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2793,16 +2838,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/topics/{topicId}/messages")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2901,15 +2948,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/topics/{topicId}/messages")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3001,16 +3050,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/polls/{pollId}/comments")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{pollId}", cleanPathString(c.pollId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{pollId}", url.QueryEscape(c.pollId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3108,15 +3159,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/polls/{pollId}/comments")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{pollId}", cleanPathString(c.pollId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{pollId}", url.QueryEscape(c.pollId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3206,16 +3259,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/polls/{pollId}/votes")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{pollId}", cleanPathString(c.pollId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{pollId}", url.QueryEscape(c.pollId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3293,15 +3348,17 @@
 		params.Set("hl", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/polls/{pollId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{pollId}", cleanPathString(c.pollId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{pollId}", url.QueryEscape(c.pollId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3400,14 +3457,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/polls")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3491,14 +3550,16 @@
 		params.Set("hl", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/related")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3562,15 +3623,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/topics/{topicId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3639,15 +3702,17 @@
 		params.Set("hl", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/topics/{topicId}")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
-	urls = strings.Replace(urls, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{topicId}", strconv.FormatInt(c.topicId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3734,15 +3799,17 @@
 		params.Set("isShout", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/topics")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3836,14 +3903,16 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "communities/{communityId}/topics")
-	urls = strings.Replace(urls, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{communityId}", strconv.FormatInt(c.communityId, 10), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3918,14 +3987,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "people/{userId}/counters")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3988,12 +4059,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/orkut/v2/", "activities/scraps")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4019,12 +4092,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/pagespeedonline/v1/pagespeedonline-api.json b/pagespeedonline/v1/pagespeedonline-api.json
index 050fe06..8fe55ef 100644
--- a/pagespeedonline/v1/pagespeedonline-api.json
+++ b/pagespeedonline/v1/pagespeedonline-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/aELXXL8IOLrFeQLBHl9LnAjH468\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/H8xuOZyrj1dfphnwIUk6WxmXLe4\"",
  "discoveryVersion": "v1",
  "id": "pagespeedonline:v1",
  "name": "pagespeedonline",
@@ -8,6 +8,8 @@
  "revision": "20130321",
  "title": "Page Speed Online API",
  "description": "Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/pagespeed-16.png",
   "x32": "http://www.google.com/images/icons/product/pagespeed-32.png"
diff --git a/pagespeedonline/v1/pagespeedonline-gen.go b/pagespeedonline/v1/pagespeedonline-gen.go
index 2e75ed8..67793f7 100644
--- a/pagespeedonline/v1/pagespeedonline-gen.go
+++ b/pagespeedonline/v1/pagespeedonline-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "pagespeedonline:v1"
 const apiName = "pagespeedonline"
@@ -253,11 +256,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/pagespeedonline/v1/", "runPagespeed")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -321,12 +326,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/plus/v1/plus-api.json b/plus/v1/plus-api.json
index 34b4d27..a6fd2e3 100644
--- a/plus/v1/plus-api.json
+++ b/plus/v1/plus-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/fqDQJaCYcVMA5esBQjeVnm3e2lk\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/r-ibhnPzi-5PSK_yoqHMzQXfRZQ\"",
  "discoveryVersion": "v1",
  "id": "plus:v1",
  "name": "plus",
  "version": "v1",
- "revision": "20130320",
+ "revision": "20130527",
  "title": "Google+ API",
  "description": "The Google+ API enables developers to build on top of the Google+ platform.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/gplus-16.png",
   "x32": "http://www.google.com/images/icons/product/gplus-32.png"
@@ -1310,7 +1312,7 @@
        },
        "type": {
         "type": "string",
-        "description": "The type of URL. Possible values are:  \n- \"otherProfile\" - URL for another profile. \n- \"contributor\" - URL for which this person is a contributor to. \n- \"website\" - URL for this +Page's primary website. \n- \"other\" - Other."
+        "description": "The type of URL. Possible values are:  \n- \"otherProfile\" - URL for another profile. \n- \"contributor\" - URL for which this person is a contributor to. \n- \"website\" - URL for this Google+ Page's primary website. \n- \"other\" - Other."
        },
        "value": {
         "type": "string",
@@ -1380,7 +1382,7 @@
     },
     "type": {
      "type": "string",
-     "description": "The type of entry describing to whom access is granted. Possible values are:  \n- \"person\" - Access to an individual. \n- \"circle\" - Access to members of a circle. \n- \"myCircles\" - Access to members of all the person's circles. \n- \"extendedCircles\" - Access to members of everyone in a person's circles, plus all of the people in their circles. \n- \"public\" - Access to anyone on the web."
+     "description": "The type of entry describing to whom access is granted. Possible values are:  \n- \"person\" - Access to an individual. \n- \"circle\" - Access to members of a circle. \n- \"myCircles\" - Access to members of all the person's circles. \n- \"extendedCircles\" - Access to members of everyone in a person's circles, plus all of the people in their circles. \n- \"domain\" - Access to members of the person's Google Apps domain. \n- \"public\" - Access to anyone on the web."
     }
    }
   }
@@ -1888,10 +1890,10 @@
       "maxResults": {
        "type": "integer",
        "description": "The maximum number of people to include in the response, which is used for paging. For any response, the actual number returned might be less than the specified maxResults.",
-       "default": "10",
+       "default": "25",
        "format": "uint32",
        "minimum": "1",
-       "maximum": "20",
+       "maximum": "50",
        "location": "query"
       },
       "pageToken": {
diff --git a/plus/v1/plus-gen.go b/plus/v1/plus-gen.go
index 598f924..913c0a6 100644
--- a/plus/v1/plus-gen.go
+++ b/plus/v1/plus-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "plus:v1"
 const apiName = "plus"
@@ -1112,7 +1115,7 @@
 	// for another profile.
 	// - "contributor" - URL for which this person is
 	// a contributor to.
-	// - "website" - URL for this +Page's primary
+	// - "website" - URL for this Google+ Page's primary
 	// website.
 	// - "other" - Other.
 	Type string `json:"type,omitempty"`
@@ -1167,6 +1170,8 @@
 	// - "extendedCircles" - Access to
 	// members of everyone in a person's circles, plus all of the people in
 	// their circles.
+	// - "domain" - Access to members of the person's Google
+	// Apps domain.
 	// - "public" - Access to anyone on the web.
 	Type string `json:"type,omitempty"`
 }
@@ -1191,14 +1196,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "activities/{activityId}")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1281,15 +1288,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "people/{userId}/activities/{collection}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{collection}", cleanPathString(c.collection), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{collection}", url.QueryEscape(c.collection), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1421,11 +1430,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "activities")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1515,14 +1526,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "comments/{commentId}")
-	urls = strings.Replace(urls, "{commentId}", cleanPathString(c.commentId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{commentId}", url.QueryEscape(c.commentId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1612,14 +1625,16 @@
 		params.Set("sortOrder", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "activities/{activityId}/comments")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1723,16 +1738,18 @@
 		params.Set("debug", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "people/{userId}/moments/{collection}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{collection}", cleanPathString(c.collection), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{collection}", url.QueryEscape(c.collection), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1854,15 +1871,17 @@
 		params.Set("type", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "people/{userId}/moments/{collection}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{collection}", cleanPathString(c.collection), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{collection}", url.QueryEscape(c.collection), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1954,14 +1973,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "moments/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2011,14 +2032,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "people/{userId}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2110,15 +2133,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "people/{userId}/people/{collection}")
-	urls = strings.Replace(urls, "{userId}", cleanPathString(c.userId), 1)
-	urls = strings.Replace(urls, "{collection}", cleanPathString(c.collection), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{userId}", url.QueryEscape(c.userId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{collection}", url.QueryEscape(c.collection), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2240,15 +2265,17 @@
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "activities/{activityId}/people/{collection}")
-	urls = strings.Replace(urls, "{activityId}", cleanPathString(c.activityId), 1)
-	urls = strings.Replace(urls, "{collection}", cleanPathString(c.collection), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{activityId}", url.QueryEscape(c.activityId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{collection}", url.QueryEscape(c.collection), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2372,11 +2399,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/plus/v1/", "people")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2400,11 +2429,11 @@
 	//       "type": "string"
 	//     },
 	//     "maxResults": {
-	//       "default": "10",
+	//       "default": "25",
 	//       "description": "The maximum number of people to include in the response, which is used for paging. For any response, the actual number returned might be less than the specified maxResults.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "20",
+	//       "maximum": "50",
 	//       "minimum": "1",
 	//       "type": "integer"
 	//     },
@@ -2431,12 +2460,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/prediction/v1.2/prediction-api.json b/prediction/v1.2/prediction-api.json
index b619cd0..ce58d49 100644
--- a/prediction/v1.2/prediction-api.json
+++ b/prediction/v1.2/prediction-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/zGgfUSt9fqco057uRHdyq5nA6EY\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/LjXcVOTYg6tLlq1WE9c3gBJy7Fs\"",
  "discoveryVersion": "v1",
  "id": "prediction:v1.2",
  "name": "prediction",
  "version": "v1.2",
- "revision": "20130318",
+ "revision": "20130525",
  "title": "Prediction API",
  "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
   "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
diff --git a/prediction/v1.2/prediction-gen.go b/prediction/v1.2/prediction-gen.go
index ee8a5c7..7971225 100644
--- a/prediction/v1.2/prediction-gen.go
+++ b/prediction/v1.2/prediction-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "prediction:v1.2"
 const apiName = "prediction"
@@ -170,15 +173,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.2/", "training/{data}/predict")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -243,15 +248,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.2/", "hostedmodels/{hostedModelName}/predict")
-	urls = strings.Replace(urls, "{hostedModelName}", cleanPathString(c.hostedModelName), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{hostedModelName}", url.QueryEscape(c.hostedModelName), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -309,14 +316,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.2/", "training/{data}")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -364,14 +373,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.2/", "training/{data}")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -443,12 +454,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.2/", "training")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -512,15 +525,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.2/", "training/{data}")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -557,12 +572,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/prediction/v1.3/prediction-api.json b/prediction/v1.3/prediction-api.json
index 0346662..c4b3d4d 100644
--- a/prediction/v1.3/prediction-api.json
+++ b/prediction/v1.3/prediction-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/29enF95-xAinr69EDODyy8ewDlA\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/7rafGtciKQPfy7v9K6fs2G9SzXY\"",
  "discoveryVersion": "v1",
  "id": "prediction:v1.3",
  "name": "prediction",
  "version": "v1.3",
- "revision": "20130318",
+ "revision": "20130525",
  "title": "Prediction API",
  "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
   "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
diff --git a/prediction/v1.3/prediction-gen.go b/prediction/v1.3/prediction-gen.go
index dd64898..0680a1f 100644
--- a/prediction/v1.3/prediction-gen.go
+++ b/prediction/v1.3/prediction-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "prediction:v1.3"
 const apiName = "prediction"
@@ -235,15 +238,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.3/", "hostedmodels/{hostedModelName}/predict")
-	urls = strings.Replace(urls, "{hostedModelName}", cleanPathString(c.hostedModelName), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{hostedModelName}", url.QueryEscape(c.hostedModelName), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -301,14 +306,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.3/", "training/{data}")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -356,14 +363,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.3/", "training/{data}")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -425,12 +434,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.3/", "training")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -487,15 +498,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.3/", "training/{data}/predict")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -560,15 +573,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.3/", "training/{data}")
-	urls = strings.Replace(urls, "{data}", cleanPathString(c.data), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{data}", url.QueryEscape(c.data), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -605,12 +620,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/prediction/v1.4/prediction-api.json b/prediction/v1.4/prediction-api.json
index 82de599..634d5f9 100644
--- a/prediction/v1.4/prediction-api.json
+++ b/prediction/v1.4/prediction-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/Duudc6K_I7IrfEg6wwDeuiLpaz0\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/EsdQzMzSrjtfb_vWfMSgJjT6jsU\"",
  "discoveryVersion": "v1",
  "id": "prediction:v1.4",
  "name": "prediction",
  "version": "v1.4",
- "revision": "20130318",
+ "revision": "20130525",
  "title": "Prediction API",
  "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
   "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
diff --git a/prediction/v1.4/prediction-gen.go b/prediction/v1.4/prediction-gen.go
index bc97cf5..e6eb13d 100644
--- a/prediction/v1.4/prediction-gen.go
+++ b/prediction/v1.4/prediction-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "prediction:v1.4"
 const apiName = "prediction"
@@ -258,15 +261,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.4/", "hostedmodels/{hostedModelName}/predict")
-	urls = strings.Replace(urls, "{hostedModelName}", cleanPathString(c.hostedModelName), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{hostedModelName}", url.QueryEscape(c.hostedModelName), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -324,14 +329,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.4/", "trainedmodels/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -379,14 +386,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.4/", "trainedmodels/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -448,12 +457,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.4/", "trainedmodels")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -510,15 +521,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.4/", "trainedmodels/{id}/predict")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -583,15 +596,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.4/", "trainedmodels/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -628,12 +643,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/prediction/v1.5/prediction-api.json b/prediction/v1.5/prediction-api.json
index 6ee05a4..0bf3320 100644
--- a/prediction/v1.5/prediction-api.json
+++ b/prediction/v1.5/prediction-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/0DuhgYwsVgldygfxmAa8qilGHWY\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/GwAV-9qRqaUli0FjjaZadBfHhg8\"",
  "discoveryVersion": "v1",
  "id": "prediction:v1.5",
  "name": "prediction",
  "version": "v1.5",
- "revision": "20130318",
+ "revision": "20130525",
  "title": "Prediction API",
  "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
   "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
diff --git a/prediction/v1.5/prediction-gen.go b/prediction/v1.5/prediction-gen.go
index c19924f..c7a5eeb 100644
--- a/prediction/v1.5/prediction-gen.go
+++ b/prediction/v1.5/prediction-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "prediction:v1.5"
 const apiName = "prediction"
@@ -396,15 +399,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "hostedmodels/{hostedModelName}/predict")
-	urls = strings.Replace(urls, "{hostedModelName}", cleanPathString(c.hostedModelName), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{hostedModelName}", url.QueryEscape(c.hostedModelName), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -463,14 +468,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "trainedmodels/{id}/analyze")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -525,14 +532,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "trainedmodels/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -580,14 +589,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "trainedmodels/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -649,12 +660,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "trainedmodels")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -723,11 +736,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "trainedmodels/list")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -792,15 +807,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "trainedmodels/{id}/predict")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -865,15 +882,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/prediction/v1.5/", "trainedmodels/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -910,12 +929,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/reseller/v1/reseller-api.json b/reseller/v1/reseller-api.json
index 7f88285..cf15a68 100644
--- a/reseller/v1/reseller-api.json
+++ b/reseller/v1/reseller-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/VV1j5c4u3nlGLXe1Hkc2GLNyv6c\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/A5kidKNt7uPjqOfJvttgk10INMg\"",
  "discoveryVersion": "v1",
  "id": "reseller:v1",
  "name": "reseller",
  "version": "v1",
- "revision": "20130308",
+ "revision": "20130429",
  "title": "Enterprise Apps Reseller API",
  "description": "Lets you create and manage your customers and their subscriptions.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -275,6 +277,10 @@
      "type": "string",
      "description": "Name of the sku for which this subscription is purchased."
     },
+    "status": {
+     "type": "string",
+     "description": "Status of the subscription."
+    },
     "subscriptionId": {
      "type": "string",
      "description": "The id of the subscription."
diff --git a/reseller/v1/reseller-gen.go b/reseller/v1/reseller-gen.go
index 1fa914c..51106ad 100644
--- a/reseller/v1/reseller-gen.go
+++ b/reseller/v1/reseller-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "reseller:v1"
 const apiName = "reseller"
@@ -189,6 +192,9 @@
 	// SkuId: Name of the sku for which this subscription is purchased.
 	SkuId string `json:"skuId,omitempty"`
 
+	// Status: Status of the subscription.
+	Status string `json:"status,omitempty"`
+
 	// SubscriptionId: The id of the subscription.
 	SubscriptionId string `json:"subscriptionId,omitempty"`
 
@@ -260,14 +266,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -338,12 +346,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -402,15 +412,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -473,15 +485,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -545,16 +559,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}/subscriptions/{subscriptionId}/changePlan")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -625,16 +641,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}/subscriptions/{subscriptionId}/changeRenewalSettings")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -705,16 +723,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}/subscriptions/{subscriptionId}/changeSeats")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -781,15 +801,17 @@
 	params.Set("alt", "json")
 	params.Set("deletionType", fmt.Sprintf("%v", c.deletionType))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}/subscriptions/{subscriptionId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -860,15 +882,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}/subscriptions/{subscriptionId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -945,15 +969,17 @@
 		params.Set("customerAuthToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}/subscriptions")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1045,11 +1071,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "subscriptions")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1112,15 +1140,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1/", "customers/{customerId}/subscriptions/{subscriptionId}/startPaidService")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1158,12 +1188,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/reseller/v1sandbox/reseller-api.json b/reseller/v1sandbox/reseller-api.json
index f34aac9..d751350 100644
--- a/reseller/v1sandbox/reseller-api.json
+++ b/reseller/v1sandbox/reseller-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"DsY8aw3zSOMYNAy_X4JnK21hrvA/il9Yp4f67cWmdSbk1hutBFbEcwY\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/QC7HzCRx8BjDcHJprjwyumxDYSw\"",
  "discoveryVersion": "v1",
  "id": "reseller:v1sandbox",
  "name": "reseller",
  "version": "v1sandbox",
- "revision": "20130308",
+ "revision": "20130429",
  "title": "Enterprise Apps Reseller API",
  "description": "Lets you create and manage your customers and their subscriptions.",
  "ownerDomain": "google.com",
@@ -277,6 +277,10 @@
      "type": "string",
      "description": "Name of the sku for which this subscription is purchased."
     },
+    "status": {
+     "type": "string",
+     "description": "Status of the subscription."
+    },
     "subscriptionId": {
      "type": "string",
      "description": "The id of the subscription."
diff --git a/reseller/v1sandbox/reseller-gen.go b/reseller/v1sandbox/reseller-gen.go
index cf767cd..fe4dc0a 100644
--- a/reseller/v1sandbox/reseller-gen.go
+++ b/reseller/v1sandbox/reseller-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "reseller:v1sandbox"
 const apiName = "reseller"
@@ -189,6 +192,9 @@
 	// SkuId: Name of the sku for which this subscription is purchased.
 	SkuId string `json:"skuId,omitempty"`
 
+	// Status: Status of the subscription.
+	Status string `json:"status,omitempty"`
+
 	// SubscriptionId: The id of the subscription.
 	SubscriptionId string `json:"subscriptionId,omitempty"`
 
@@ -260,14 +266,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -338,12 +346,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -402,15 +412,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -473,15 +485,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -545,16 +559,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}/subscriptions/{subscriptionId}/changePlan")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -625,16 +641,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}/subscriptions/{subscriptionId}/changeRenewalSettings")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -705,16 +723,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}/subscriptions/{subscriptionId}/changeSeats")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -781,15 +801,17 @@
 	params.Set("alt", "json")
 	params.Set("deletionType", fmt.Sprintf("%v", c.deletionType))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}/subscriptions/{subscriptionId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -860,15 +882,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}/subscriptions/{subscriptionId}")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -945,15 +969,17 @@
 		params.Set("customerAuthToken", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}/subscriptions")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1045,11 +1071,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "subscriptions")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1112,15 +1140,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/apps/reseller/v1sandbox/", "customers/{customerId}/subscriptions/{subscriptionId}/startPaidService")
-	urls = strings.Replace(urls, "{customerId}", cleanPathString(c.customerId), 1)
-	urls = strings.Replace(urls, "{subscriptionId}", cleanPathString(c.subscriptionId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{customerId}", url.QueryEscape(c.customerId), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{subscriptionId}", url.QueryEscape(c.subscriptionId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1158,12 +1188,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/shopping/v1/shopping-api.json b/shopping/v1/shopping-api.json
index 8e05a05..ccdfc84 100644
--- a/shopping/v1/shopping-api.json
+++ b/shopping/v1/shopping-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/WBsBLTRFwKkAJXQZTwvXsRM2Tzs\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/8h5zRwG8E182tUUu6UeRCYUBCfA\"",
  "discoveryVersion": "v1",
  "id": "shopping:v1",
  "name": "shopping",
  "version": "v1",
- "revision": "20130411",
+ "revision": "20130614",
  "title": "Search API For Shopping",
  "description": "Lets you search over product data.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -938,21 +940,6 @@
        "description": "Location used to determine tax and shipping",
        "location": "query"
       },
-      "plusOne.enabled": {
-       "type": "boolean",
-       "description": "Whether to return +1 button code",
-       "location": "query"
-      },
-      "plusOne.styles": {
-       "type": "string",
-       "description": "+1 button rendering styles",
-       "location": "query"
-      },
-      "plusOne.useGcsConfig": {
-       "type": "boolean",
-       "description": "Whether to use +1 button styles configured in the GCS account",
-       "location": "query"
-      },
       "productId": {
        "type": "string",
        "description": "Id of product",
@@ -1148,21 +1135,6 @@
        "format": "int32",
        "location": "query"
       },
-      "plusOne.enabled": {
-       "type": "boolean",
-       "description": "Whether to return +1 button code",
-       "location": "query"
-      },
-      "plusOne.styles": {
-       "type": "string",
-       "description": "+1 button rendering styles",
-       "location": "query"
-      },
-      "plusOne.useGcsConfig": {
-       "type": "boolean",
-       "description": "Whether to use +1 button styles configured in the GCS account",
-       "location": "query"
-      },
       "promotions.enabled": {
        "type": "boolean",
        "description": "Whether to return promotion information",
diff --git a/shopping/v1/shopping-gen.go b/shopping/v1/shopping-gen.go
index 633c3a3..73e71ed 100644
--- a/shopping/v1/shopping-gen.go
+++ b/shopping/v1/shopping-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "shopping:v1"
 const apiName = "shopping"
@@ -658,28 +661,6 @@
 	return c
 }
 
-// PlusOneEnabled sets the optional parameter "plusOne.enabled": Whether
-// to return +1 button code
-func (c *ProductsGetCall) PlusOneEnabled(plusOneEnabled bool) *ProductsGetCall {
-	c.opt_["plusOne.enabled"] = plusOneEnabled
-	return c
-}
-
-// PlusOneStyles sets the optional parameter "plusOne.styles": +1 button
-// rendering styles
-func (c *ProductsGetCall) PlusOneStyles(plusOneStyles string) *ProductsGetCall {
-	c.opt_["plusOne.styles"] = plusOneStyles
-	return c
-}
-
-// PlusOneUseGcsConfig sets the optional parameter
-// "plusOne.useGcsConfig": Whether to use +1 button styles configured in
-// the GCS account
-func (c *ProductsGetCall) PlusOneUseGcsConfig(plusOneUseGcsConfig bool) *ProductsGetCall {
-	c.opt_["plusOne.useGcsConfig"] = plusOneUseGcsConfig
-	return c
-}
-
 // RecommendationsEnabled sets the optional parameter
 // "recommendations.enabled": Whether to return recommendation
 // information
@@ -734,15 +715,6 @@
 	if v, ok := c.opt_["location"]; ok {
 		params.Set("location", fmt.Sprintf("%v", v))
 	}
-	if v, ok := c.opt_["plusOne.enabled"]; ok {
-		params.Set("plusOne.enabled", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["plusOne.styles"]; ok {
-		params.Set("plusOne.styles", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["plusOne.useGcsConfig"]; ok {
-		params.Set("plusOne.useGcsConfig", fmt.Sprintf("%v", v))
-	}
 	if v, ok := c.opt_["recommendations.enabled"]; ok {
 		params.Set("recommendations.enabled", fmt.Sprintf("%v", v))
 	}
@@ -759,17 +731,19 @@
 		params.Set("thumbnails", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/shopping/search/v1/", "{source}/products/{accountId}/{productIdType}/{productId}")
-	urls = strings.Replace(urls, "{source}", cleanPathString(c.source), 1)
-	urls = strings.Replace(urls, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
-	urls = strings.Replace(urls, "{productIdType}", cleanPathString(c.productIdType), 1)
-	urls = strings.Replace(urls, "{productId}", cleanPathString(c.productId), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{source}", url.QueryEscape(c.source), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{accountId}", strconv.FormatInt(c.accountId, 10), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productIdType}", url.QueryEscape(c.productIdType), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{productId}", url.QueryEscape(c.productId), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -821,21 +795,6 @@
 	//       "location": "query",
 	//       "type": "string"
 	//     },
-	//     "plusOne.enabled": {
-	//       "description": "Whether to return +1 button code",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     },
-	//     "plusOne.styles": {
-	//       "description": "+1 button rendering styles",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "plusOne.useGcsConfig": {
-	//       "description": "Whether to use +1 button styles configured in the GCS account",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     },
 	//     "productId": {
 	//       "description": "Id of product",
 	//       "location": "path",
@@ -1091,28 +1050,6 @@
 	return c
 }
 
-// PlusOneEnabled sets the optional parameter "plusOne.enabled": Whether
-// to return +1 button code
-func (c *ProductsListCall) PlusOneEnabled(plusOneEnabled bool) *ProductsListCall {
-	c.opt_["plusOne.enabled"] = plusOneEnabled
-	return c
-}
-
-// PlusOneStyles sets the optional parameter "plusOne.styles": +1 button
-// rendering styles
-func (c *ProductsListCall) PlusOneStyles(plusOneStyles string) *ProductsListCall {
-	c.opt_["plusOne.styles"] = plusOneStyles
-	return c
-}
-
-// PlusOneUseGcsConfig sets the optional parameter
-// "plusOne.useGcsConfig": Whether to use +1 button styles configured in
-// the GCS account
-func (c *ProductsListCall) PlusOneUseGcsConfig(plusOneUseGcsConfig bool) *ProductsListCall {
-	c.opt_["plusOne.useGcsConfig"] = plusOneUseGcsConfig
-	return c
-}
-
 // PromotionsEnabled sets the optional parameter "promotions.enabled":
 // Whether to return promotion information
 func (c *ProductsListCall) PromotionsEnabled(promotionsEnabled bool) *ProductsListCall {
@@ -1306,15 +1243,6 @@
 	if v, ok := c.opt_["maxVariants"]; ok {
 		params.Set("maxVariants", fmt.Sprintf("%v", v))
 	}
-	if v, ok := c.opt_["plusOne.enabled"]; ok {
-		params.Set("plusOne.enabled", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["plusOne.styles"]; ok {
-		params.Set("plusOne.styles", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["plusOne.useGcsConfig"]; ok {
-		params.Set("plusOne.useGcsConfig", fmt.Sprintf("%v", v))
-	}
 	if v, ok := c.opt_["promotions.enabled"]; ok {
 		params.Set("promotions.enabled", fmt.Sprintf("%v", v))
 	}
@@ -1364,14 +1292,16 @@
 		params.Set("useCase", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/shopping/search/v1/", "{source}/products")
-	urls = strings.Replace(urls, "{source}", cleanPathString(c.source), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{source}", url.QueryEscape(c.source), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1520,21 +1450,6 @@
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
-	//     "plusOne.enabled": {
-	//       "description": "Whether to return +1 button code",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     },
-	//     "plusOne.styles": {
-	//       "description": "+1 button rendering styles",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "plusOne.useGcsConfig": {
-	//       "description": "Whether to use +1 button styles configured in the GCS account",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     },
 	//     "promotions.enabled": {
 	//       "description": "Whether to return promotion information",
 	//       "location": "query",
@@ -1633,12 +1548,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/siteverification/v1/siteverification-api.json b/siteverification/v1/siteverification-api.json
index 42337b4..49e2108 100644
--- a/siteverification/v1/siteverification-api.json
+++ b/siteverification/v1/siteverification-api.json
@@ -1,18 +1,20 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/FwUbYZ1HxhUxMqyAuFUXlQjngA0\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/LuXw4v8oS7QpglGSjHBg6AvJ67w\"",
  "discoveryVersion": "v1",
  "id": "siteVerification:v1",
  "name": "siteVerification",
  "version": "v1",
- "revision": "20120806",
+ "revision": "20130404",
  "title": "Google Site Verification API",
  "description": "Lets you programatically verify ownership of websites or domains with Google.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
  },
- "documentationLink": "http://code.google.com/apis/siteverification/",
+ "documentationLink": "https://developers.google.com/site-verification/",
  "protocol": "rest",
  "baseUrl": "https://www.googleapis.com/siteVerification/v1/",
  "basePath": "/siteVerification/v1/",
diff --git a/siteverification/v1/siteverification-gen.go b/siteverification/v1/siteverification-gen.go
index 594ee30..035b7ee 100644
--- a/siteverification/v1/siteverification-gen.go
+++ b/siteverification/v1/siteverification-gen.go
@@ -1,6 +1,6 @@
 // Package siteverification provides access to the Google Site Verification API.
 //
-// See http://code.google.com/apis/siteverification/
+// See https://developers.google.com/site-verification/
 //
 // Usage example:
 //
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "siteVerification:v1"
 const apiName = "siteVerification"
@@ -153,14 +156,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/siteVerification/v1/", "webResource/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -208,14 +213,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/siteVerification/v1/", "webResource/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -278,12 +285,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/siteVerification/v1/", "token")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -341,12 +350,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/siteVerification/v1/", "webResource")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -405,11 +416,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/siteVerification/v1/", "webResource")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -461,15 +474,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/siteVerification/v1/", "webResource/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -534,15 +549,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/siteVerification/v1/", "webResource/{id}")
-	urls = strings.Replace(urls, "{id}", cleanPathString(c.id), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{id}", url.QueryEscape(c.id), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -579,12 +596,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/sqladmin/v1beta1/sqladmin-api.json b/sqladmin/v1beta1/sqladmin-api.json
new file mode 100644
index 0000000..923269a
--- /dev/null
+++ b/sqladmin/v1beta1/sqladmin-api.json
@@ -0,0 +1,1184 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/z8RXmU79UwCvuLVEvj9O1__KRi0\"",
+ "discoveryVersion": "v1",
+ "id": "sqladmin:v1beta1",
+ "name": "sqladmin",
+ "canonicalName": "SQL Admin",
+ "version": "v1beta1",
+ "revision": "20130525",
+ "title": "Cloud SQL Administration API",
+ "description": "API for Cloud SQL database instance management.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "icons": {
+  "x16": "http://www.google.com/images/icons/product/search-16.gif",
+  "x32": "http://www.google.com/images/icons/product/search-32.gif"
+ },
+ "documentationLink": "https://developers.google.com/cloud-sql/docs/admin-api/",
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/sql/v1beta1/",
+ "basePath": "/sql/v1beta1/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "sql/v1beta1/",
+ "batchPath": "batch",
+ "parameters": {
+  "alt": {
+   "type": "string",
+   "description": "Data format for the response.",
+   "default": "json",
+   "enum": [
+    "json"
+   ],
+   "enumDescriptions": [
+    "Responses with Content-Type of application/json"
+   ],
+   "location": "query"
+  },
+  "fields": {
+   "type": "string",
+   "description": "Selector specifying which fields to include in a partial response.",
+   "location": "query"
+  },
+  "key": {
+   "type": "string",
+   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+   "location": "query"
+  },
+  "oauth_token": {
+   "type": "string",
+   "description": "OAuth 2.0 token for the current user.",
+   "location": "query"
+  },
+  "prettyPrint": {
+   "type": "boolean",
+   "description": "Returns response with indentations and line breaks.",
+   "default": "true",
+   "location": "query"
+  },
+  "quotaUser": {
+   "type": "string",
+   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+   "location": "query"
+  },
+  "userIp": {
+   "type": "string",
+   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+   "location": "query"
+  }
+ },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/cloud-platform": {
+     "description": "MESSAGE UNDER CONSTRUCTION View and manage your data across Google Cloud Platform services"
+    },
+    "https://www.googleapis.com/auth/sqlservice.admin": {
+     "description": "Manage your Google SQL Service instances"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "BackupConfiguration": {
+   "id": "BackupConfiguration",
+   "type": "object",
+   "description": "Database instance backup configuration.",
+   "properties": {
+    "enabled": {
+     "type": "boolean",
+     "description": "Whether this configuration is enabled."
+    },
+    "id": {
+     "type": "string",
+     "description": "Identifier for this configuration. This gets generated automatically when a backup configuration is created."
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#backupConfiguration.",
+     "default": "sql#backupConfiguration"
+    },
+    "startTime": {
+     "type": "string",
+     "description": "Start time for the daily backup configuration in UTC timezone in the 24 hour format - HH:MM."
+    }
+   }
+  },
+  "BackupRun": {
+   "id": "BackupRun",
+   "type": "object",
+   "description": "A database instance backup run resource.",
+   "properties": {
+    "backupConfiguration": {
+     "type": "string",
+     "description": "Backup Configuration identifier."
+    },
+    "dueTime": {
+     "type": "string",
+     "description": "The due time of this run in UTC timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+     "format": "date-time"
+    },
+    "endTime": {
+     "type": "string",
+     "description": "The time the backup operation completed in UTC timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+     "format": "date-time"
+    },
+    "enqueuedTime": {
+     "type": "string",
+     "description": "The time the run was enqueued in UTC timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+     "format": "date-time"
+    },
+    "error": {
+     "$ref": "OperationError",
+     "description": "Information about why the backup operation failed. This is only present if the run has the FAILED status."
+    },
+    "instance": {
+     "type": "string",
+     "description": "Name of the database instance."
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#backupRun.",
+     "default": "sql#backupRun"
+    },
+    "startTime": {
+     "type": "string",
+     "description": "The time the backup operation actually started in UTC timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+     "format": "date-time"
+    },
+    "status": {
+     "type": "string",
+     "description": "The status of this run."
+    }
+   }
+  },
+  "BackupRunsListResponse": {
+   "id": "BackupRunsListResponse",
+   "type": "object",
+   "description": "Backup run list results.",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "A list of backup runs in reverse chronological order of the enqueued time.",
+     "items": {
+      "$ref": "BackupRun"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#backupRunsList.",
+     "default": "sql#backupRunsList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
+    }
+   }
+  },
+  "DatabaseInstance": {
+   "id": "DatabaseInstance",
+   "type": "object",
+   "description": "A database instance resource.",
+   "properties": {
+    "currentDiskSize": {
+     "type": "string",
+     "description": "The current disk usage of the instance in bytes.",
+     "format": "int64"
+    },
+    "databaseVersion": {
+     "type": "string",
+     "description": "The database engine type and version, for example MYSQL_5_5 for MySQL 5.5."
+    },
+    "etag": {
+     "type": "string",
+     "description": "Etag for this resource - a version number for the settings object in this resource. This field has no effect when passed as a request parameter. Instead, the contents of this field should be passed in an 'If-Match' http header for use in optimistic locking.",
+     "annotations": {
+      "required": [
+       "sql.instances.update"
+      ]
+     }
+    },
+    "instance": {
+     "type": "string",
+     "description": "Name of the database instance. This does not include the project ID.",
+     "annotations": {
+      "required": [
+       "sql.instances.insert",
+       "sql.instances.update"
+      ]
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instance.",
+     "default": "sql#instance"
+    },
+    "maxDiskSize": {
+     "type": "string",
+     "description": "The maximum disk size of the instance in bytes.",
+     "format": "int64"
+    },
+    "project": {
+     "type": "string",
+     "description": "The project ID of the project containing the database instance. The Google apps domain is prefixed if applicable. You can find this on the project summary page of the Google APIs Console.",
+     "annotations": {
+      "required": [
+       "sql.instances.insert",
+       "sql.instances.update"
+      ]
+     }
+    },
+    "region": {
+     "type": "string",
+     "description": "The geographical region. Can be us-east1 or europe-west1. Defaults to us-east1. The region can not be changed after instance creation."
+    },
+    "settings": {
+     "$ref": "Settings",
+     "description": "The user settings."
+    },
+    "state": {
+     "type": "string",
+     "description": "The current serving state of the database instance. This can be one of the following.\nRUNNABLE: The instance is running, or is ready to run when accessed.\nSUSPENDED: The instance is not available, for example due to problems with billing.\nPENDING_CREATE: The instance is being created.\nMAINTENANCE: The instance is down for maintenance.\nUNKNOWN_STATE: The state of the instance is unknown."
+    }
+   }
+  },
+  "ExportContext": {
+   "id": "ExportContext",
+   "type": "object",
+   "description": "Database instance export context.",
+   "properties": {
+    "database": {
+     "type": "array",
+     "description": "Databases (for example, guestbook) from which the export is made. If unspecified, all databases are exported.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#exportContext.",
+     "default": "sql#exportContext"
+    },
+    "table": {
+     "type": "array",
+     "description": "Tables to export, or that were exported, from the specified database. If you specify tables, specify one and only one database.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "uri": {
+     "type": "string",
+     "description": "The path to the file in Google Cloud Storage where the export will be stored, or where it was already stored. The URI is in the form gs://bucketName/fileName. If the file already exists, the operation fails. If the filename ends with .gz, the contents are compressed."
+    }
+   }
+  },
+  "ImportContext": {
+   "id": "ImportContext",
+   "type": "object",
+   "description": "Database instance import context.",
+   "properties": {
+    "database": {
+     "type": "string",
+     "description": "The database (for example, guestbook) to which the import is made. If not set, it is assumed that the database is specified in the file to be imported."
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#importContext.",
+     "default": "sql#importContext"
+    },
+    "uri": {
+     "type": "array",
+     "description": "A path to the MySQL dump file in Google Cloud Storage from which the import is made. The URI is in the form gs://bucketName/fileName. Compressed gzip files (.gz) are also supported.",
+     "items": {
+      "type": "string"
+     }
+    }
+   }
+  },
+  "InstanceOperation": {
+   "id": "InstanceOperation",
+   "type": "object",
+   "description": "An Operations resource contains information about database instance operations such as create, delete, and restart. Operations resources are created in response to operations that were initiated; you never create them directly.",
+   "properties": {
+    "endTime": {
+     "type": "string",
+     "description": "The time this operation finished in UTC timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+     "format": "date-time"
+    },
+    "enqueuedTime": {
+     "type": "string",
+     "description": "The time this operation was enqueued in UTC timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+     "format": "date-time"
+    },
+    "error": {
+     "type": "array",
+     "description": "The error(s) encountered by this operation. Only set if the operation results in an error.",
+     "items": {
+      "$ref": "OperationError"
+     }
+    },
+    "exportContext": {
+     "$ref": "ExportContext",
+     "description": "The context for export operation, if applicable."
+    },
+    "importContext": {
+     "$ref": "ImportContext",
+     "description": "The context for import operation, if applicable."
+    },
+    "instance": {
+     "type": "string",
+     "description": "Name of the database instance."
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instanceOperation.",
+     "default": "sql#instanceOperation"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation."
+    },
+    "operationType": {
+     "type": "string",
+     "description": "The type of the operation. Valid values are CREATE, DELETE, UPDATE, RESTART, IMPORT, EXPORT, BACKUP_VOLUME, RESTORE_VOLUME."
+    },
+    "startTime": {
+     "type": "string",
+     "description": "The time this operation actually started in UTC timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+     "format": "date-time"
+    },
+    "state": {
+     "type": "string",
+     "description": "The state of an operation. Valid values are PENDING, RUNNING, DONE, UNKNOWN."
+    },
+    "userEmailAddress": {
+     "type": "string",
+     "description": "The email address of the user who initiated this operation."
+    }
+   }
+  },
+  "InstancesDeleteResponse": {
+   "id": "InstancesDeleteResponse",
+   "type": "object",
+   "description": "Database instance delete response.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesDelete.",
+     "default": "sql#instancesDelete"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation."
+    }
+   }
+  },
+  "InstancesExportRequest": {
+   "id": "InstancesExportRequest",
+   "type": "object",
+   "description": "Database instance export request.",
+   "properties": {
+    "exportContext": {
+     "$ref": "ExportContext",
+     "description": "Contains details about the export operation."
+    }
+   }
+  },
+  "InstancesExportResponse": {
+   "id": "InstancesExportResponse",
+   "type": "object",
+   "description": "Database instance export response.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesExport.",
+     "default": "sql#instancesExport"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation."
+    }
+   }
+  },
+  "InstancesImportRequest": {
+   "id": "InstancesImportRequest",
+   "type": "object",
+   "description": "Database instance import request.",
+   "properties": {
+    "importContext": {
+     "$ref": "ImportContext",
+     "description": "Contains details about the import operation."
+    }
+   }
+  },
+  "InstancesImportResponse": {
+   "id": "InstancesImportResponse",
+   "type": "object",
+   "description": "Database instance import response.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesImport.",
+     "default": "sql#instancesImport"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation."
+    }
+   }
+  },
+  "InstancesInsertResponse": {
+   "id": "InstancesInsertResponse",
+   "type": "object",
+   "description": "Database instance insert response.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesInsert.",
+     "default": "sql#instancesInsert"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation."
+    }
+   }
+  },
+  "InstancesListResponse": {
+   "id": "InstancesListResponse",
+   "type": "object",
+   "description": "Database instances list response.",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "List of database instance resources.",
+     "items": {
+      "$ref": "DatabaseInstance"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesList.",
+     "default": "sql#instancesList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
+    }
+   }
+  },
+  "InstancesRestartResponse": {
+   "id": "InstancesRestartResponse",
+   "type": "object",
+   "description": "Database instance restart response.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesRestart.",
+     "default": "sql#instancesRestart"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation."
+    }
+   }
+  },
+  "InstancesRestoreBackupResponse": {
+   "id": "InstancesRestoreBackupResponse",
+   "type": "object",
+   "description": "Database instance restore backup response.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesRestoreBackup.",
+     "default": "sql#instancesRestoreBackup"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve the Operations resource that has information about the operation."
+    }
+   }
+  },
+  "InstancesUpdateResponse": {
+   "id": "InstancesUpdateResponse",
+   "type": "object",
+   "description": "Database instance update response.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#instancesUpdate.",
+     "default": "sql#instancesUpdate"
+    },
+    "operation": {
+     "type": "string",
+     "description": "An identifier that uniquely identifies the operation. You can use this identifier to retrieve information about the operation."
+    }
+   }
+  },
+  "OperationError": {
+   "id": "OperationError",
+   "type": "object",
+   "description": "Database instance operation error.",
+   "properties": {
+    "code": {
+     "type": "string",
+     "description": "Identifies the specific error that occurred."
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#operationError.",
+     "default": "sql#operationError"
+    }
+   }
+  },
+  "OperationsListResponse": {
+   "id": "OperationsListResponse",
+   "type": "object",
+   "description": "Database instance list operations response.",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "List of operation resources.",
+     "items": {
+      "$ref": "InstanceOperation"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#operationsList.",
+     "default": "sql#operationsList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results."
+    }
+   }
+  },
+  "Settings": {
+   "id": "Settings",
+   "type": "object",
+   "description": "Database instance settings.",
+   "properties": {
+    "activationPolicy": {
+     "type": "string",
+     "description": "The activation policy for this instance. This specifies when the instance should be activated and is applicable only when the instance state is RUNNABLE. This can be one of the following.\nALWAYS: The instance should always be active.\nNEVER: The instance should never be activated.\nON_DEMAND: The instance is activated upon receiving requests."
+    },
+    "authorizedGaeApplications": {
+     "type": "array",
+     "description": "The AppEngine app ids that can access this instance.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "backupConfiguration": {
+     "type": "array",
+     "description": "The daily backup configuration for the instance.",
+     "items": {
+      "$ref": "BackupConfiguration"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#settings.",
+     "default": "sql#settings"
+    },
+    "pricingPlan": {
+     "type": "string",
+     "description": "The pricing plan for this instance. This can be either PER_USE or PACKAGE."
+    },
+    "replicationType": {
+     "type": "string",
+     "description": "The type of replication this instance uses. This can be either ASYNCHRONOUS or SYNCHRONOUS."
+    },
+    "tier": {
+     "type": "string",
+     "description": "The tier of service for this instance, for example D1, D2. For more information, see pricing.",
+     "annotations": {
+      "required": [
+       "sql.instances.insert",
+       "sql.instances.update"
+      ]
+     }
+    }
+   }
+  },
+  "Tier": {
+   "id": "Tier",
+   "type": "object",
+   "description": "A Google Cloud SQL service tier resource.",
+   "properties": {
+    "DiskQuota": {
+     "type": "string",
+     "description": "The maximum disk size of this tier in bytes.",
+     "format": "int64"
+    },
+    "RAM": {
+     "type": "string",
+     "description": "The maximum RAM usage of this tier in bytes.",
+     "format": "int64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#tier.",
+     "default": "sql#tier"
+    },
+    "region": {
+     "type": "array",
+     "description": "The applicable regions for this tier. Can be us-east1 and europe-west1.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "tier": {
+     "type": "string",
+     "description": "An identifier for the service tier, for example D1, D2 etc. For related information, see Pricing."
+    }
+   }
+  },
+  "TiersListResponse": {
+   "id": "TiersListResponse",
+   "type": "object",
+   "description": "Tiers list response.",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "List of tiers.",
+     "items": {
+      "$ref": "Tier"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "This is always sql#tiersList.",
+     "default": "sql#tiersList"
+    }
+   }
+  }
+ },
+ "resources": {
+  "backupRuns": {
+   "methods": {
+    "get": {
+     "id": "sql.backupRuns.get",
+     "path": "projects/{project}/instances/{instance}/backupRuns/{backupConfiguration}",
+     "httpMethod": "GET",
+     "description": "Retrieves a resource containing information about a backup run.",
+     "parameters": {
+      "backupConfiguration": {
+       "type": "string",
+       "description": "Identifier for the backup configuration. This gets generated automatically when a backup configuration is created.",
+       "required": true,
+       "location": "path"
+      },
+      "dueTime": {
+       "type": "string",
+       "description": "The time when this run is due to start in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+       "required": true,
+       "location": "query"
+      },
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance",
+      "backupConfiguration",
+      "dueTime"
+     ],
+     "response": {
+      "$ref": "BackupRun"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "list": {
+     "id": "sql.backupRuns.list",
+     "path": "projects/{project}/instances/{instance}/backupRuns",
+     "httpMethod": "GET",
+     "description": "Lists all backup runs associated with a given instance and configuration in the reverse chronological order of the enqueued time.",
+     "parameters": {
+      "backupConfiguration": {
+       "type": "string",
+       "description": "Identifier for the backup configuration. This gets generated automatically when a backup configuration is created.",
+       "required": true,
+       "location": "query"
+      },
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of backup runs per response.",
+       "format": "int32",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A previously-returned page token representing part of the larger set of results to view.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance",
+      "backupConfiguration"
+     ],
+     "response": {
+      "$ref": "BackupRunsListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    }
+   }
+  },
+  "instances": {
+   "methods": {
+    "delete": {
+     "id": "sql.instances.delete",
+     "path": "projects/{project}/instances/{instance}",
+     "httpMethod": "DELETE",
+     "description": "Deletes a database instance.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance to be deleted. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "response": {
+      "$ref": "InstancesDeleteResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "export": {
+     "id": "sql.instances.export",
+     "path": "projects/{project}/instances/{instance}/export",
+     "httpMethod": "POST",
+     "description": "Exports data from a database instance to a Google Cloud Storage bucket as a MySQL dump file.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance to be exported. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "request": {
+      "$ref": "InstancesExportRequest"
+     },
+     "response": {
+      "$ref": "InstancesExportResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform"
+     ]
+    },
+    "get": {
+     "id": "sql.instances.get",
+     "path": "projects/{project}/instances/{instance}",
+     "httpMethod": "GET",
+     "description": "Retrieves a resource containing information about a database instance.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "response": {
+      "$ref": "DatabaseInstance"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "import": {
+     "id": "sql.instances.import",
+     "path": "projects/{project}/instances/{instance}/import",
+     "httpMethod": "POST",
+     "description": "Imports data into a database instance from a MySQL dump file in Google Cloud Storage.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "request": {
+      "$ref": "InstancesImportRequest"
+     },
+     "response": {
+      "$ref": "InstancesImportResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform"
+     ]
+    },
+    "insert": {
+     "id": "sql.instances.insert",
+     "path": "projects/{project}/instances",
+     "httpMethod": "POST",
+     "description": "Creates a new database instance.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project to which the newly created database instances should belong. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "request": {
+      "$ref": "DatabaseInstance"
+     },
+     "response": {
+      "$ref": "InstancesInsertResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "list": {
+     "id": "sql.instances.list",
+     "path": "projects/{project}/instances",
+     "httpMethod": "GET",
+     "description": "Lists instances under a given project in the alphabetical order of the instance name.",
+     "parameters": {
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of results to return per response.",
+       "format": "uint32",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A previously-returned page token representing part of the larger set of results to view.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project for which to list database instances. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "InstancesListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "patch": {
+     "id": "sql.instances.patch",
+     "path": "projects/{project}/instances/{instance}",
+     "httpMethod": "PATCH",
+     "description": "Updates settings of a database instance. Caution: This is not a partial update, so you must include values for all the settings that you want to retain. For partial updates, use patch.. This method supports patch semantics.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "request": {
+      "$ref": "DatabaseInstance"
+     },
+     "response": {
+      "$ref": "InstancesUpdateResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "restart": {
+     "id": "sql.instances.restart",
+     "path": "projects/{project}/instances/{instance}/restart",
+     "httpMethod": "POST",
+     "description": "Restarts a database instance.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance to be restarted. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "response": {
+      "$ref": "InstancesRestartResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "restoreBackup": {
+     "id": "sql.instances.restoreBackup",
+     "path": "projects/{project}/instances/{instance}/restoreBackup",
+     "httpMethod": "POST",
+     "description": "Restores a backup of a database instance.",
+     "parameters": {
+      "backupConfiguration": {
+       "type": "string",
+       "description": "The identifier of the backup configuration. This gets generated automatically when a backup configuration is created.",
+       "required": true,
+       "location": "query"
+      },
+      "dueTime": {
+       "type": "string",
+       "description": "The time when this run is due to start in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+       "required": true,
+       "location": "query"
+      },
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance",
+      "backupConfiguration",
+      "dueTime"
+     ],
+     "response": {
+      "$ref": "InstancesRestoreBackupResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "update": {
+     "id": "sql.instances.update",
+     "path": "projects/{project}/instances/{instance}",
+     "httpMethod": "PUT",
+     "description": "Updates settings of a database instance. Caution: This is not a partial update, so you must include values for all the settings that you want to retain. For partial updates, use patch.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "etagRequired": true,
+     "request": {
+      "$ref": "DatabaseInstance"
+     },
+     "response": {
+      "$ref": "InstancesUpdateResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    }
+   }
+  },
+  "operations": {
+   "methods": {
+    "get": {
+     "id": "sql.operations.get",
+     "path": "projects/{project}/instances/{instance}/operations/{operation}",
+     "httpMethod": "GET",
+     "description": "Retrieves an instance operation that has been performed on an instance.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "operation": {
+       "type": "string",
+       "description": "Instance operation ID.",
+       "required": true,
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance",
+      "operation"
+     ],
+     "response": {
+      "$ref": "InstanceOperation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    },
+    "list": {
+     "id": "sql.operations.list",
+     "path": "projects/{project}/instances/{instance}/operations",
+     "httpMethod": "GET",
+     "description": "Lists all instance operations that have been performed on the given database instance in the reverse chronological order of the start time.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Database instance ID. This does not include the project ID.",
+       "required": true,
+       "location": "path"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "Maximum number of operations per response.",
+       "format": "uint32",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "A previously-returned page token representing part of the larger set of results to view.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "instance"
+     ],
+     "response": {
+      "$ref": "OperationsListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    }
+   }
+  },
+  "tiers": {
+   "methods": {
+    "list": {
+     "id": "sql.tiers.list",
+     "path": "tiers",
+     "httpMethod": "GET",
+     "description": "Lists all available service tiers for Google Cloud SQL, for example D1, D2. For related information, see Pricing.",
+     "response": {
+      "$ref": "TiersListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/sqlservice.admin"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/sqladmin/v1beta1/sqladmin-gen.go b/sqladmin/v1beta1/sqladmin-gen.go
new file mode 100644
index 0000000..d5ccbc0
--- /dev/null
+++ b/sqladmin/v1beta1/sqladmin-gen.go
@@ -0,0 +1,1776 @@
+// Package sqladmin provides access to the Cloud SQL Administration API.
+//
+// See https://developers.google.com/cloud-sql/docs/admin-api/
+//
+// Usage example:
+//
+//   import "code.google.com/p/google-api-go-client/sqladmin/v1beta1"
+//   ...
+//   sqladminService, err := sqladmin.New(oauthHttpClient)
+package sqladmin
+
+import (
+	"bytes"
+	"code.google.com/p/google-api-go-client/googleapi"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+
+const apiId = "sqladmin:v1beta1"
+const apiName = "sqladmin"
+const apiVersion = "v1beta1"
+const basePath = "https://www.googleapis.com/sql/v1beta1/"
+
+// OAuth2 scopes used by this API.
+const (
+	// MESSAGE UNDER CONSTRUCTION View and manage your data across Google
+	// Cloud Platform services
+	CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform"
+
+	// Manage your Google SQL Service instances
+	SqlserviceAdminScope = "https://www.googleapis.com/auth/sqlservice.admin"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client}
+	s.BackupRuns = NewBackupRunsService(s)
+	s.Instances = NewInstancesService(s)
+	s.Operations = NewOperationsService(s)
+	s.Tiers = NewTiersService(s)
+	return s, nil
+}
+
+type Service struct {
+	client *http.Client
+
+	BackupRuns *BackupRunsService
+
+	Instances *InstancesService
+
+	Operations *OperationsService
+
+	Tiers *TiersService
+}
+
+func NewBackupRunsService(s *Service) *BackupRunsService {
+	rs := &BackupRunsService{s: s}
+	return rs
+}
+
+type BackupRunsService struct {
+	s *Service
+}
+
+func NewInstancesService(s *Service) *InstancesService {
+	rs := &InstancesService{s: s}
+	return rs
+}
+
+type InstancesService struct {
+	s *Service
+}
+
+func NewOperationsService(s *Service) *OperationsService {
+	rs := &OperationsService{s: s}
+	return rs
+}
+
+type OperationsService struct {
+	s *Service
+}
+
+func NewTiersService(s *Service) *TiersService {
+	rs := &TiersService{s: s}
+	return rs
+}
+
+type TiersService struct {
+	s *Service
+}
+
+type BackupConfiguration struct {
+	// Enabled: Whether this configuration is enabled.
+	Enabled bool `json:"enabled,omitempty"`
+
+	// Id: Identifier for this configuration. This gets generated
+	// automatically when a backup configuration is created.
+	Id string `json:"id,omitempty"`
+
+	// Kind: This is always sql#backupConfiguration.
+	Kind string `json:"kind,omitempty"`
+
+	// StartTime: Start time for the daily backup configuration in UTC
+	// timezone in the 24 hour format - HH:MM.
+	StartTime string `json:"startTime,omitempty"`
+}
+
+type BackupRun struct {
+	// BackupConfiguration: Backup Configuration identifier.
+	BackupConfiguration string `json:"backupConfiguration,omitempty"`
+
+	// DueTime: The due time of this run in UTC timezone in RFC 3339 format,
+	// for example 2012-11-15T16:19:00.094Z.
+	DueTime string `json:"dueTime,omitempty"`
+
+	// EndTime: The time the backup operation completed in UTC timezone in
+	// RFC 3339 format, for example 2012-11-15T16:19:00.094Z.
+	EndTime string `json:"endTime,omitempty"`
+
+	// EnqueuedTime: The time the run was enqueued in UTC timezone in RFC
+	// 3339 format, for example 2012-11-15T16:19:00.094Z.
+	EnqueuedTime string `json:"enqueuedTime,omitempty"`
+
+	// Error: Information about why the backup operation failed. This is
+	// only present if the run has the FAILED status.
+	Error *OperationError `json:"error,omitempty"`
+
+	// Instance: Name of the database instance.
+	Instance string `json:"instance,omitempty"`
+
+	// Kind: This is always sql#backupRun.
+	Kind string `json:"kind,omitempty"`
+
+	// StartTime: The time the backup operation actually started in UTC
+	// timezone in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.
+	StartTime string `json:"startTime,omitempty"`
+
+	// Status: The status of this run.
+	Status string `json:"status,omitempty"`
+}
+
+type BackupRunsListResponse struct {
+	// Items: A list of backup runs in reverse chronological order of the
+	// enqueued time.
+	Items []*BackupRun `json:"items,omitempty"`
+
+	// Kind: This is always sql#backupRunsList.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: The continuation token, used to page through large
+	// result sets. Provide this value in a subsequent request to return the
+	// next page of results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type DatabaseInstance struct {
+	// CurrentDiskSize: The current disk usage of the instance in bytes.
+	CurrentDiskSize int64 `json:"currentDiskSize,omitempty,string"`
+
+	// DatabaseVersion: The database engine type and version, for example
+	// MYSQL_5_5 for MySQL 5.5.
+	DatabaseVersion string `json:"databaseVersion,omitempty"`
+
+	// Etag: Etag for this resource - a version number for the settings
+	// object in this resource. This field has no effect when passed as a
+	// request parameter. Instead, the contents of this field should be
+	// passed in an 'If-Match' http header for use in optimistic locking.
+	Etag string `json:"etag,omitempty"`
+
+	// Instance: Name of the database instance. This does not include the
+	// project ID.
+	Instance string `json:"instance,omitempty"`
+
+	// Kind: This is always sql#instance.
+	Kind string `json:"kind,omitempty"`
+
+	// MaxDiskSize: The maximum disk size of the instance in bytes.
+	MaxDiskSize int64 `json:"maxDiskSize,omitempty,string"`
+
+	// Project: The project ID of the project containing the database
+	// instance. The Google apps domain is prefixed if applicable. You can
+	// find this on the project summary page of the Google APIs Console.
+	Project string `json:"project,omitempty"`
+
+	// Region: The geographical region. Can be us-east1 or europe-west1.
+	// Defaults to us-east1. The region can not be changed after instance
+	// creation.
+	Region string `json:"region,omitempty"`
+
+	// Settings: The user settings.
+	Settings *Settings `json:"settings,omitempty"`
+
+	// State: The current serving state of the database instance. This can
+	// be one of the following.
+	// RUNNABLE: The instance is running, or is
+	// ready to run when accessed.
+	// SUSPENDED: The instance is not available,
+	// for example due to problems with billing.
+	// PENDING_CREATE: The
+	// instance is being created.
+	// MAINTENANCE: The instance is down for
+	// maintenance.
+	// UNKNOWN_STATE: The state of the instance is unknown.
+	State string `json:"state,omitempty"`
+}
+
+type ExportContext struct {
+	// Database: Databases (for example, guestbook) from which the export is
+	// made. If unspecified, all databases are exported.
+	Database []string `json:"database,omitempty"`
+
+	// Kind: This is always sql#exportContext.
+	Kind string `json:"kind,omitempty"`
+
+	// Table: Tables to export, or that were exported, from the specified
+	// database. If you specify tables, specify one and only one database.
+	Table []string `json:"table,omitempty"`
+
+	// Uri: The path to the file in Google Cloud Storage where the export
+	// will be stored, or where it was already stored. The URI is in the
+	// form gs://bucketName/fileName. If the file already exists, the
+	// operation fails. If the filename ends with .gz, the contents are
+	// compressed.
+	Uri string `json:"uri,omitempty"`
+}
+
+type ImportContext struct {
+	// Database: The database (for example, guestbook) to which the import
+	// is made. If not set, it is assumed that the database is specified in
+	// the file to be imported.
+	Database string `json:"database,omitempty"`
+
+	// Kind: This is always sql#importContext.
+	Kind string `json:"kind,omitempty"`
+
+	// Uri: A path to the MySQL dump file in Google Cloud Storage from which
+	// the import is made. The URI is in the form gs://bucketName/fileName.
+	// Compressed gzip files (.gz) are also supported.
+	Uri []string `json:"uri,omitempty"`
+}
+
+type InstanceOperation struct {
+	// EndTime: The time this operation finished in UTC timezone in RFC 3339
+	// format, for example 2012-11-15T16:19:00.094Z.
+	EndTime string `json:"endTime,omitempty"`
+
+	// EnqueuedTime: The time this operation was enqueued in UTC timezone in
+	// RFC 3339 format, for example 2012-11-15T16:19:00.094Z.
+	EnqueuedTime string `json:"enqueuedTime,omitempty"`
+
+	// Error: The error(s) encountered by this operation. Only set if the
+	// operation results in an error.
+	Error []*OperationError `json:"error,omitempty"`
+
+	// ExportContext: The context for export operation, if applicable.
+	ExportContext *ExportContext `json:"exportContext,omitempty"`
+
+	// ImportContext: The context for import operation, if applicable.
+	ImportContext *ImportContext `json:"importContext,omitempty"`
+
+	// Instance: Name of the database instance.
+	Instance string `json:"instance,omitempty"`
+
+	// Kind: This is always sql#instanceOperation.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve the Operations resource that has
+	// information about the operation.
+	Operation string `json:"operation,omitempty"`
+
+	// OperationType: The type of the operation. Valid values are CREATE,
+	// DELETE, UPDATE, RESTART, IMPORT, EXPORT, BACKUP_VOLUME,
+	// RESTORE_VOLUME.
+	OperationType string `json:"operationType,omitempty"`
+
+	// StartTime: The time this operation actually started in UTC timezone
+	// in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.
+	StartTime string `json:"startTime,omitempty"`
+
+	// State: The state of an operation. Valid values are PENDING, RUNNING,
+	// DONE, UNKNOWN.
+	State string `json:"state,omitempty"`
+
+	// UserEmailAddress: The email address of the user who initiated this
+	// operation.
+	UserEmailAddress string `json:"userEmailAddress,omitempty"`
+}
+
+type InstancesDeleteResponse struct {
+	// Kind: This is always sql#instancesDelete.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve the Operations resource that has
+	// information about the operation.
+	Operation string `json:"operation,omitempty"`
+}
+
+type InstancesExportRequest struct {
+	// ExportContext: Contains details about the export operation.
+	ExportContext *ExportContext `json:"exportContext,omitempty"`
+}
+
+type InstancesExportResponse struct {
+	// Kind: This is always sql#instancesExport.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve the Operations resource that has
+	// information about the operation.
+	Operation string `json:"operation,omitempty"`
+}
+
+type InstancesImportRequest struct {
+	// ImportContext: Contains details about the import operation.
+	ImportContext *ImportContext `json:"importContext,omitempty"`
+}
+
+type InstancesImportResponse struct {
+	// Kind: This is always sql#instancesImport.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve the Operations resource that has
+	// information about the operation.
+	Operation string `json:"operation,omitempty"`
+}
+
+type InstancesInsertResponse struct {
+	// Kind: This is always sql#instancesInsert.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve the Operations resource that has
+	// information about the operation.
+	Operation string `json:"operation,omitempty"`
+}
+
+type InstancesListResponse struct {
+	// Items: List of database instance resources.
+	Items []*DatabaseInstance `json:"items,omitempty"`
+
+	// Kind: This is always sql#instancesList.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: The continuation token, used to page through large
+	// result sets. Provide this value in a subsequent request to return the
+	// next page of results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type InstancesRestartResponse struct {
+	// Kind: This is always sql#instancesRestart.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve the Operations resource that has
+	// information about the operation.
+	Operation string `json:"operation,omitempty"`
+}
+
+type InstancesRestoreBackupResponse struct {
+	// Kind: This is always sql#instancesRestoreBackup.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve the Operations resource that has
+	// information about the operation.
+	Operation string `json:"operation,omitempty"`
+}
+
+type InstancesUpdateResponse struct {
+	// Kind: This is always sql#instancesUpdate.
+	Kind string `json:"kind,omitempty"`
+
+	// Operation: An identifier that uniquely identifies the operation. You
+	// can use this identifier to retrieve information about the operation.
+	Operation string `json:"operation,omitempty"`
+}
+
+type OperationError struct {
+	// Code: Identifies the specific error that occurred.
+	Code string `json:"code,omitempty"`
+
+	// Kind: This is always sql#operationError.
+	Kind string `json:"kind,omitempty"`
+}
+
+type OperationsListResponse struct {
+	// Items: List of operation resources.
+	Items []*InstanceOperation `json:"items,omitempty"`
+
+	// Kind: This is always sql#operationsList.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: The continuation token, used to page through large
+	// result sets. Provide this value in a subsequent request to return the
+	// next page of results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+}
+
+type Settings struct {
+	// ActivationPolicy: The activation policy for this instance. This
+	// specifies when the instance should be activated and is applicable
+	// only when the instance state is RUNNABLE. This can be one of the
+	// following.
+	// ALWAYS: The instance should always be active.
+	// NEVER: The
+	// instance should never be activated.
+	// ON_DEMAND: The instance is
+	// activated upon receiving requests.
+	ActivationPolicy string `json:"activationPolicy,omitempty"`
+
+	// AuthorizedGaeApplications: The AppEngine app ids that can access this
+	// instance.
+	AuthorizedGaeApplications []string `json:"authorizedGaeApplications,omitempty"`
+
+	// BackupConfiguration: The daily backup configuration for the instance.
+	BackupConfiguration []*BackupConfiguration `json:"backupConfiguration,omitempty"`
+
+	// Kind: This is always sql#settings.
+	Kind string `json:"kind,omitempty"`
+
+	// PricingPlan: The pricing plan for this instance. This can be either
+	// PER_USE or PACKAGE.
+	PricingPlan string `json:"pricingPlan,omitempty"`
+
+	// ReplicationType: The type of replication this instance uses. This can
+	// be either ASYNCHRONOUS or SYNCHRONOUS.
+	ReplicationType string `json:"replicationType,omitempty"`
+
+	// Tier: The tier of service for this instance, for example D1, D2. For
+	// more information, see pricing.
+	Tier string `json:"tier,omitempty"`
+}
+
+type Tier struct {
+	// DiskQuota: The maximum disk size of this tier in bytes.
+	DiskQuota int64 `json:"DiskQuota,omitempty,string"`
+
+	// RAM: The maximum RAM usage of this tier in bytes.
+	RAM int64 `json:"RAM,omitempty,string"`
+
+	// Kind: This is always sql#tier.
+	Kind string `json:"kind,omitempty"`
+
+	// Region: The applicable regions for this tier. Can be us-east1 and
+	// europe-west1.
+	Region []string `json:"region,omitempty"`
+
+	// Tier: An identifier for the service tier, for example D1, D2 etc. For
+	// related information, see Pricing.
+	Tier string `json:"tier,omitempty"`
+}
+
+type TiersListResponse struct {
+	// Items: List of tiers.
+	Items []*Tier `json:"items,omitempty"`
+
+	// Kind: This is always sql#tiersList.
+	Kind string `json:"kind,omitempty"`
+}
+
+// method id "sql.backupRuns.get":
+
+type BackupRunsGetCall struct {
+	s                   *Service
+	project             string
+	instance            string
+	backupConfiguration string
+	dueTime             string
+	opt_                map[string]interface{}
+}
+
+// Get: Retrieves a resource containing information about a backup run.
+func (r *BackupRunsService) Get(project string, instance string, backupConfiguration string, dueTime string) *BackupRunsGetCall {
+	c := &BackupRunsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.backupConfiguration = backupConfiguration
+	c.dueTime = dueTime
+	return c
+}
+
+func (c *BackupRunsGetCall) Do() (*BackupRun, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("dueTime", fmt.Sprintf("%v", c.dueTime))
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/backupRuns/{backupConfiguration}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{backupConfiguration}", url.QueryEscape(c.backupConfiguration), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(BackupRun)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a resource containing information about a backup run.",
+	//   "httpMethod": "GET",
+	//   "id": "sql.backupRuns.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance",
+	//     "backupConfiguration",
+	//     "dueTime"
+	//   ],
+	//   "parameters": {
+	//     "backupConfiguration": {
+	//       "description": "Identifier for the backup configuration. This gets generated automatically when a backup configuration is created.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "dueTime": {
+	//       "description": "The time when this run is due to start in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/backupRuns/{backupConfiguration}",
+	//   "response": {
+	//     "$ref": "BackupRun"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.backupRuns.list":
+
+type BackupRunsListCall struct {
+	s                   *Service
+	project             string
+	instance            string
+	backupConfiguration string
+	opt_                map[string]interface{}
+}
+
+// List: Lists all backup runs associated with a given instance and
+// configuration in the reverse chronological order of the enqueued
+// time.
+func (r *BackupRunsService) List(project string, instance string, backupConfiguration string) *BackupRunsListCall {
+	c := &BackupRunsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.backupConfiguration = backupConfiguration
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of backup runs per response.
+func (c *BackupRunsListCall) MaxResults(maxResults int64) *BackupRunsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A
+// previously-returned page token representing part of the larger set of
+// results to view.
+func (c *BackupRunsListCall) PageToken(pageToken string) *BackupRunsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *BackupRunsListCall) Do() (*BackupRunsListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("backupConfiguration", fmt.Sprintf("%v", c.backupConfiguration))
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/backupRuns")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(BackupRunsListResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists all backup runs associated with a given instance and configuration in the reverse chronological order of the enqueued time.",
+	//   "httpMethod": "GET",
+	//   "id": "sql.backupRuns.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance",
+	//     "backupConfiguration"
+	//   ],
+	//   "parameters": {
+	//     "backupConfiguration": {
+	//       "description": "Identifier for the backup configuration. This gets generated automatically when a backup configuration is created.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of backup runs per response.",
+	//       "format": "int32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A previously-returned page token representing part of the larger set of results to view.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/backupRuns",
+	//   "response": {
+	//     "$ref": "BackupRunsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.delete":
+
+type InstancesDeleteCall struct {
+	s        *Service
+	project  string
+	instance string
+	opt_     map[string]interface{}
+}
+
+// Delete: Deletes a database instance.
+func (r *InstancesService) Delete(project string, instance string) *InstancesDeleteCall {
+	c := &InstancesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	return c
+}
+
+func (c *InstancesDeleteCall) Do() (*InstancesDeleteResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesDeleteResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Deletes a database instance.",
+	//   "httpMethod": "DELETE",
+	//   "id": "sql.instances.delete",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance to be deleted. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}",
+	//   "response": {
+	//     "$ref": "InstancesDeleteResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.export":
+
+type InstancesExportCall struct {
+	s                      *Service
+	project                string
+	instance               string
+	instancesexportrequest *InstancesExportRequest
+	opt_                   map[string]interface{}
+}
+
+// Export: Exports data from a database instance to a Google Cloud
+// Storage bucket as a MySQL dump file.
+func (r *InstancesService) Export(project string, instance string, instancesexportrequest *InstancesExportRequest) *InstancesExportCall {
+	c := &InstancesExportCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.instancesexportrequest = instancesexportrequest
+	return c
+}
+
+func (c *InstancesExportCall) Do() (*InstancesExportResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesexportrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/export")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesExportResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Exports data from a database instance to a Google Cloud Storage bucket as a MySQL dump file.",
+	//   "httpMethod": "POST",
+	//   "id": "sql.instances.export",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance to be exported. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/export",
+	//   "request": {
+	//     "$ref": "InstancesExportRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "InstancesExportResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.get":
+
+type InstancesGetCall struct {
+	s        *Service
+	project  string
+	instance string
+	opt_     map[string]interface{}
+}
+
+// Get: Retrieves a resource containing information about a database
+// instance.
+func (r *InstancesService) Get(project string, instance string) *InstancesGetCall {
+	c := &InstancesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	return c
+}
+
+func (c *InstancesGetCall) Do() (*DatabaseInstance, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(DatabaseInstance)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a resource containing information about a database instance.",
+	//   "httpMethod": "GET",
+	//   "id": "sql.instances.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}",
+	//   "response": {
+	//     "$ref": "DatabaseInstance"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.import":
+
+type InstancesImportCall struct {
+	s                      *Service
+	project                string
+	instance               string
+	instancesimportrequest *InstancesImportRequest
+	opt_                   map[string]interface{}
+}
+
+// Import: Imports data into a database instance from a MySQL dump file
+// in Google Cloud Storage.
+func (r *InstancesService) Import(project string, instance string, instancesimportrequest *InstancesImportRequest) *InstancesImportCall {
+	c := &InstancesImportCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.instancesimportrequest = instancesimportrequest
+	return c
+}
+
+func (c *InstancesImportCall) Do() (*InstancesImportResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesimportrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/import")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesImportResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Imports data into a database instance from a MySQL dump file in Google Cloud Storage.",
+	//   "httpMethod": "POST",
+	//   "id": "sql.instances.import",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/import",
+	//   "request": {
+	//     "$ref": "InstancesImportRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "InstancesImportResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.insert":
+
+type InstancesInsertCall struct {
+	s                *Service
+	project          string
+	databaseinstance *DatabaseInstance
+	opt_             map[string]interface{}
+}
+
+// Insert: Creates a new database instance.
+func (r *InstancesService) Insert(project string, databaseinstance *DatabaseInstance) *InstancesInsertCall {
+	c := &InstancesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.databaseinstance = databaseinstance
+	return c
+}
+
+func (c *InstancesInsertCall) Do() (*InstancesInsertResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesInsertResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a new database instance.",
+	//   "httpMethod": "POST",
+	//   "id": "sql.instances.insert",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID of the project to which the newly created database instances should belong. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances",
+	//   "request": {
+	//     "$ref": "DatabaseInstance"
+	//   },
+	//   "response": {
+	//     "$ref": "InstancesInsertResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.list":
+
+type InstancesListCall struct {
+	s       *Service
+	project string
+	opt_    map[string]interface{}
+}
+
+// List: Lists instances under a given project in the alphabetical order
+// of the instance name.
+func (r *InstancesService) List(project string) *InstancesListCall {
+	c := &InstancesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of results to return per response.
+func (c *InstancesListCall) MaxResults(maxResults int64) *InstancesListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A
+// previously-returned page token representing part of the larger set of
+// results to view.
+func (c *InstancesListCall) PageToken(pageToken string) *InstancesListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *InstancesListCall) Do() (*InstancesListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesListResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists instances under a given project in the alphabetical order of the instance name.",
+	//   "httpMethod": "GET",
+	//   "id": "sql.instances.list",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "maxResults": {
+	//       "description": "The maximum number of results to return per response.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A previously-returned page token representing part of the larger set of results to view.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project for which to list database instances. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances",
+	//   "response": {
+	//     "$ref": "InstancesListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.patch":
+
+type InstancesPatchCall struct {
+	s                *Service
+	project          string
+	instance         string
+	databaseinstance *DatabaseInstance
+	opt_             map[string]interface{}
+}
+
+// Patch: Updates settings of a database instance. Caution: This is not
+// a partial update, so you must include values for all the settings
+// that you want to retain. For partial updates, use patch.. This method
+// supports patch semantics.
+func (r *InstancesService) Patch(project string, instance string, databaseinstance *DatabaseInstance) *InstancesPatchCall {
+	c := &InstancesPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.databaseinstance = databaseinstance
+	return c
+}
+
+func (c *InstancesPatchCall) Do() (*InstancesUpdateResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesUpdateResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates settings of a database instance. Caution: This is not a partial update, so you must include values for all the settings that you want to retain. For partial updates, use patch.. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "sql.instances.patch",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}",
+	//   "request": {
+	//     "$ref": "DatabaseInstance"
+	//   },
+	//   "response": {
+	//     "$ref": "InstancesUpdateResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.restart":
+
+type InstancesRestartCall struct {
+	s        *Service
+	project  string
+	instance string
+	opt_     map[string]interface{}
+}
+
+// Restart: Restarts a database instance.
+func (r *InstancesService) Restart(project string, instance string) *InstancesRestartCall {
+	c := &InstancesRestartCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	return c
+}
+
+func (c *InstancesRestartCall) Do() (*InstancesRestartResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/restart")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesRestartResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Restarts a database instance.",
+	//   "httpMethod": "POST",
+	//   "id": "sql.instances.restart",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance to be restarted. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/restart",
+	//   "response": {
+	//     "$ref": "InstancesRestartResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.restoreBackup":
+
+type InstancesRestoreBackupCall struct {
+	s                     *Service
+	project               string
+	instance              string
+	backupConfigurationid string
+	dueTime               string
+	opt_                  map[string]interface{}
+}
+
+// RestoreBackup: Restores a backup of a database instance.
+func (r *InstancesService) RestoreBackup(project string, instance string, backupConfigurationid string, dueTime string) *InstancesRestoreBackupCall {
+	c := &InstancesRestoreBackupCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.backupConfigurationid = backupConfigurationid
+	c.dueTime = dueTime
+	return c
+}
+
+func (c *InstancesRestoreBackupCall) Do() (*InstancesRestoreBackupResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("backupConfiguration", fmt.Sprintf("%v", c.backupConfigurationid))
+	params.Set("dueTime", fmt.Sprintf("%v", c.dueTime))
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/restoreBackup")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesRestoreBackupResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Restores a backup of a database instance.",
+	//   "httpMethod": "POST",
+	//   "id": "sql.instances.restoreBackup",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance",
+	//     "backupConfiguration",
+	//     "dueTime"
+	//   ],
+	//   "parameters": {
+	//     "backupConfiguration": {
+	//       "description": "The identifier of the backup configuration. This gets generated automatically when a backup configuration is created.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "dueTime": {
+	//       "description": "The time when this run is due to start in RFC 3339 format, for example 2012-11-15T16:19:00.094Z.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/restoreBackup",
+	//   "response": {
+	//     "$ref": "InstancesRestoreBackupResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.instances.update":
+
+type InstancesUpdateCall struct {
+	s                *Service
+	project          string
+	instance         string
+	databaseinstance *DatabaseInstance
+	opt_             map[string]interface{}
+}
+
+// Update: Updates settings of a database instance. Caution: This is not
+// a partial update, so you must include values for all the settings
+// that you want to retain. For partial updates, use patch.
+func (r *InstancesService) Update(project string, instance string, databaseinstance *DatabaseInstance) *InstancesUpdateCall {
+	c := &InstancesUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.databaseinstance = databaseinstance
+	return c
+}
+
+func (c *InstancesUpdateCall) Do() (*InstancesUpdateResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstancesUpdateResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates settings of a database instance. Caution: This is not a partial update, so you must include values for all the settings that you want to retain. For partial updates, use patch.",
+	//   "etagRequired": true,
+	//   "httpMethod": "PUT",
+	//   "id": "sql.instances.update",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}",
+	//   "request": {
+	//     "$ref": "DatabaseInstance"
+	//   },
+	//   "response": {
+	//     "$ref": "InstancesUpdateResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.operations.get":
+
+type OperationsGetCall struct {
+	s         *Service
+	project   string
+	instance  string
+	operation string
+	opt_      map[string]interface{}
+}
+
+// Get: Retrieves an instance operation that has been performed on an
+// instance.
+func (r *OperationsService) Get(project string, instance string, operation string) *OperationsGetCall {
+	c := &OperationsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	c.operation = operation
+	return c
+}
+
+func (c *OperationsGetCall) Do() (*InstanceOperation, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/operations/{operation}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{operation}", url.QueryEscape(c.operation), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(InstanceOperation)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves an instance operation that has been performed on an instance.",
+	//   "httpMethod": "GET",
+	//   "id": "sql.operations.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance",
+	//     "operation"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "operation": {
+	//       "description": "Instance operation ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/operations/{operation}",
+	//   "response": {
+	//     "$ref": "InstanceOperation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.operations.list":
+
+type OperationsListCall struct {
+	s        *Service
+	project  string
+	instance string
+	opt_     map[string]interface{}
+}
+
+// List: Lists all instance operations that have been performed on the
+// given database instance in the reverse chronological order of the
+// start time.
+func (r *OperationsService) List(project string, instance string) *OperationsListCall {
+	c := &OperationsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instance = instance
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": Maximum number
+// of operations per response.
+func (c *OperationsListCall) MaxResults(maxResults int64) *OperationsListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": A
+// previously-returned page token representing part of the larger set of
+// results to view.
+func (c *OperationsListCall) PageToken(pageToken string) *OperationsListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
+func (c *OperationsListCall) Do() (*OperationsListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "projects/{project}/instances/{instance}/operations")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{instance}", url.QueryEscape(c.instance), 1)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(OperationsListResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists all instance operations that have been performed on the given database instance in the reverse chronological order of the start time.",
+	//   "httpMethod": "GET",
+	//   "id": "sql.operations.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Database instance ID. This does not include the project ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "description": "Maximum number of operations per response.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "type": "integer"
+	//     },
+	//     "pageToken": {
+	//       "description": "A previously-returned page token representing part of the larger set of results to view.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID of the project that contains the instance. You can find this on the project summary page of the Google APIs Console.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "projects/{project}/instances/{instance}/operations",
+	//   "response": {
+	//     "$ref": "OperationsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
+
+// method id "sql.tiers.list":
+
+type TiersListCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// List: Lists all available service tiers for Google Cloud SQL, for
+// example D1, D2. For related information, see Pricing.
+func (r *TiersService) List() *TiersListCall {
+	c := &TiersListCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+func (c *TiersListCall) Do() (*TiersListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/sql/v1beta1/", "tiers")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(TiersListResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists all available service tiers for Google Cloud SQL, for example D1, D2. For related information, see Pricing.",
+	//   "httpMethod": "GET",
+	//   "id": "sql.tiers.list",
+	//   "path": "tiers",
+	//   "response": {
+	//     "$ref": "TiersListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/sqlservice.admin"
+	//   ]
+	// }
+
+}
diff --git a/storage/v1beta1/storage-api.json b/storage/v1beta1/storage-api.json
index 509a354..57551b7 100644
--- a/storage/v1beta1/storage-api.json
+++ b/storage/v1beta1/storage-api.json
@@ -1,20 +1,22 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/uMwrv3tTmXi585ZE0AKM9F_TFeY\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/sBbb2E6YcjiQpLvNYukQiySEwzg\"",
  "discoveryVersion": "v1",
  "id": "storage:v1beta1",
  "name": "storage",
  "version": "v1beta1",
- "revision": "20130419",
+ "revision": "20130612",
  "title": "Cloud Storage API",
  "description": "Lets you store and retrieve potentially-large, immutable data objects.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
   "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
  },
  "documentationLink": "https://developers.google.com/storage/docs/json_api/",
  "labels": [
-  "limited_availability"
+  "labs"
  ],
  "protocol": "rest",
  "baseUrl": "https://www.googleapis.com/storage/v1beta1/",
diff --git a/storage/v1beta1/storage-gen.go b/storage/v1beta1/storage-gen.go
index 0d26d85..30ef291 100644
--- a/storage/v1beta1/storage-gen.go
+++ b/storage/v1beta1/storage-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "storage:v1beta1"
 const apiName = "storage"
@@ -399,15 +402,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -465,15 +470,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -542,15 +549,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -608,14 +617,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -680,16 +691,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -763,16 +776,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -837,14 +852,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -903,14 +920,16 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -999,12 +1018,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1101,11 +1122,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1205,15 +1228,17 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1302,15 +1327,17 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1387,16 +1414,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1463,16 +1492,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1550,16 +1581,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1626,15 +1659,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1708,17 +1743,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1801,17 +1838,19 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1885,15 +1924,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1961,15 +2002,17 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2085,10 +2128,11 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -2098,6 +2142,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2247,14 +2292,16 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2367,16 +2414,18 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2474,16 +2523,18 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta1/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2542,12 +2593,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/storage/v1beta2/storage-api.json b/storage/v1beta2/storage-api.json
index ace441b..db30338 100644
--- a/storage/v1beta2/storage-api.json
+++ b/storage/v1beta2/storage-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/uj4XcOG9jeVvuyh6m162ITu6vzo\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/Hn7Lwuw8NTExSZM0perrdPYiIys\"",
  "discoveryVersion": "v1",
  "id": "storage:v1beta2",
  "name": "storage",
  "version": "v1beta2",
- "revision": "20130508",
+ "revision": "20130612",
  "title": "Cloud Storage API",
  "description": "Lets you store and retrieve potentially-large, immutable data objects.",
  "ownerDomain": "google.com",
diff --git a/storage/v1beta2/storage-gen.go b/storage/v1beta2/storage-gen.go
index f5c2175..5c10fc5 100644
--- a/storage/v1beta2/storage-gen.go
+++ b/storage/v1beta2/storage-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "storage:v1beta2"
 const apiName = "storage"
@@ -568,15 +571,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -634,15 +639,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -711,15 +718,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -777,14 +786,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -849,16 +860,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -932,16 +945,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1030,14 +1045,16 @@
 		params.Set("ifMetagenerationNotMatch", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1132,14 +1149,16 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1243,12 +1262,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1354,11 +1375,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1481,15 +1504,17 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1614,15 +1639,17 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1713,12 +1740,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "channels/stop")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1762,15 +1791,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/defaultObjectAcl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -1828,15 +1859,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/defaultObjectAcl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1906,15 +1939,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/defaultObjectAcl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1972,14 +2007,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/defaultObjectAcl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2044,16 +2081,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/defaultObjectAcl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2127,16 +2166,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/defaultObjectAcl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2217,16 +2258,18 @@
 		params.Set("generation", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -2310,16 +2353,18 @@
 		params.Set("generation", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2414,16 +2459,18 @@
 		params.Set("generation", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2507,15 +2554,17 @@
 		params.Set("generation", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}/acl")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2606,17 +2655,19 @@
 		params.Set("generation", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2716,17 +2767,19 @@
 		params.Set("generation", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}/acl/{entity}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
-	urls = strings.Replace(urls, "{entity}", cleanPathString(c.entity), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{entity}", url.QueryEscape(c.entity), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2836,16 +2889,18 @@
 		params.Set("ifMetagenerationMatch", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{destinationBucket}/o/{destinationObject}/compose")
-	urls = strings.Replace(urls, "{destinationBucket}", cleanPathString(c.destinationBucket), 1)
-	urls = strings.Replace(urls, "{destinationObject}", cleanPathString(c.destinationObject), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{destinationBucket}", url.QueryEscape(c.destinationBucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{destinationObject}", url.QueryEscape(c.destinationObject), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3054,18 +3109,20 @@
 		params.Set("sourceGeneration", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}")
-	urls = strings.Replace(urls, "{sourceBucket}", cleanPathString(c.sourceBucket), 1)
-	urls = strings.Replace(urls, "{sourceObject}", cleanPathString(c.sourceObject), 1)
-	urls = strings.Replace(urls, "{destinationBucket}", cleanPathString(c.destinationBucket), 1)
-	urls = strings.Replace(urls, "{destinationObject}", cleanPathString(c.destinationObject), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{sourceBucket}", url.QueryEscape(c.sourceBucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{sourceObject}", url.QueryEscape(c.sourceObject), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{destinationBucket}", url.QueryEscape(c.destinationBucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{destinationObject}", url.QueryEscape(c.destinationObject), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3273,15 +3330,17 @@
 		params.Set("ifMetagenerationNotMatch", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3435,15 +3494,17 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3634,10 +3695,11 @@
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
 		params.Set("uploadType", "multipart")
 	}
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -3647,6 +3709,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3830,14 +3893,16 @@
 		params.Set("versions", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4011,16 +4076,18 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4204,16 +4271,18 @@
 		params.Set("projection", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/{object}")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
-	urls = strings.Replace(urls, "{object}", cleanPathString(c.object), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{object}", url.QueryEscape(c.object), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4396,15 +4465,17 @@
 		params.Set("versions", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/storage/v1beta2/", "b/{bucket}/o/watch")
-	urls = strings.Replace(urls, "{bucket}", cleanPathString(c.bucket), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{bucket}", url.QueryEscape(c.bucket), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4484,12 +4555,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/taskqueue/v1beta1/taskqueue-api.json b/taskqueue/v1beta1/taskqueue-api.json
index 200fb6a..20ddff8 100644
--- a/taskqueue/v1beta1/taskqueue-api.json
+++ b/taskqueue/v1beta1/taskqueue-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/5Nk9XGFN9uQhQeuzx0-e6dPAbbU\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/Rq5ZUxOQv3EpPxhPSvrsthtH0_4\"",
  "discoveryVersion": "v1",
  "id": "taskqueue:v1beta1",
  "name": "taskqueue",
@@ -8,6 +8,8 @@
  "revision": "20130318",
  "title": "TaskQueue API",
  "description": "Lets you access a Google App Engine Pull Task Queue over REST.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/app_engine-16.png",
   "x32": "http://www.google.com/images/icons/product/app_engine-32.png"
diff --git a/taskqueue/v1beta1/taskqueue-gen.go b/taskqueue/v1beta1/taskqueue-gen.go
index 37ef051..5995ec3 100644
--- a/taskqueue/v1beta1/taskqueue-gen.go
+++ b/taskqueue/v1beta1/taskqueue-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "taskqueue:v1beta1"
 const apiName = "taskqueue"
@@ -204,15 +207,17 @@
 		params.Set("getStats", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta1/projects/", "{project}/taskqueues/{taskqueue}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -284,16 +289,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta1/projects/", "{project}/taskqueues/{taskqueue}/tasks/{task}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.task), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.task), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -360,16 +367,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta1/projects/", "{project}/taskqueues/{taskqueue}/tasks/{task}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.task), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.task), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -447,15 +456,17 @@
 	params.Set("leaseSecs", fmt.Sprintf("%v", c.leaseSecs))
 	params.Set("numTasks", fmt.Sprintf("%v", c.numTasks))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta1/projects/", "{project}/taskqueues/{taskqueue}/tasks/lease")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -536,15 +547,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta1/projects/", "{project}/taskqueues/{taskqueue}/tasks")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -586,12 +599,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/taskqueue/v1beta2/taskqueue-api.json b/taskqueue/v1beta2/taskqueue-api.json
index 429ead2..ab5c995 100644
--- a/taskqueue/v1beta2/taskqueue-api.json
+++ b/taskqueue/v1beta2/taskqueue-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/WDEGka5nT0HAjoC0Qqxn1-bqOHA\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/NdbJrHMoZLPwtpKFHEyZMJzpuTM\"",
  "discoveryVersion": "v1",
  "id": "taskqueue:v1beta2",
  "name": "taskqueue",
@@ -8,6 +8,8 @@
  "revision": "20130318",
  "title": "TaskQueue API",
  "description": "Lets you access a Google App Engine Pull Task Queue over REST.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/app_engine-16.png",
   "x32": "http://www.google.com/images/icons/product/app_engine-32.png"
diff --git a/taskqueue/v1beta2/taskqueue-gen.go b/taskqueue/v1beta2/taskqueue-gen.go
index 664aeff..172608a 100644
--- a/taskqueue/v1beta2/taskqueue-gen.go
+++ b/taskqueue/v1beta2/taskqueue-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "taskqueue:v1beta2"
 const apiName = "taskqueue"
@@ -211,15 +214,17 @@
 		params.Set("getStats", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -291,16 +296,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}/tasks/{task}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.task), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.task), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -367,16 +374,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}/tasks/{task}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.task), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.task), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -455,16 +464,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}/tasks")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -560,15 +571,17 @@
 		params.Set("tag", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}/tasks/lease")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -659,15 +672,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}/tasks")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -745,17 +760,19 @@
 	params.Set("alt", "json")
 	params.Set("newLeaseSeconds", fmt.Sprintf("%v", c.newLeaseSeconds))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}/tasks/{task}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.task), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.task), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -848,17 +865,19 @@
 	params.Set("alt", "json")
 	params.Set("newLeaseSeconds", fmt.Sprintf("%v", c.newLeaseSeconds))
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/taskqueue/v1beta2/projects/", "{project}/taskqueues/{taskqueue}/tasks/{task}")
-	urls = strings.Replace(urls, "{project}", cleanPathString(c.project), 1)
-	urls = strings.Replace(urls, "{taskqueue}", cleanPathString(c.taskqueue), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.task), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{project}", url.QueryEscape(c.project), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{taskqueue}", url.QueryEscape(c.taskqueue), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.task), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -916,12 +935,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/tasks/v1/tasks-api.json b/tasks/v1/tasks-api.json
index 1257011..62e12b0 100644
--- a/tasks/v1/tasks-api.json
+++ b/tasks/v1/tasks-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/jHXhymrMzGkcywauZCRq1Lt4Vl0\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/2OzpktTyb8G1n0lJqDrsLrojoIY\"",
  "discoveryVersion": "v1",
  "id": "tasks:v1",
  "name": "tasks",
@@ -8,6 +8,8 @@
  "revision": "20130403",
  "title": "Tasks API",
  "description": "Lets you manage your tasks and task lists.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/tasks-16.png",
   "x32": "http://www.google.com/images/icons/product/tasks-32.png"
diff --git a/tasks/v1/tasks-gen.go b/tasks/v1/tasks-gen.go
index fdb711c..3bddc33 100644
--- a/tasks/v1/tasks-gen.go
+++ b/tasks/v1/tasks-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "tasks:v1"
 const apiName = "tasks"
@@ -226,14 +229,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "users/@me/lists/{tasklist}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -281,14 +286,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "users/@me/lists/{tasklist}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -352,12 +359,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "users/@me/lists")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -424,11 +433,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "users/@me/lists")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -494,15 +505,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "users/@me/lists/{tasklist}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -567,15 +580,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "users/@me/lists/{tasklist}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -635,14 +650,16 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/clear")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -692,15 +709,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/tasks/{task}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.taskid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.taskid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -757,15 +776,17 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/tasks/{task}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.taskid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.taskid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -856,15 +877,17 @@
 		params.Set("previous", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/tasks")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1040,14 +1063,16 @@
 		params.Set("updatedMin", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/tasks")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1180,15 +1205,17 @@
 		params.Set("previous", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/tasks/{task}/move")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.taskid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.taskid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1270,16 +1297,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/tasks/{task}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.taskid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PATCH", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.taskid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1353,16 +1382,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/tasks/v1/", "lists/{tasklist}/tasks/{task}")
-	urls = strings.Replace(urls, "{tasklist}", cleanPathString(c.tasklistid), 1)
-	urls = strings.Replace(urls, "{task}", cleanPathString(c.taskid), 1)
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	req.URL.Path = strings.Replace(req.URL.Path, "{tasklist}", url.QueryEscape(c.tasklistid), 1)
+	req.URL.Path = strings.Replace(req.URL.Path, "{task}", url.QueryEscape(c.taskid), 1)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -1406,12 +1437,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/translate/v2/translate-api.json b/translate/v2/translate-api.json
index 96b567a..8ff439e 100644
--- a/translate/v2/translate-api.json
+++ b/translate/v2/translate-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/gY8K1j50GFJNtln0zFJAkvIOJNw\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/mz-iuujrmc2HMKTkO4X5K9hqzSY\"",
  "discoveryVersion": "v1",
  "id": "translate:v2",
  "name": "translate",
@@ -8,6 +8,8 @@
  "revision": "20120112",
  "title": "Translate API",
  "description": "Lets you translate text from one language to another",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/translate-16.png",
   "x32": "http://www.google.com/images/icons/product/translate-32.png"
diff --git a/translate/v2/translate-gen.go b/translate/v2/translate-gen.go
index e306142..7be3066 100644
--- a/translate/v2/translate-gen.go
+++ b/translate/v2/translate-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "translate:v2"
 const apiName = "translate"
@@ -159,11 +162,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/language/translate/", "v2/detect")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -226,11 +231,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/language/translate/", "v2/languages")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -315,11 +322,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/language/translate/", "v2")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -382,12 +391,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/urlshortener/v1/urlshortener-api.json b/urlshortener/v1/urlshortener-api.json
index 5532e46..11c7877 100644
--- a/urlshortener/v1/urlshortener-api.json
+++ b/urlshortener/v1/urlshortener-api.json
@@ -1,12 +1,14 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/hh1AxL_qlxHtzx3df5y6qHYRk8w\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/T4bB77XUfbpGWn7xKXxC7yFKgeE\"",
  "discoveryVersion": "v1",
  "id": "urlshortener:v1",
  "name": "urlshortener",
  "version": "v1",
  "title": "URL Shortener API",
  "description": "Lets you create, inspect, and manage goo.gl short URLs",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/search-16.gif",
   "x32": "http://www.google.com/images/icons/product/search-32.gif"
diff --git a/urlshortener/v1/urlshortener-gen.go b/urlshortener/v1/urlshortener-gen.go
index 81ef729..13eff73 100644
--- a/urlshortener/v1/urlshortener-gen.go
+++ b/urlshortener/v1/urlshortener-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "urlshortener:v1"
 const apiName = "urlshortener"
@@ -197,11 +200,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/urlshortener/v1/", "url")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -275,12 +280,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/urlshortener/v1/", "url")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -347,11 +354,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/urlshortener/v1/", "url/history")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -394,12 +403,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/webfonts/v1/webfonts-api.json b/webfonts/v1/webfonts-api.json
index 67dd75f..51cb409 100644
--- a/webfonts/v1/webfonts-api.json
+++ b/webfonts/v1/webfonts-api.json
@@ -1,13 +1,15 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/1WzYt_qi7HSJHYzKbIDpdsLq_Jk\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/BkmJT_krx7QiG8ilUz8USxc8AlI\"",
  "discoveryVersion": "v1",
  "id": "webfonts:v1",
  "name": "webfonts",
  "version": "v1",
- "revision": "20130404",
+ "revision": "20130525",
  "title": "Google Fonts Developer API",
  "description": "The Google Fonts Developer API.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/feature/font_api-16.png",
   "x32": "http://www.google.com/images/icons/feature/font_api-32.gif"
diff --git a/webfonts/v1/webfonts-gen.go b/webfonts/v1/webfonts-gen.go
index 575360a..c2e470c 100644
--- a/webfonts/v1/webfonts-gen.go
+++ b/webfonts/v1/webfonts-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "webfonts:v1"
 const apiName = "webfonts"
@@ -127,11 +130,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/webfonts/v1/", "webfonts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -172,12 +177,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/youtube/v3/youtube-api.json b/youtube/v3/youtube-api.json
index 9dd633b..d61a7c0 100644
--- a/youtube/v3/youtube-api.json
+++ b/youtube/v3/youtube-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/hnzfKbandlZWUkWL3SnuaQjIEdo\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/-1uCDEEeXh5XSWC8RZwLjaFjouE\"",
  "discoveryVersion": "v1",
  "id": "youtube:v3",
  "name": "youtube",
  "canonicalName": "YouTube",
  "version": "v3",
- "revision": "20130422",
+ "revision": "20130613",
  "title": "YouTube Data API",
  "description": "Programmatic access to YouTube features.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/youtube-16.png",
   "x32": "http://www.google.com/images/icons/product/youtube-32.png"
@@ -219,6 +221,26 @@
        "type": "string",
        "description": "The URL the client should ping to indicate that the user was shown this promoted item."
       },
+      "ctaType": {
+       "type": "string",
+       "description": "The type of call-to-action, a message to the user indicating action that can be taken.",
+       "enum": [
+        "unspecified",
+        "visitAdvertiserSite"
+       ],
+       "enumDescriptions": [
+        "",
+        ""
+       ]
+      },
+      "descriptionText": {
+       "type": "string",
+       "description": "The text description to accompany the promoted item."
+      },
+      "destinationUrl": {
+       "type": "string",
+       "description": "The URL the client should direct the user to, if the user chooses to visit the advertiser's website."
+      },
       "videoId": {
        "type": "string",
        "description": "The ID that YouTube uses to uniquely identify the promoted video."
@@ -324,6 +346,10 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of activities, or events, that match the request criteria.",
@@ -347,6 +373,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -421,46 +451,6 @@
     }
    }
   },
-  "CallToAction": {
-   "id": "CallToAction",
-   "type": "object",
-   "description": "Describes a call-to-action overlay.",
-   "properties": {
-    "callToActionId": {
-     "type": "string"
-    },
-    "description1": {
-     "type": "string"
-    },
-    "description2": {
-     "type": "string"
-    },
-    "destinationUrl": {
-     "type": "string"
-    },
-    "displayUrl": {
-     "type": "string"
-    },
-    "endTimeMs": {
-     "type": "string",
-     "format": "int64"
-    },
-    "headline": {
-     "type": "string"
-    },
-    "hideTimeMs": {
-     "type": "string",
-     "format": "int64"
-    },
-    "imageUrl": {
-     "type": "string"
-    },
-    "startTimeMs": {
-     "type": "string",
-     "format": "int64"
-    }
-   }
-  },
   "Channel": {
    "id": "Channel",
    "type": "object",
@@ -486,6 +476,10 @@
      "type": "string",
      "description": "The ID that YouTube uses to uniquely identify the channel."
     },
+    "invideoPromotion": {
+     "$ref": "InvideoPromotion",
+     "description": "The invideoPromotion object encapsulates information about promotion campaign associated with the channel."
+    },
     "kind": {
      "type": "string",
      "description": "The type of the API resource. For channel resources, the value will be youtube#channel.",
@@ -509,6 +503,26 @@
     }
    }
   },
+  "ChannelBannerInsertResponse": {
+   "id": "ChannelBannerInsertResponse",
+   "type": "object",
+   "description": "A channel banner returned as the response to a channel_banner.insert call.",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "The ETag of the response."
+    },
+    "kind": {
+     "type": "string",
+     "description": "The type of the API response. For this operation, the value will be youtube#channelBannerInsertResponse.",
+     "default": "youtube#channelBannerInsertResponse"
+    },
+    "url": {
+     "type": "string",
+     "description": "The URL of this banner image."
+    }
+   }
+  },
   "ChannelBrandingSettings": {
    "id": "ChannelBrandingSettings",
    "type": "object",
@@ -620,6 +634,10 @@
      "type": "string",
      "description": "The ETag for the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of channels that match the request criteria.",
@@ -643,6 +661,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -678,6 +700,10 @@
      "type": "boolean",
      "description": "Whether user-submitted comments left on the channel page need to be approved by the channel owner to be publicly visible."
     },
+    "profileColor": {
+     "type": "string",
+     "description": "A prominent color that can be rendered on this channel page."
+    },
     "showBrowseView": {
      "type": "boolean",
      "description": "Whether the tab to browse the videos should be displayed."
@@ -756,6 +782,10 @@
    "type": "object",
    "description": "JSON template for the status part of a channel.",
    "properties": {
+    "isLinked": {
+     "type": "boolean",
+     "description": "If true, then the user is linked to either a YouTube username or G+ account. Otherwise, the user doesn't have a public YouTube identity."
+    },
     "privacyStatus": {
      "type": "string",
      "description": "Privacy status of the channel.",
@@ -787,7 +817,7 @@
   "ContentRating": {
    "id": "ContentRating",
    "type": "object",
-   "description": "Movie ratings schemes.",
+   "description": "Ratings schemes. The country-specific ratings are mostly for movies and shows.",
    "properties": {
     "acbRating": {
      "type": "string",
@@ -1080,68 +1110,20 @@
       "",
       ""
      ]
-    }
-   }
-  },
-  "FeaturedChannel": {
-   "id": "FeaturedChannel",
-   "type": "object",
-   "description": "Describes a featured channel.",
-   "properties": {
-    "channelId": {
-     "type": "string",
-     "description": "External id of the featured channel."
     },
-    "channelSnippet": {
-     "$ref": "ChannelSnippet",
-     "description": "Contains further information about the featured channel."
-    },
-    "endTimeMs": {
+    "ytRating": {
      "type": "string",
-     "description": "Stop showing the feature at this playback time.",
-     "format": "int64"
-    },
-    "featureId": {
-     "type": "string",
-     "description": "Id of this feature (for logging)."
-    },
-    "startTimeMs": {
-     "type": "string",
-     "description": "Start showing the feature at this playback time.",
-     "format": "int64"
-    },
-    "watermarkUrl": {
-     "type": "string",
-     "description": "URL of the default/custom image url."
-    }
-   }
-  },
-  "FeaturedVideo": {
-   "id": "FeaturedVideo",
-   "type": "object",
-   "description": "The representation of one featured video.",
-   "properties": {
-    "endTimeMs": {
-     "type": "string",
-     "description": "Stop showing the feature at the playback time.",
-     "format": "int64"
-    },
-    "featureId": {
-     "type": "string",
-     "description": "Id of this feature (for logging)."
-    },
-    "startTimeMs": {
-     "type": "string",
-     "description": "Start showing the feature at this playback time.",
-     "format": "int64"
-    },
-    "videoId": {
-     "type": "string",
-     "description": "The external id of the featured video."
-    },
-    "videoSnippet": {
-     "$ref": "VideoSnippet",
-     "description": "Contains further information about the featured video."
+     "description": "Internal YouTube rating.",
+     "enum": [
+      "yt17Plus",
+      "ytAllAudiences",
+      "ytRestricted"
+     ],
+     "enumDescriptions": [
+      "",
+      "",
+      ""
+     ]
     }
    }
   },
@@ -1200,6 +1182,10 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of categories that can be associated with YouTube channels. In this map, the category ID is the map key, and its value is the corresponding guideCategory resource.",
@@ -1211,6 +1197,10 @@
      "type": "string",
      "description": "The type of the API response. For this operation, the value will be youtube#guideCategoryListResponse.",
      "default": "youtube#guideCategoryListResponse"
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -1239,6 +1229,10 @@
      "$ref": "LocalizedProperty",
      "description": "The URL for the background image shown on the video watch page. The image should be 1200px by 615px, with a maximum file size of 128k."
     },
+    "bannerExternalUrl": {
+     "type": "string",
+     "description": "This is used only in update requests; if it's set, we use this URL to generate all of the above banner URLs."
+    },
     "bannerImageUrl": {
      "type": "string",
      "description": "Banner image. Desktop size (1060x175)."
@@ -1309,21 +1303,82 @@
     }
    }
   },
-  "InvideoFeature": {
-   "id": "InvideoFeature",
+  "InvideoPosition": {
+   "id": "InvideoPosition",
    "type": "object",
-   "description": "A set of invideo features to display for a video playback.",
+   "description": "Describes the spatial position of a visual widget inside a video. It is a union of various position types, out of which only will be set one.",
    "properties": {
-    "callToAction": {
-     "$ref": "CallToAction"
+    "cornerPosition": {
+     "type": "string",
+     "description": "Describes in which corner of the video the visual widget will appear.",
+     "enum": [
+      "bottomLeft",
+      "bottomRight",
+      "topLeft",
+      "topRight"
+     ],
+     "enumDescriptions": [
+      "",
+      "",
+      "",
+      ""
+     ]
     },
-    "featuredChannel": {
-     "$ref": "FeaturedChannel",
-     "description": "If present, the playback should display a featured channel."
+    "type": {
+     "type": "string",
+     "description": "Defines the position type.",
+     "enum": [
+      "corner"
+     ],
+     "enumDescriptions": [
+      ""
+     ]
+    }
+   }
+  },
+  "InvideoPromotion": {
+   "id": "InvideoPromotion",
+   "type": "object",
+   "description": "Describes an invideo promotion campaign consisting of multiple promoted items. A campaign belongs to a single channel_id.",
+   "properties": {
+    "items": {
+     "type": "array",
+     "description": "List of promoted items in decreasing priority.",
+     "items": {
+      "$ref": "PromotedItemId"
+     }
     },
-    "featuredVideo": {
-     "$ref": "FeaturedVideo",
-     "description": "If present, the playback should display a featured video."
+    "position": {
+     "$ref": "InvideoPosition",
+     "description": "The spatial position within the video where the promoted item will be displayed."
+    },
+    "timing": {
+     "$ref": "InvideoTiming",
+     "description": "The temporal position within the video where the promoted item will be displayed."
+    }
+   }
+  },
+  "InvideoTiming": {
+   "id": "InvideoTiming",
+   "type": "object",
+   "description": "Describes a temporal position of a visual widget inside a video.",
+   "properties": {
+    "offsetMs": {
+     "type": "string",
+     "description": "Defines the time at which the promotion will appear. Depending on the value of type the value of the offsetMs field will represent a time offset from the start or from the end of the video, expressed in milliseconds.",
+     "format": "uint64"
+    },
+    "type": {
+     "type": "string",
+     "description": "Describes a timing type. If the value is offsetFromStart, then the offsetMs field represents an offset from the start of the video. If the value is offsetFromEnd, then the offsetMs field represents an offset from the end of the video.",
+     "enum": [
+      "offsetFromEnd",
+      "offsetFromStart"
+     ],
+     "enumDescriptions": [
+      "",
+      ""
+     ]
     }
    }
   },
@@ -1458,6 +1513,10 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of broadcasts that match the request criteria.",
@@ -1481,6 +1540,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -1604,6 +1667,22 @@
        "youtube.liveBroadcasts.update"
       ]
      }
+    },
+    "recordingStatus": {
+     "type": "string",
+     "description": "The broadcast's recording status.",
+     "enum": [
+      "",
+      "not_recording",
+      "recorded",
+      "recording"
+     ],
+     "enumDescriptions": [
+      "",
+      "",
+      "",
+      ""
+     ]
     }
    }
   },
@@ -1709,6 +1788,10 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of live streams that match the request criteria.",
@@ -1732,6 +1815,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -1840,137 +1927,6 @@
     }
    }
   },
-  "Player": {
-   "id": "Player",
-   "type": "object",
-   "description": "A player resource represents all the information needed to play a video.",
-   "properties": {
-    "adsPlaylist": {
-     "$ref": "PlayerAdsPlaylist",
-     "description": "The playlist of video ads to show for this playback."
-    },
-    "etag": {
-     "type": "string",
-     "description": "The ETag for the player resource."
-    },
-    "id": {
-     "$ref": "ResourceId",
-     "description": "The ID that YouTube uses to uniquely identify the resource."
-    },
-    "invideoFeature": {
-     "$ref": "InvideoFeature",
-     "description": "The invideo features for the video."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The type of the API resource.",
-     "default": "youtube#player"
-    },
-    "videoUrls": {
-     "$ref": "PlayerVideoUrls",
-     "description": "The videoUrls object either contains restriction information or URLs giving access to the content."
-    }
-   }
-  },
-  "PlayerAdsPlaylist": {
-   "id": "PlayerAdsPlaylist",
-   "type": "object",
-   "description": "The playlist of ads which accompany the content video.",
-   "properties": {
-    "vmap_xml": {
-     "type": "string",
-     "description": "The VMAP XML document that describes where ads should be inserted and what ad formats should be used in those ad breaks. See http://www.iab.net/vmap."
-    }
-   }
-  },
-  "PlayerListResponse": {
-   "id": "PlayerListResponse",
-   "type": "object",
-   "description": "A list of players returned from a youtube.player.list call.",
-   "properties": {
-    "etag": {
-     "type": "string",
-     "description": "The ETag of the response."
-    },
-    "kind": {
-     "type": "string",
-     "description": "The type of the API response. For this operation, the value will be youtube#playerListResponse.",
-     "default": "youtube#playerListResponse"
-    },
-    "players": {
-     "type": "array",
-     "description": "A list of players that match the request criteria.",
-     "items": {
-      "$ref": "Player"
-     }
-    }
-   }
-  },
-  "PlayerRestrictionDetails": {
-   "id": "PlayerRestrictionDetails",
-   "type": "object",
-   "description": "Part describing if and why a video can't be played.",
-   "properties": {
-    "reason": {
-     "type": "string",
-     "description": "Detailed information about the restriction"
-    },
-    "restricted": {
-     "type": "boolean",
-     "description": "True iff the video can't be played."
-    },
-    "restriction": {
-     "type": "string",
-     "description": "A code describing the restriction class.",
-     "enum": [
-      "notAvailableInYourCountry",
-      "notAvailableOnYourPlatform",
-      "notPublished",
-      "notPurchased"
-     ],
-     "enumDescriptions": [
-      "",
-      "",
-      "",
-      ""
-     ]
-    }
-   }
-  },
-  "PlayerVideoUrl": {
-   "id": "PlayerVideoUrl",
-   "type": "object",
-   "description": "A single video format the user can access.",
-   "properties": {
-    "itag": {
-     "type": "integer",
-     "description": "itag of the video format.",
-     "format": "uint32"
-    },
-    "url": {
-     "type": "string",
-     "description": "Streamer URL serving the video."
-    }
-   }
-  },
-  "PlayerVideoUrls": {
-   "id": "PlayerVideoUrls",
-   "type": "object",
-   "description": "Part containing the URLs pointing to the video data.",
-   "properties": {
-    "restriction": {
-     "$ref": "PlayerRestrictionDetails",
-     "description": "Possible restriction to the playability of the video."
-    },
-    "url": {
-     "type": "array",
-     "description": "URLs to the formats that are available to the caller.",
-     "items": {
-      "$ref": "PlayerVideoUrl"
-     }
-    }
-   }
-  },
   "Playlist": {
    "id": "Playlist",
    "type": "object",
@@ -2083,6 +2039,10 @@
      "type": "string",
      "description": "The ETag for the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of playlist items that match the request criteria.",
@@ -2106,6 +2066,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "A token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -2196,6 +2160,10 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of playlists that match the request criteria.",
@@ -2219,6 +2187,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -2255,6 +2227,12 @@
      "description": "The date and time that the playlist was created. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.",
      "format": "date-time"
     },
+    "tags": {
+     "type": "array",
+     "items": {
+      "type": "string"
+     }
+    },
     "thumbnails": {
      "$ref": "ThumbnailDetails",
      "description": "A map of thumbnail images associated with the playlist. For each object in the map, the key is the name of the thumbnail image, and the value is an object that contains other information about the thumbnail."
@@ -2290,6 +2268,27 @@
     }
    }
   },
+  "PromotedItemId": {
+   "id": "PromotedItemId",
+   "type": "object",
+   "description": "Describes a single promoted item. It is a union of various possible types.",
+   "properties": {
+    "type": {
+     "type": "string",
+     "description": "Describes the type of the promoted item.",
+     "enum": [
+      "video"
+     ],
+     "enumDescriptions": [
+      ""
+     ]
+    },
+    "videoId": {
+     "type": "string",
+     "description": "If the promoted item represents a video, this field represents the unique YouTube ID identifying it. This field will be present only if type has the value video."
+    }
+   }
+  },
   "PropertyValue": {
    "id": "PropertyValue",
    "type": "object",
@@ -2337,6 +2336,10 @@
      "type": "string",
      "description": "The ETag for the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of results that match the search criteria.",
@@ -2360,6 +2363,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -2422,54 +2429,6 @@
   "Subscription": {
    "id": "Subscription",
    "type": "object",
-   "properties": {
-    "address": {
-     "type": "string",
-     "description": "The address of the receiving entity where notifications are delivered. Specific to the channel mechanism."
-    },
-    "channel": {
-     "type": "string",
-     "description": "The delivery channel mechanism to use for notifications"
-    },
-    "channelParams": {
-     "type": "object",
-     "description": "Additional parameters controlling delivery channel behavior",
-     "additionalProperties": {
-      "type": "string",
-      "description": "Declares a new parameter by name."
-     }
-    },
-    "clientToken": {
-     "type": "string",
-     "description": "An arbitrary string associated with the subscription that is delivered to the target address with each notification for this subscription."
-    },
-    "expiration": {
-     "type": "string",
-     "description": "The expiration instant for this subscription if it is defined.",
-     "format": "int64"
-    },
-    "id": {
-     "type": "string",
-     "description": "A UUID for the subscription"
-    },
-    "kind": {
-     "type": "string",
-     "description": "A subscription to an API resource",
-     "default": "api#subscription"
-    },
-    "topicId": {
-     "type": "string",
-     "description": "An opaque topic id that identifies the backend resource which has been subscribed to. Stable across different API versions"
-    },
-    "topicUri": {
-     "type": "string",
-     "description": "The canonicalized URI of the subscribed-to resource."
-    }
-   }
-  },
-  "Subscription2": {
-   "id": "Subscription2",
-   "type": "object",
    "description": "A subscription resource contains information about a YouTube user subscription. A subscription notifies a user when new videos are added to a channel or when another user takes one of several actions on YouTube, such as uploading a video, rating a video, or commenting on a video.",
    "properties": {
     "contentDetails": {
@@ -2525,11 +2484,15 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of subscriptions that match the request criteria.",
      "items": {
-      "$ref": "Subscription2"
+      "$ref": "Subscription"
      }
     },
     "kind": {
@@ -2548,6 +2511,10 @@
     "prevPageToken": {
      "type": "string",
      "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -2663,6 +2630,33 @@
     }
    }
   },
+  "ThumbnailListResponse": {
+   "id": "ThumbnailListResponse",
+   "type": "object",
+   "description": "A list of thumbnails returned as the response to a thumbnails.set call.",
+   "properties": {
+    "etag": {
+     "type": "string",
+     "description": "The ETag of the response."
+    },
+    "items": {
+     "type": "array",
+     "description": "A list of thumbnails.",
+     "items": {
+      "$ref": "ThumbnailDetails"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "The type of the API response. For this operation, the value will be youtube#thumbnailListResponse.",
+     "default": "youtube#thumbnailListResponse"
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
+    }
+   }
+  },
   "Video": {
    "id": "Video",
    "type": "object",
@@ -2802,6 +2796,10 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of video categories that can be associated with YouTube videos. In this map, the video category ID is the map key, and its value is the corresponding videoCategory resource.",
@@ -2813,6 +2811,10 @@
      "type": "string",
      "description": "The type of the API response. For this operation, the value will be youtube#videoCategoryListResponse.",
      "default": "youtube#videoCategoryListResponse"
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -3136,6 +3138,10 @@
      "type": "string",
      "description": "The ETag of the response."
     },
+    "eventId": {
+     "type": "string",
+     "description": "Serialized EventId of the request which produced this response."
+    },
     "items": {
      "type": "array",
      "description": "A list of videos that match the request criteria.",
@@ -3147,6 +3153,22 @@
      "type": "string",
      "description": "The type of the API response. For this operation, the value will be youtube#videoListResponse.",
      "default": "youtube#videoListResponse"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "The token that can be used as the value of the pageToken parameter to retrieve the next page in the result set."
+    },
+    "pageInfo": {
+     "$ref": "PageInfo",
+     "description": "The pageInfo object encapsulates paging information for the result set."
+    },
+    "prevPageToken": {
+     "type": "string",
+     "description": "The token that can be used as the value of the pageToken parameter to retrieve the previous page in the result set."
+    },
+    "visitorId": {
+     "type": "string",
+     "description": "The visitorId identifies the visitor."
     }
    }
   },
@@ -3687,7 +3709,7 @@
        "location": "query"
       },
       "home": {
-       "type": "string",
+       "type": "boolean",
        "description": "Set this parameter's value to true to retrieve the activity feed that displays on the YouTube home page for the currently authenticated user.",
        "location": "query"
       },
@@ -3727,6 +3749,11 @@
        "description": "The publishedBefore parameter specifies the date and time before which an activity must have occurred for that activity to be included in the API response. If the parameter value specifies a day, but not a time, then any activities that occurred that day will be excluded from the result set. The value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.",
        "format": "date-time",
        "location": "query"
+      },
+      "regionCode": {
+       "type": "string",
+       "description": "The regionCode parameter instructs the API to return results for the specified country. The parameter value is an ISO 3166-1 alpha-2 country code.",
+       "location": "query"
       }
      },
      "parameterOrder": [
@@ -3742,6 +3769,52 @@
     }
    }
   },
+  "channelBanners": {
+   "methods": {
+    "insert": {
+     "id": "youtube.channelBanners.insert",
+     "path": "channelBanners/insert",
+     "httpMethod": "POST",
+     "description": "Uploads a channel banner to YouTube.",
+     "parameters": {
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      }
+     },
+     "request": {
+      "$ref": "ChannelBannerInsertResponse"
+     },
+     "response": {
+      "$ref": "ChannelBannerInsertResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.upload"
+     ],
+     "supportsMediaUpload": true,
+     "mediaUpload": {
+      "accept": [
+       "application/octet-stream",
+       "image/jpeg",
+       "image/png"
+      ],
+      "maxSize": "6MB",
+      "protocols": {
+       "simple": {
+        "multipart": true,
+        "path": "/upload/youtube/v3/channelBanners/insert"
+       },
+       "resumable": {
+        "multipart": true,
+        "path": "/resumable/upload/youtube/v3/channelBanners/insert"
+       }
+      }
+     }
+    }
+   }
+  },
   "channels": {
    "methods": {
     "list": {
@@ -3755,6 +3828,11 @@
        "description": "The categoryId parameter specifies a YouTube guide category, thereby requesting YouTube channels associated with that category.",
        "location": "query"
       },
+      "forUsername": {
+       "type": "string",
+       "description": "The forUsername parameter specifies a YouTube username, thereby requesting the channel associated with that username.",
+       "location": "query"
+      },
       "id": {
        "type": "string",
        "description": "The id parameter specifies a comma-separated list of the YouTube channel ID(s) for the resource(s) that are being retrieved. In a channel resource, the id property specifies the channel's YouTube channel ID.",
@@ -3780,7 +3858,7 @@
        "location": "query"
       },
       "mySubscribers": {
-       "type": "string",
+       "type": "boolean",
        "description": "Set this parameter's value to true to retrieve a list of channels that subscribed to the authenticated user's channel.",
        "location": "query"
       },
@@ -3796,7 +3874,7 @@
       },
       "part": {
        "type": "string",
-       "description": "The part parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, statistics, and topicDetails.\n\nIf the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set part=contentDetails, the API response will also contain all of those nested properties.",
+       "description": "The part parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, statistics, topicDetails, and invideoPromotion.\n\nIf the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set part=contentDetails, the API response will also contain all of those nested properties.",
        "required": true,
        "location": "query"
       }
@@ -3812,6 +3890,33 @@
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
+    },
+    "update": {
+     "id": "youtube.channels.update",
+     "path": "channels",
+     "httpMethod": "PUT",
+     "description": "Updates a channel's metadata.",
+     "parameters": {
+      "part": {
+       "type": "string",
+       "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part names that you can include in the parameter value are id and invideoPromotion.\n\nNote that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies.",
+       "required": true,
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "part"
+     ],
+     "request": {
+      "$ref": "Channel"
+     },
+     "response": {
+      "$ref": "Channel"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtubepartner"
+     ]
     }
    }
   },
@@ -3874,6 +3979,11 @@
        "required": true,
        "location": "query"
       },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
       "part": {
        "type": "string",
        "description": "The part parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.",
@@ -3920,6 +4030,11 @@
        "format": "uint64",
        "location": "query"
       },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
       "part": {
        "type": "string",
        "description": "The part parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.",
@@ -3949,6 +4064,11 @@
        "description": "The id parameter specifies the YouTube live broadcast ID for the resource that is being deleted.",
        "required": true,
        "location": "query"
+      },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
       }
      },
      "parameterOrder": [
@@ -3964,6 +4084,11 @@
      "httpMethod": "POST",
      "description": "Creates a broadcast.",
      "parameters": {
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
       "part": {
        "type": "string",
        "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part properties that you can include in the parameter value are id, snippet, contentDetails, and status.",
@@ -4077,6 +4202,11 @@
        "required": true,
        "location": "query"
       },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
       "part": {
        "type": "string",
        "description": "The part parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.",
@@ -4102,6 +4232,11 @@
      "httpMethod": "PUT",
      "description": "Updates a broadcast. For example, you could modify the broadcast settings defined in the liveBroadcast resource's contentDetails object.",
      "parameters": {
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
       "part": {
        "type": "string",
        "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part properties that you can include in the parameter value are id, snippet, contentDetails, and status.\n\nNote that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a broadcast's privacy status is defined in the status part. As such, if your request is updating a private or unlisted broadcast, and the request's part parameter value includes the status part, the broadcast's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the broadcast will revert to the default privacy setting.",
@@ -4248,45 +4383,6 @@
     }
    }
   },
-  "players": {
-   "methods": {
-    "list": {
-     "id": "youtube.players.list",
-     "path": "players",
-     "httpMethod": "GET",
-     "description": "Returns the data required to play the videos specified on the request, or restriction information explaining why it can't be played.",
-     "parameters": {
-      "itag": {
-       "type": "string",
-       "description": "If specified, the itag parameter specifies a comma-separated list of itags video formats the client is interested in. The returned formats will be a subset of those itags.",
-       "location": "query"
-      },
-      "part": {
-       "type": "string",
-       "description": "The part parameter specifies a comma-separated list of one or more player resource properties that the API response will include.",
-       "required": true,
-       "location": "query"
-      },
-      "videoId": {
-       "type": "string",
-       "description": "The videoId parameter specifies a comma-separated list of the YouTube video ID(s) for the resource(s) that are being retrieved.",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "part"
-     ],
-     "response": {
-      "$ref": "PlayerListResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/youtube",
-      "https://www.googleapis.com/auth/youtube.readonly",
-      "https://www.googleapis.com/auth/youtubepartner"
-     ]
-    }
-   }
-  },
   "playlistItems": {
    "methods": {
     "delete": {
@@ -4389,7 +4485,8 @@
       "https://www.googleapis.com/auth/youtube",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
-     ]
+     ],
+     "supportsSubscription": true
     },
     "update": {
      "id": "youtube.playlistItems.update",
@@ -4600,7 +4697,7 @@
       },
       "onBehalfOfContentOwner": {
        "type": "string",
-       "description": "The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with needs to be linked to the specified YouTube content owner.",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
        "location": "query"
       },
       "order": {
@@ -4867,10 +4964,10 @@
       "part"
      ],
      "request": {
-      "$ref": "Subscription2"
+      "$ref": "Subscription"
      },
      "response": {
-      "$ref": "Subscription2"
+      "$ref": "Subscription"
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
@@ -4912,6 +5009,11 @@
        "description": "Set this parameter's value to true to retrieve a feed of the authenticated user's subscriptions.",
        "location": "query"
       },
+      "mySubscribers": {
+       "type": "boolean",
+       "description": "Set this parameter's value to true to retrieve a feed of the subscribers of the authenticated user.",
+       "location": "query"
+      },
       "order": {
        "type": "string",
        "description": "The order parameter specifies the method that will be used to sort resources in the API response.",
@@ -4951,19 +5053,54 @@
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
-    },
-    "unsubscribe": {
-     "id": "youtube.subscriptions.unsubscribe",
-     "path": "subscriptions/unsubscribe",
+    }
+   }
+  },
+  "thumbnails": {
+   "methods": {
+    "set": {
+     "id": "youtube.thumbnails.set",
+     "path": "thumbnails/set",
      "httpMethod": "POST",
-     "request": {
-      "$ref": "Subscription"
+     "description": "Uploads a custom video thumbnail to YouTube and sets it for a video.",
+     "parameters": {
+      "videoId": {
+       "type": "string",
+       "description": "The videoId parameter specifies a YouTube video ID for which the custom video thumbnail is being provided.",
+       "required": true,
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "videoId"
+     ],
+     "response": {
+      "$ref": "ThumbnailListResponse"
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
-      "https://www.googleapis.com/auth/youtube.readonly",
+      "https://www.googleapis.com/auth/youtube.upload",
       "https://www.googleapis.com/auth/youtubepartner"
-     ]
+     ],
+     "supportsMediaUpload": true,
+     "mediaUpload": {
+      "accept": [
+       "application/octet-stream",
+       "image/jpeg",
+       "image/png"
+      ],
+      "maxSize": "2MB",
+      "protocols": {
+       "simple": {
+        "multipart": true,
+        "path": "/upload/youtube/v3/thumbnails/set"
+       },
+       "resumable": {
+        "multipart": true,
+        "path": "/resumable/upload/youtube/v3/thumbnails/set"
+       }
+      }
+     }
     }
    }
   },
@@ -5025,6 +5162,11 @@
        "description": "The id parameter specifies the YouTube video ID for the resource that is being deleted. In a video resource, the id property specifies the video's ID.",
        "required": true,
        "location": "query"
+      },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
       }
      },
      "parameterOrder": [
@@ -5046,6 +5188,11 @@
        "description": "The id parameter specifies a comma-separated list of the YouTube video ID(s) for the resource(s) that are being retrieved. In a video resource, the id property specifies the video's ID.",
        "required": true,
        "location": "query"
+      },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
       }
      },
      "parameterOrder": [
@@ -5065,11 +5212,31 @@
      "httpMethod": "POST",
      "description": "Uploads a video to YouTube and optionally sets the video's metadata.",
      "parameters": {
+      "autoLevels": {
+       "type": "boolean",
+       "description": "The autoLevels parameter specifies whether the video should be auto-leveled by YouTube.",
+       "location": "query"
+      },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
+      "onBehalfOfContentOwnerChannel": {
+       "type": "string",
+       "description": "This parameter can only be used in a properly authorized request. Note: This parameter is intended exclusively for YouTube content partners.\n\nThe onBehalfOfContentOwnerChannel parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the channel specified in the parameter value. This parameter must be used in conjunction with the onBehalfOfContentOwner parameter, and the user must be authenticated using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. In addition, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies.\n\nThis parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.",
+       "location": "query"
+      },
       "part": {
        "type": "string",
        "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part names that you can include in the parameter value are snippet, contentDetails, player, statistics, status, and topicDetails. However, not all of those parts contain properties that can be set when setting or updating a video's metadata. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.",
        "required": true,
        "location": "query"
+      },
+      "stabilize": {
+       "type": "boolean",
+       "description": "The stabilize parameter specifies whether the video should be stabilized by YouTube.",
+       "location": "query"
       }
      },
      "parameterOrder": [
@@ -5114,12 +5281,38 @@
       "id": {
        "type": "string",
        "description": "The id parameter specifies a comma-separated list of the YouTube video ID(s) for the resource(s) that are being retrieved. In a video resource, the id property specifies the video's ID.",
-       "required": true,
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "USE_DESCRIPTION --- channels:list:maxResults",
+       "default": "5",
+       "format": "uint32",
+       "minimum": "1",
+       "maximum": "50",
+       "location": "query"
+      },
+      "myRating": {
+       "type": "string",
+       "description": "Set this parameter's value to like or dislike to instruct the API to only return videos liked or disliked by the authenticated user.",
+       "enum": [
+        "dislike",
+        "like"
+       ],
+       "enumDescriptions": [
+        "Returns only videos disliked by the authenticated user.",
+        "Returns only video liked by the authenticated user."
+       ],
        "location": "query"
       },
       "onBehalfOfContentOwner": {
        "type": "string",
-       "description": "The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with needs to be linked to the specified YouTube content owner.",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:pageToken",
        "location": "query"
       },
       "part": {
@@ -5130,7 +5323,6 @@
       }
      },
      "parameterOrder": [
-      "id",
       "part"
      ],
      "response": {
@@ -5154,6 +5346,11 @@
        "required": true,
        "location": "query"
       },
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
       "rating": {
        "type": "string",
        "description": "Specifies the rating to record.",
@@ -5186,6 +5383,11 @@
      "httpMethod": "PUT",
      "description": "Updates a video's metadata.",
      "parameters": {
+      "onBehalfOfContentOwner": {
+       "type": "string",
+       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+       "location": "query"
+      },
       "part": {
        "type": "string",
        "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part names that you can include in the parameter value are snippet, contentDetails, player, statistics, status, and topicDetails.\n\nNote that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting.\n\nIn addition, not all of those parts contain properties that can be set when setting or updating a video's metadata. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.",
diff --git a/youtube/v3/youtube-gen.go b/youtube/v3/youtube-gen.go
index 3ff3d3d..36918a4 100644
--- a/youtube/v3/youtube-gen.go
+++ b/youtube/v3/youtube-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "youtube:v3"
 const apiName = "youtube"
@@ -57,15 +60,16 @@
 	}
 	s := &Service{client: client}
 	s.Activities = NewActivitiesService(s)
+	s.ChannelBanners = NewChannelBannersService(s)
 	s.Channels = NewChannelsService(s)
 	s.GuideCategories = NewGuideCategoriesService(s)
 	s.LiveBroadcasts = NewLiveBroadcastsService(s)
 	s.LiveStreams = NewLiveStreamsService(s)
-	s.Players = NewPlayersService(s)
 	s.PlaylistItems = NewPlaylistItemsService(s)
 	s.Playlists = NewPlaylistsService(s)
 	s.Search = NewSearchService(s)
 	s.Subscriptions = NewSubscriptionsService(s)
+	s.Thumbnails = NewThumbnailsService(s)
 	s.VideoCategories = NewVideoCategoriesService(s)
 	s.Videos = NewVideosService(s)
 	return s, nil
@@ -76,6 +80,8 @@
 
 	Activities *ActivitiesService
 
+	ChannelBanners *ChannelBannersService
+
 	Channels *ChannelsService
 
 	GuideCategories *GuideCategoriesService
@@ -84,8 +90,6 @@
 
 	LiveStreams *LiveStreamsService
 
-	Players *PlayersService
-
 	PlaylistItems *PlaylistItemsService
 
 	Playlists *PlaylistsService
@@ -94,6 +98,8 @@
 
 	Subscriptions *SubscriptionsService
 
+	Thumbnails *ThumbnailsService
+
 	VideoCategories *VideoCategoriesService
 
 	Videos *VideosService
@@ -108,6 +114,15 @@
 	s *Service
 }
 
+func NewChannelBannersService(s *Service) *ChannelBannersService {
+	rs := &ChannelBannersService{s: s}
+	return rs
+}
+
+type ChannelBannersService struct {
+	s *Service
+}
+
 func NewChannelsService(s *Service) *ChannelsService {
 	rs := &ChannelsService{s: s}
 	return rs
@@ -144,15 +159,6 @@
 	s *Service
 }
 
-func NewPlayersService(s *Service) *PlayersService {
-	rs := &PlayersService{s: s}
-	return rs
-}
-
-type PlayersService struct {
-	s *Service
-}
-
 func NewPlaylistItemsService(s *Service) *PlaylistItemsService {
 	rs := &PlaylistItemsService{s: s}
 	return rs
@@ -189,6 +195,15 @@
 	s *Service
 }
 
+func NewThumbnailsService(s *Service) *ThumbnailsService {
+	rs := &ThumbnailsService{s: s}
+	return rs
+}
+
+type ThumbnailsService struct {
+	s *Service
+}
+
 func NewVideoCategoriesService(s *Service) *VideoCategoriesService {
 	rs := &VideoCategoriesService{s: s}
 	return rs
@@ -349,6 +364,17 @@
 	// user was shown this promoted item.
 	CreativeViewUrl string `json:"creativeViewUrl,omitempty"`
 
+	// CtaType: The type of call-to-action, a message to the user indicating
+	// action that can be taken.
+	CtaType string `json:"ctaType,omitempty"`
+
+	// DescriptionText: The text description to accompany the promoted item.
+	DescriptionText string `json:"descriptionText,omitempty"`
+
+	// DestinationUrl: The URL the client should direct the user to, if the
+	// user chooses to visit the advertiser's website.
+	DestinationUrl string `json:"destinationUrl,omitempty"`
+
 	// VideoId: The ID that YouTube uses to uniquely identify the promoted
 	// video.
 	VideoId string `json:"videoId,omitempty"`
@@ -401,6 +427,10 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of activities, or events, that match the request
 	// criteria.
 	Items []*Activity `json:"items,omitempty"`
@@ -420,6 +450,9 @@
 	// PrevPageToken: The token that can be used as the value of the
 	// pageToken parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type ActivitySnippet struct {
@@ -461,28 +494,6 @@
 	Type string `json:"type,omitempty"`
 }
 
-type CallToAction struct {
-	CallToActionId string `json:"callToActionId,omitempty"`
-
-	Description1 string `json:"description1,omitempty"`
-
-	Description2 string `json:"description2,omitempty"`
-
-	DestinationUrl string `json:"destinationUrl,omitempty"`
-
-	DisplayUrl string `json:"displayUrl,omitempty"`
-
-	EndTimeMs int64 `json:"endTimeMs,omitempty,string"`
-
-	Headline string `json:"headline,omitempty"`
-
-	HideTimeMs int64 `json:"hideTimeMs,omitempty,string"`
-
-	ImageUrl string `json:"imageUrl,omitempty"`
-
-	StartTimeMs int64 `json:"startTimeMs,omitempty,string"`
-}
-
 type Channel struct {
 	// BrandingSettings: The brandingSettings object encapsulates
 	// information about the branding of the channel.
@@ -502,6 +513,10 @@
 	// Id: The ID that YouTube uses to uniquely identify the channel.
 	Id string `json:"id,omitempty"`
 
+	// InvideoPromotion: The invideoPromotion object encapsulates
+	// information about promotion campaign associated with the channel.
+	InvideoPromotion *InvideoPromotion `json:"invideoPromotion,omitempty"`
+
 	// Kind: The type of the API resource. For channel resources, the value
 	// will be youtube#channel.
 	Kind string `json:"kind,omitempty"`
@@ -523,6 +538,18 @@
 	TopicDetails *ChannelTopicDetails `json:"topicDetails,omitempty"`
 }
 
+type ChannelBannerInsertResponse struct {
+	// Etag: The ETag of the response.
+	Etag string `json:"etag,omitempty"`
+
+	// Kind: The type of the API response. For this operation, the value
+	// will be youtube#channelBannerInsertResponse.
+	Kind string `json:"kind,omitempty"`
+
+	// Url: The URL of this banner image.
+	Url string `json:"url,omitempty"`
+}
+
 type ChannelBrandingSettings struct {
 	// Channel: Branding properties for the channel view.
 	Channel *ChannelSettings `json:"channel,omitempty"`
@@ -602,6 +629,10 @@
 	// Etag: The ETag for the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of channels that match the request criteria.
 	Items []*Channel `json:"items,omitempty"`
 
@@ -620,6 +651,9 @@
 	// PrevPageToken: The token that can be used as the value of the
 	// pageToken parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type ChannelSettings struct {
@@ -644,6 +678,10 @@
 	// page need to be approved by the channel owner to be publicly visible.
 	ModerateComments bool `json:"moderateComments,omitempty"`
 
+	// ProfileColor: A prominent color that can be rendered on this channel
+	// page.
+	ProfileColor string `json:"profileColor,omitempty"`
+
 	// ShowBrowseView: Whether the tab to browse the videos should be
 	// displayed.
 	ShowBrowseView bool `json:"showBrowseView,omitempty"`
@@ -696,6 +734,11 @@
 }
 
 type ChannelStatus struct {
+	// IsLinked: If true, then the user is linked to either a YouTube
+	// username or G+ account. Otherwise, the user doesn't have a public
+	// YouTube identity.
+	IsLinked bool `json:"isLinked,omitempty"`
+
 	// PrivacyStatus: Privacy status of the channel.
 	PrivacyStatus string `json:"privacyStatus,omitempty"`
 }
@@ -760,44 +803,9 @@
 
 	// TvpgRating: TV Parental Guidelines rating of the content.
 	TvpgRating string `json:"tvpgRating,omitempty"`
-}
 
-type FeaturedChannel struct {
-	// ChannelId: External id of the featured channel.
-	ChannelId string `json:"channelId,omitempty"`
-
-	// ChannelSnippet: Contains further information about the featured
-	// channel.
-	ChannelSnippet *ChannelSnippet `json:"channelSnippet,omitempty"`
-
-	// EndTimeMs: Stop showing the feature at this playback time.
-	EndTimeMs int64 `json:"endTimeMs,omitempty,string"`
-
-	// FeatureId: Id of this feature (for logging).
-	FeatureId string `json:"featureId,omitempty"`
-
-	// StartTimeMs: Start showing the feature at this playback time.
-	StartTimeMs int64 `json:"startTimeMs,omitempty,string"`
-
-	// WatermarkUrl: URL of the default/custom image url.
-	WatermarkUrl string `json:"watermarkUrl,omitempty"`
-}
-
-type FeaturedVideo struct {
-	// EndTimeMs: Stop showing the feature at the playback time.
-	EndTimeMs int64 `json:"endTimeMs,omitempty,string"`
-
-	// FeatureId: Id of this feature (for logging).
-	FeatureId string `json:"featureId,omitempty"`
-
-	// StartTimeMs: Start showing the feature at this playback time.
-	StartTimeMs int64 `json:"startTimeMs,omitempty,string"`
-
-	// VideoId: The external id of the featured video.
-	VideoId string `json:"videoId,omitempty"`
-
-	// VideoSnippet: Contains further information about the featured video.
-	VideoSnippet *VideoSnippet `json:"videoSnippet,omitempty"`
+	// YtRating: Internal YouTube rating.
+	YtRating string `json:"ytRating,omitempty"`
 }
 
 type GeoPoint struct {
@@ -831,6 +839,10 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of categories that can be associated with YouTube
 	// channels. In this map, the category ID is the map key, and its value
 	// is the corresponding guideCategory resource.
@@ -839,6 +851,9 @@
 	// Kind: The type of the API response. For this operation, the value
 	// will be youtube#guideCategoryListResponse.
 	Kind string `json:"kind,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type GuideCategorySnippet struct {
@@ -856,6 +871,10 @@
 	// file size of 128k.
 	BackgroundImageUrl *LocalizedProperty `json:"backgroundImageUrl,omitempty"`
 
+	// BannerExternalUrl: This is used only in update requests; if it's set,
+	// we use this URL to generate all of the above banner URLs.
+	BannerExternalUrl string `json:"bannerExternalUrl,omitempty"`
+
 	// BannerImageUrl: Banner image. Desktop size (1060x175).
 	BannerImageUrl string `json:"bannerImageUrl,omitempty"`
 
@@ -924,16 +943,40 @@
 	WatchIconImageUrl string `json:"watchIconImageUrl,omitempty"`
 }
 
-type InvideoFeature struct {
-	CallToAction *CallToAction `json:"callToAction,omitempty"`
+type InvideoPosition struct {
+	// CornerPosition: Describes in which corner of the video the visual
+	// widget will appear.
+	CornerPosition string `json:"cornerPosition,omitempty"`
 
-	// FeaturedChannel: If present, the playback should display a featured
-	// channel.
-	FeaturedChannel *FeaturedChannel `json:"featuredChannel,omitempty"`
+	// Type: Defines the position type.
+	Type string `json:"type,omitempty"`
+}
 
-	// FeaturedVideo: If present, the playback should display a featured
-	// video.
-	FeaturedVideo *FeaturedVideo `json:"featuredVideo,omitempty"`
+type InvideoPromotion struct {
+	// Items: List of promoted items in decreasing priority.
+	Items []*PromotedItemId `json:"items,omitempty"`
+
+	// Position: The spatial position within the video where the promoted
+	// item will be displayed.
+	Position *InvideoPosition `json:"position,omitempty"`
+
+	// Timing: The temporal position within the video where the promoted
+	// item will be displayed.
+	Timing *InvideoTiming `json:"timing,omitempty"`
+}
+
+type InvideoTiming struct {
+	// OffsetMs: Defines the time at which the promotion will appear.
+	// Depending on the value of type the value of the offsetMs field will
+	// represent a time offset from the start or from the end of the video,
+	// expressed in milliseconds.
+	OffsetMs uint64 `json:"offsetMs,omitempty,string"`
+
+	// Type: Describes a timing type. If the value is offsetFromStart, then
+	// the offsetMs field represents an offset from the start of the video.
+	// If the value is offsetFromEnd, then the offsetMs field represents an
+	// offset from the end of the video.
+	Type string `json:"type,omitempty"`
 }
 
 type LiveBroadcast struct {
@@ -1042,6 +1085,10 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of broadcasts that match the request criteria.
 	Items []*LiveBroadcast `json:"items,omitempty"`
 
@@ -1060,6 +1107,9 @@
 	// PrevPageToken: The token that can be used as the value of the
 	// pageToken parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type LiveBroadcastSnippet struct {
@@ -1123,6 +1173,9 @@
 	// you can set this field by modifying the broadcast resource or by
 	// setting the privacyStatus field of the corresponding video resource.
 	PrivacyStatus string `json:"privacyStatus,omitempty"`
+
+	// RecordingStatus: The broadcast's recording status.
+	RecordingStatus string `json:"recordingStatus,omitempty"`
 }
 
 type LiveStream struct {
@@ -1193,6 +1246,10 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of live streams that match the request criteria.
 	Items []*LiveStream `json:"items,omitempty"`
 
@@ -1211,6 +1268,9 @@
 	// PrevPageToken: The token that can be used as the value of the
 	// pageToken parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type LiveStreamSnippet struct {
@@ -1260,73 +1320,6 @@
 	TotalResults int64 `json:"totalResults,omitempty"`
 }
 
-type Player struct {
-	// AdsPlaylist: The playlist of video ads to show for this playback.
-	AdsPlaylist *PlayerAdsPlaylist `json:"adsPlaylist,omitempty"`
-
-	// Etag: The ETag for the player resource.
-	Etag string `json:"etag,omitempty"`
-
-	// Id: The ID that YouTube uses to uniquely identify the resource.
-	Id *ResourceId `json:"id,omitempty"`
-
-	// InvideoFeature: The invideo features for the video.
-	InvideoFeature *InvideoFeature `json:"invideoFeature,omitempty"`
-
-	// Kind: The type of the API resource.
-	Kind string `json:"kind,omitempty"`
-
-	// VideoUrls: The videoUrls object either contains restriction
-	// information or URLs giving access to the content.
-	VideoUrls *PlayerVideoUrls `json:"videoUrls,omitempty"`
-}
-
-type PlayerAdsPlaylist struct {
-	// Vmap_xml: The VMAP XML document that describes where ads should be
-	// inserted and what ad formats should be used in those ad breaks. See
-	// http://www.iab.net/vmap.
-	Vmap_xml string `json:"vmap_xml,omitempty"`
-}
-
-type PlayerListResponse struct {
-	// Etag: The ETag of the response.
-	Etag string `json:"etag,omitempty"`
-
-	// Kind: The type of the API response. For this operation, the value
-	// will be youtube#playerListResponse.
-	Kind string `json:"kind,omitempty"`
-
-	// Players: A list of players that match the request criteria.
-	Players []*Player `json:"players,omitempty"`
-}
-
-type PlayerRestrictionDetails struct {
-	// Reason: Detailed information about the restriction
-	Reason string `json:"reason,omitempty"`
-
-	// Restricted: True iff the video can't be played.
-	Restricted bool `json:"restricted,omitempty"`
-
-	// Restriction: A code describing the restriction class.
-	Restriction string `json:"restriction,omitempty"`
-}
-
-type PlayerVideoUrl struct {
-	// Itag: itag of the video format.
-	Itag int64 `json:"itag,omitempty"`
-
-	// Url: Streamer URL serving the video.
-	Url string `json:"url,omitempty"`
-}
-
-type PlayerVideoUrls struct {
-	// Restriction: Possible restriction to the playability of the video.
-	Restriction *PlayerRestrictionDetails `json:"restriction,omitempty"`
-
-	// Url: URLs to the formats that are available to the caller.
-	Url []*PlayerVideoUrl `json:"url,omitempty"`
-}
-
 type Playlist struct {
 	// ContentDetails: The contentDetails object contains information like
 	// video count.
@@ -1412,6 +1405,10 @@
 	// Etag: The ETag for the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of playlist items that match the request criteria.
 	Items []*PlaylistItem `json:"items,omitempty"`
 
@@ -1430,6 +1427,9 @@
 	// PrevPageToken: A token that can be used as the value of the pageToken
 	// parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type PlaylistItemSnippet struct {
@@ -1482,6 +1482,10 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of playlists that match the request criteria.
 	Items []*Playlist `json:"items,omitempty"`
 
@@ -1500,6 +1504,9 @@
 	// PrevPageToken: The token that can be used as the value of the
 	// pageToken parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type PlaylistPlayer struct {
@@ -1524,6 +1531,8 @@
 	// value is specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.
 	PublishedAt string `json:"publishedAt,omitempty"`
 
+	Tags []string `json:"tags,omitempty"`
+
 	// Thumbnails: A map of thumbnail images associated with the playlist.
 	// For each object in the map, the key is the name of the thumbnail
 	// image, and the value is an object that contains other information
@@ -1539,6 +1548,16 @@
 	PrivacyStatus string `json:"privacyStatus,omitempty"`
 }
 
+type PromotedItemId struct {
+	// Type: Describes the type of the promoted item.
+	Type string `json:"type,omitempty"`
+
+	// VideoId: If the promoted item represents a video, this field
+	// represents the unique YouTube ID identifying it. This field will be
+	// present only if type has the value video.
+	VideoId string `json:"videoId,omitempty"`
+}
+
 type PropertyValue struct {
 	// Property: A property.
 	Property string `json:"property,omitempty"`
@@ -1571,6 +1590,10 @@
 	// Etag: The ETag for the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of results that match the search criteria.
 	Items []*SearchResult `json:"items,omitempty"`
 
@@ -1589,6 +1612,9 @@
 	// PrevPageToken: The token that can be used as the value of the
 	// pageToken parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type SearchResult struct {
@@ -1638,44 +1664,6 @@
 }
 
 type Subscription struct {
-	// Address: The address of the receiving entity where notifications are
-	// delivered. Specific to the channel mechanism.
-	Address string `json:"address,omitempty"`
-
-	// Channel: The delivery channel mechanism to use for notifications
-	Channel string `json:"channel,omitempty"`
-
-	// ChannelParams: Additional parameters controlling delivery channel
-	// behavior
-	ChannelParams *SubscriptionChannelParams `json:"channelParams,omitempty"`
-
-	// ClientToken: An arbitrary string associated with the subscription
-	// that is delivered to the target address with each notification for
-	// this subscription.
-	ClientToken string `json:"clientToken,omitempty"`
-
-	// Expiration: The expiration instant for this subscription if it is
-	// defined.
-	Expiration int64 `json:"expiration,omitempty,string"`
-
-	// Id: A UUID for the subscription
-	Id string `json:"id,omitempty"`
-
-	// Kind: A subscription to an API resource
-	Kind string `json:"kind,omitempty"`
-
-	// TopicId: An opaque topic id that identifies the backend resource
-	// which has been subscribed to. Stable across different API versions
-	TopicId string `json:"topicId,omitempty"`
-
-	// TopicUri: The canonicalized URI of the subscribed-to resource.
-	TopicUri string `json:"topicUri,omitempty"`
-}
-
-type SubscriptionChannelParams struct {
-}
-
-type Subscription2 struct {
 	// ContentDetails: The contentDetails object contains basic statistics
 	// about the subscription.
 	ContentDetails *SubscriptionContentDetails `json:"contentDetails,omitempty"`
@@ -1714,8 +1702,12 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of subscriptions that match the request criteria.
-	Items []*Subscription2 `json:"items,omitempty"`
+	Items []*Subscription `json:"items,omitempty"`
 
 	// Kind: The type of the API response. For this operation, the value
 	// will be youtube#subscriptionListResponse.
@@ -1732,6 +1724,9 @@
 	// PrevPageToken: The token that can be used as the value of the
 	// pageToken parameter to retrieve the previous page in the result set.
 	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type SubscriptionSnippet struct {
@@ -1806,6 +1801,21 @@
 	Standard *Thumbnail `json:"standard,omitempty"`
 }
 
+type ThumbnailListResponse struct {
+	// Etag: The ETag of the response.
+	Etag string `json:"etag,omitempty"`
+
+	// Items: A list of thumbnails.
+	Items []*ThumbnailDetails `json:"items,omitempty"`
+
+	// Kind: The type of the API response. For this operation, the value
+	// will be youtube#thumbnailListResponse.
+	Kind string `json:"kind,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
+}
+
 type Video struct {
 	// AgeGatingDetails: Age restriction details related to a video.
 	AgeGatingDetails *VideoAgeGating `json:"ageGatingDetails,omitempty"`
@@ -1926,6 +1936,10 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of video categories that can be associated with YouTube
 	// videos. In this map, the video category ID is the map key, and its
 	// value is the corresponding videoCategory resource.
@@ -1934,6 +1948,9 @@
 	// Kind: The type of the API response. For this operation, the value
 	// will be youtube#videoCategoryListResponse.
 	Kind string `json:"kind,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type VideoCategorySnippet struct {
@@ -2137,12 +2154,31 @@
 	// Etag: The ETag of the response.
 	Etag string `json:"etag,omitempty"`
 
+	// EventId: Serialized EventId of the request which produced this
+	// response.
+	EventId string `json:"eventId,omitempty"`
+
 	// Items: A list of videos that match the request criteria.
 	Items []*Video `json:"items,omitempty"`
 
 	// Kind: The type of the API response. For this operation, the value
 	// will be youtube#videoListResponse.
 	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: The token that can be used as the value of the
+	// pageToken parameter to retrieve the next page in the result set.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// PageInfo: The pageInfo object encapsulates paging information for the
+	// result set.
+	PageInfo *PageInfo `json:"pageInfo,omitempty"`
+
+	// PrevPageToken: The token that can be used as the value of the
+	// pageToken parameter to retrieve the previous page in the result set.
+	PrevPageToken string `json:"prevPageToken,omitempty"`
+
+	// VisitorId: The visitorId identifies the visitor.
+	VisitorId string `json:"visitorId,omitempty"`
 }
 
 type VideoMonetizationDetails struct {
@@ -2435,12 +2471,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "activities")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2508,7 +2546,7 @@
 // Home sets the optional parameter "home": Set this parameter's value
 // to true to retrieve the activity feed that displays on the YouTube
 // home page for the currently authenticated user.
-func (c *ActivitiesListCall) Home(home string) *ActivitiesListCall {
+func (c *ActivitiesListCall) Home(home bool) *ActivitiesListCall {
 	c.opt_["home"] = home
 	return c
 }
@@ -2558,6 +2596,14 @@
 	return c
 }
 
+// RegionCode sets the optional parameter "regionCode": The regionCode
+// parameter instructs the API to return results for the specified
+// country. The parameter value is an ISO 3166-1 alpha-2 country code.
+func (c *ActivitiesListCall) RegionCode(regionCode string) *ActivitiesListCall {
+	c.opt_["regionCode"] = regionCode
+	return c
+}
+
 func (c *ActivitiesListCall) Do() (*ActivityListResponse, error) {
 	var body io.Reader = nil
 	params := make(url.Values)
@@ -2584,14 +2630,19 @@
 	if v, ok := c.opt_["publishedBefore"]; ok {
 		params.Set("publishedBefore", fmt.Sprintf("%v", v))
 	}
+	if v, ok := c.opt_["regionCode"]; ok {
+		params.Set("regionCode", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "activities")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2616,7 +2667,7 @@
 	//     "home": {
 	//       "description": "Set this parameter's value to true to retrieve the activity feed that displays on the YouTube home page for the currently authenticated user.",
 	//       "location": "query",
-	//       "type": "string"
+	//       "type": "boolean"
 	//     },
 	//     "maxResults": {
 	//       "default": "5",
@@ -2654,6 +2705,11 @@
 	//       "format": "date-time",
 	//       "location": "query",
 	//       "type": "string"
+	//     },
+	//     "regionCode": {
+	//       "description": "The regionCode parameter instructs the API to return results for the specified country. The parameter value is an ISO 3166-1 alpha-2 country code.",
+	//       "location": "query",
+	//       "type": "string"
 	//     }
 	//   },
 	//   "path": "activities",
@@ -2668,6 +2724,118 @@
 
 }
 
+// method id "youtube.channelBanners.insert":
+
+type ChannelBannersInsertCall struct {
+	s                           *Service
+	channelbannerinsertresponse *ChannelBannerInsertResponse
+	opt_                        map[string]interface{}
+	media_                      io.Reader
+}
+
+// Insert: Uploads a channel banner to YouTube.
+func (r *ChannelBannersService) Insert(channelbannerinsertresponse *ChannelBannerInsertResponse) *ChannelBannersInsertCall {
+	c := &ChannelBannersInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.channelbannerinsertresponse = channelbannerinsertresponse
+	return c
+}
+
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *ChannelBannersInsertCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *ChannelBannersInsertCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+func (c *ChannelBannersInsertCall) Media(r io.Reader) *ChannelBannersInsertCall {
+	c.media_ = r
+	return c
+}
+
+func (c *ChannelBannersInsertCall) Do() (*ChannelBannerInsertResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channelbannerinsertresponse)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "channelBanners/insert")
+	if c.media_ != nil {
+		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
+		params.Set("uploadType", "multipart")
+	}
+	urls += "?" + params.Encode()
+	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	if hasMedia_ {
+		req.ContentLength = contentLength_
+	}
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(ChannelBannerInsertResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Uploads a channel banner to YouTube.",
+	//   "httpMethod": "POST",
+	//   "id": "youtube.channelBanners.insert",
+	//   "mediaUpload": {
+	//     "accept": [
+	//       "application/octet-stream",
+	//       "image/jpeg",
+	//       "image/png"
+	//     ],
+	//     "maxSize": "6MB",
+	//     "protocols": {
+	//       "resumable": {
+	//         "multipart": true,
+	//         "path": "/resumable/upload/youtube/v3/channelBanners/insert"
+	//       },
+	//       "simple": {
+	//         "multipart": true,
+	//         "path": "/upload/youtube/v3/channelBanners/insert"
+	//       }
+	//     }
+	//   },
+	//   "parameters": {
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "channelBanners/insert",
+	//   "request": {
+	//     "$ref": "ChannelBannerInsertResponse"
+	//   },
+	//   "response": {
+	//     "$ref": "ChannelBannerInsertResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.upload"
+	//   ],
+	//   "supportsMediaUpload": true
+	// }
+
+}
+
 // method id "youtube.channels.list":
 
 type ChannelsListCall struct {
@@ -2692,6 +2860,14 @@
 	return c
 }
 
+// ForUsername sets the optional parameter "forUsername": The
+// forUsername parameter specifies a YouTube username, thereby
+// requesting the channel associated with that username.
+func (c *ChannelsListCall) ForUsername(forUsername string) *ChannelsListCall {
+	c.opt_["forUsername"] = forUsername
+	return c
+}
+
 // Id sets the optional parameter "id": The id parameter specifies a
 // comma-separated list of the YouTube channel ID(s) for the resource(s)
 // that are being retrieved. In a channel resource, the id property
@@ -2731,7 +2907,7 @@
 // MySubscribers sets the optional parameter "mySubscribers": Set this
 // parameter's value to true to retrieve a list of channels that
 // subscribed to the authenticated user's channel.
-func (c *ChannelsListCall) MySubscribers(mySubscribers string) *ChannelsListCall {
+func (c *ChannelsListCall) MySubscribers(mySubscribers bool) *ChannelsListCall {
 	c.opt_["mySubscribers"] = mySubscribers
 	return c
 }
@@ -2768,6 +2944,9 @@
 	if v, ok := c.opt_["categoryId"]; ok {
 		params.Set("categoryId", fmt.Sprintf("%v", v))
 	}
+	if v, ok := c.opt_["forUsername"]; ok {
+		params.Set("forUsername", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["id"]; ok {
 		params.Set("id", fmt.Sprintf("%v", v))
 	}
@@ -2792,11 +2971,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "channels")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -2818,6 +2999,11 @@
 	//       "location": "query",
 	//       "type": "string"
 	//     },
+	//     "forUsername": {
+	//       "description": "The forUsername parameter specifies a YouTube username, thereby requesting the channel associated with that username.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "id": {
 	//       "description": "The id parameter specifies a comma-separated list of the YouTube channel ID(s) for the resource(s) that are being retrieved. In a channel resource, the id property specifies the channel's YouTube channel ID.",
 	//       "location": "query",
@@ -2845,7 +3031,7 @@
 	//     "mySubscribers": {
 	//       "description": "Set this parameter's value to true to retrieve a list of channels that subscribed to the authenticated user's channel.",
 	//       "location": "query",
-	//       "type": "string"
+	//       "type": "boolean"
 	//     },
 	//     "onBehalfOfContentOwner": {
 	//       "description": "The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with needs to be linked to the specified YouTube content owner.",
@@ -2858,7 +3044,7 @@
 	//       "type": "string"
 	//     },
 	//     "part": {
-	//       "description": "The part parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, statistics, and topicDetails.\n\nIf the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set part=contentDetails, the API response will also contain all of those nested properties.",
+	//       "description": "The part parameter specifies a comma-separated list of one or more channel resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, statistics, topicDetails, and invideoPromotion.\n\nIf the parameter identifies a property that contains child properties, the child properties will be included in the response. For example, in a channel resource, the contentDetails property contains other properties, such as the uploads properties. As such, if you set part=contentDetails, the API response will also contain all of those nested properties.",
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
@@ -2877,6 +3063,82 @@
 
 }
 
+// method id "youtube.channels.update":
+
+type ChannelsUpdateCall struct {
+	s       *Service
+	part    string
+	channel *Channel
+	opt_    map[string]interface{}
+}
+
+// Update: Updates a channel's metadata.
+func (r *ChannelsService) Update(part string, channel *Channel) *ChannelsUpdateCall {
+	c := &ChannelsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.part = part
+	c.channel = channel
+	return c
+}
+
+func (c *ChannelsUpdateCall) Do() (*Channel, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("part", fmt.Sprintf("%v", c.part))
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "channels")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer res.Body.Close()
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := new(Channel)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a channel's metadata.",
+	//   "httpMethod": "PUT",
+	//   "id": "youtube.channels.update",
+	//   "parameterOrder": [
+	//     "part"
+	//   ],
+	//   "parameters": {
+	//     "part": {
+	//       "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part names that you can include in the parameter value are id and invideoPromotion.\n\nNote that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "channels",
+	//   "request": {
+	//     "$ref": "Channel"
+	//   },
+	//   "response": {
+	//     "$ref": "Channel"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtubepartner"
+	//   ]
+	// }
+
+}
+
 // method id "youtube.guideCategories.list":
 
 type GuideCategoriesListCall struct {
@@ -2935,11 +3197,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "guideCategories")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3011,6 +3275,14 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *LiveBroadcastsBindCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *LiveBroadcastsBindCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 // StreamId sets the optional parameter "streamId": The streamId
 // parameter specifies the unique ID of the video stream that is being
 // bound to a broadcast. If this parameter is omitted, the API will
@@ -3026,17 +3298,22 @@
 	params.Set("alt", "json")
 	params.Set("id", fmt.Sprintf("%v", c.id))
 	params.Set("part", fmt.Sprintf("%v", c.part))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["streamId"]; ok {
 		params.Set("streamId", fmt.Sprintf("%v", v))
 	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveBroadcasts/bind")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3060,6 +3337,11 @@
 	//       "required": true,
 	//       "type": "string"
 	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "part": {
 	//       "description": "The part parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.",
 	//       "location": "query",
@@ -3126,6 +3408,14 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *LiveBroadcastsControlCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *LiveBroadcastsControlCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *LiveBroadcastsControlCall) Do() (*LiveBroadcast, error) {
 	var body io.Reader = nil
 	params := make(url.Values)
@@ -3138,14 +3428,19 @@
 	if v, ok := c.opt_["offsetTimeMs"]; ok {
 		params.Set("offsetTimeMs", fmt.Sprintf("%v", v))
 	}
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveBroadcasts/control")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3180,6 +3475,11 @@
 	//       "location": "query",
 	//       "type": "string"
 	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "part": {
 	//       "description": "The part parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.",
 	//       "location": "query",
@@ -3213,19 +3513,32 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *LiveBroadcastsDeleteCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *LiveBroadcastsDeleteCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *LiveBroadcastsDeleteCall) Do() error {
 	var body io.Reader = nil
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("id", fmt.Sprintf("%v", c.id))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveBroadcasts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3243,6 +3556,11 @@
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
+	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
 	//     }
 	//   },
 	//   "path": "liveBroadcasts",
@@ -3270,6 +3588,14 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *LiveBroadcastsInsertCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *LiveBroadcastsInsertCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *LiveBroadcastsInsertCall) Do() (*LiveBroadcast, error) {
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livebroadcast)
@@ -3280,15 +3606,20 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("part", fmt.Sprintf("%v", c.part))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveBroadcasts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3305,6 +3636,11 @@
 	//     "part"
 	//   ],
 	//   "parameters": {
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "part": {
 	//       "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part properties that you can include in the parameter value are id, snippet, contentDetails, and status.",
 	//       "location": "query",
@@ -3409,11 +3745,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveBroadcasts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3512,6 +3850,14 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *LiveBroadcastsTransitionCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *LiveBroadcastsTransitionCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *LiveBroadcastsTransitionCall) Do() (*LiveBroadcast, error) {
 	var body io.Reader = nil
 	params := make(url.Values)
@@ -3519,14 +3865,19 @@
 	params.Set("broadcastStatus", fmt.Sprintf("%v", c.broadcastStatus))
 	params.Set("id", fmt.Sprintf("%v", c.id))
 	params.Set("part", fmt.Sprintf("%v", c.part))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveBroadcasts/transition")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3567,6 +3918,11 @@
 	//       "required": true,
 	//       "type": "string"
 	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "part": {
 	//       "description": "The part parameter specifies a comma-separated list of one or more liveBroadcast resource properties that the API response will include. The part names that you can include in the parameter value are id, snippet, contentDetails, and status.",
 	//       "location": "query",
@@ -3604,6 +3960,14 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *LiveBroadcastsUpdateCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *LiveBroadcastsUpdateCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *LiveBroadcastsUpdateCall) Do() (*LiveBroadcast, error) {
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livebroadcast)
@@ -3614,15 +3978,20 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("part", fmt.Sprintf("%v", c.part))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveBroadcasts")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3639,6 +4008,11 @@
 	//     "part"
 	//   ],
 	//   "parameters": {
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "part": {
 	//       "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part properties that you can include in the parameter value are id, snippet, contentDetails, and status.\n\nNote that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a broadcast's privacy status is defined in the status part. As such, if your request is updating a private or unlisted broadcast, and the request's part parameter value includes the status part, the broadcast's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the broadcast will revert to the default privacy setting.",
 	//       "location": "query",
@@ -3683,11 +4057,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveStreams")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -3747,12 +4123,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveStreams")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3862,11 +4240,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveStreams")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -3958,12 +4338,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "liveStreams")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4001,105 +4383,6 @@
 
 }
 
-// method id "youtube.players.list":
-
-type PlayersListCall struct {
-	s    *Service
-	part string
-	opt_ map[string]interface{}
-}
-
-// List: Returns the data required to play the videos specified on the
-// request, or restriction information explaining why it can't be
-// played.
-func (r *PlayersService) List(part string) *PlayersListCall {
-	c := &PlayersListCall{s: r.s, opt_: make(map[string]interface{})}
-	c.part = part
-	return c
-}
-
-// Itag sets the optional parameter "itag": If specified, the itag
-// parameter specifies a comma-separated list of itags video formats the
-// client is interested in. The returned formats will be a subset of
-// those itags.
-func (c *PlayersListCall) Itag(itag string) *PlayersListCall {
-	c.opt_["itag"] = itag
-	return c
-}
-
-// VideoId sets the optional parameter "videoId": The videoId parameter
-// specifies a comma-separated list of the YouTube video ID(s) for the
-// resource(s) that are being retrieved.
-func (c *PlayersListCall) VideoId(videoId string) *PlayersListCall {
-	c.opt_["videoId"] = videoId
-	return c
-}
-
-func (c *PlayersListCall) Do() (*PlayerListResponse, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	params.Set("part", fmt.Sprintf("%v", c.part))
-	if v, ok := c.opt_["itag"]; ok {
-		params.Set("itag", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["videoId"]; ok {
-		params.Set("videoId", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "players")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := new(PlayerListResponse)
-	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Returns the data required to play the videos specified on the request, or restriction information explaining why it can't be played.",
-	//   "httpMethod": "GET",
-	//   "id": "youtube.players.list",
-	//   "parameterOrder": [
-	//     "part"
-	//   ],
-	//   "parameters": {
-	//     "itag": {
-	//       "description": "If specified, the itag parameter specifies a comma-separated list of itags video formats the client is interested in. The returned formats will be a subset of those itags.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "part": {
-	//       "description": "The part parameter specifies a comma-separated list of one or more player resource properties that the API response will include.",
-	//       "location": "query",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "videoId": {
-	//       "description": "The videoId parameter specifies a comma-separated list of the YouTube video ID(s) for the resource(s) that are being retrieved.",
-	//       "location": "query",
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "players",
-	//   "response": {
-	//     "$ref": "PlayerListResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube",
-	//     "https://www.googleapis.com/auth/youtube.readonly",
-	//     "https://www.googleapis.com/auth/youtubepartner"
-	//   ]
-	// }
-
-}
-
 // method id "youtube.playlistItems.delete":
 
 type PlaylistItemsDeleteCall struct {
@@ -4123,11 +4406,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlistItems")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -4186,12 +4471,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlistItems")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4310,11 +4597,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlistItems")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4375,7 +4664,8 @@
 	//     "https://www.googleapis.com/auth/youtube",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
-	//   ]
+	//   ],
+	//   "supportsSubscription": true
 	// }
 
 }
@@ -4411,12 +4701,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlistItems")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4478,11 +4770,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlists")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -4541,12 +4835,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlists")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4665,11 +4961,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlists")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4766,12 +5064,14 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "playlists")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -4872,15 +5172,8 @@
 }
 
 // OnBehalfOfContentOwner sets the optional parameter
-// "onBehalfOfContentOwner": The onBehalfOfContentOwner parameter
-// indicates that the authenticated user is acting on behalf of the
-// content owner specified in the parameter value. This parameter is
-// intended for YouTube content partners that own and manage many
-// different YouTube channels. It allows content owners to authenticate
-// once and get access to all their video and channel data, without
-// having to provide authentication credentials for each individual
-// channel. The actual CMS account that the user authenticates with
-// needs to be linked to the specified YouTube content owner.
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
 func (c *SearchListCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *SearchListCall {
 	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
 	return c
@@ -5127,11 +5420,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "search")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5186,7 +5481,7 @@
 	//       "type": "integer"
 	//     },
 	//     "onBehalfOfContentOwner": {
-	//       "description": "The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with needs to be linked to the specified YouTube content owner.",
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -5436,11 +5731,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "subscriptions")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -5472,23 +5769,23 @@
 // method id "youtube.subscriptions.insert":
 
 type SubscriptionsInsertCall struct {
-	s             *Service
-	part          string
-	subscription2 *Subscription2
-	opt_          map[string]interface{}
+	s            *Service
+	part         string
+	subscription *Subscription
+	opt_         map[string]interface{}
 }
 
 // Insert: Adds a subscription for the authenticated user's channel.
-func (r *SubscriptionsService) Insert(part string, subscription2 *Subscription2) *SubscriptionsInsertCall {
+func (r *SubscriptionsService) Insert(part string, subscription *Subscription) *SubscriptionsInsertCall {
 	c := &SubscriptionsInsertCall{s: r.s, opt_: make(map[string]interface{})}
 	c.part = part
-	c.subscription2 = subscription2
+	c.subscription = subscription
 	return c
 }
 
-func (c *SubscriptionsInsertCall) Do() (*Subscription2, error) {
+func (c *SubscriptionsInsertCall) Do() (*Subscription, error) {
 	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription2)
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
 		return nil, err
 	}
@@ -5499,16 +5796,18 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "subscriptions")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
-	ret := new(Subscription2)
+	ret := new(Subscription)
 	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
 		return nil, err
 	}
@@ -5530,10 +5829,10 @@
 	//   },
 	//   "path": "subscriptions",
 	//   "request": {
-	//     "$ref": "Subscription2"
+	//     "$ref": "Subscription"
 	//   },
 	//   "response": {
-	//     "$ref": "Subscription2"
+	//     "$ref": "Subscription"
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
@@ -5599,6 +5898,14 @@
 	return c
 }
 
+// MySubscribers sets the optional parameter "mySubscribers": Set this
+// parameter's value to true to retrieve a feed of the subscribers of
+// the authenticated user.
+func (c *SubscriptionsListCall) MySubscribers(mySubscribers bool) *SubscriptionsListCall {
+	c.opt_["mySubscribers"] = mySubscribers
+	return c
+}
+
 // Order sets the optional parameter "order": The order parameter
 // specifies the method that will be used to sort resources in the API
 // response.
@@ -5634,6 +5941,9 @@
 	if v, ok := c.opt_["mine"]; ok {
 		params.Set("mine", fmt.Sprintf("%v", v))
 	}
+	if v, ok := c.opt_["mySubscribers"]; ok {
+		params.Set("mySubscribers", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["order"]; ok {
 		params.Set("order", fmt.Sprintf("%v", v))
 	}
@@ -5643,11 +5953,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "subscriptions")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5693,6 +6005,11 @@
 	//       "location": "query",
 	//       "type": "boolean"
 	//     },
+	//     "mySubscribers": {
+	//       "description": "Set this parameter's value to true to retrieve a feed of the subscribers of the authenticated user.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
 	//     "order": {
 	//       "default": "SUBSCRIPTION_ORDER_RELEVANCE",
 	//       "description": "The order parameter specifies the method that will be used to sort resources in the API response.",
@@ -5734,55 +6051,104 @@
 
 }
 
-// method id "youtube.subscriptions.unsubscribe":
+// method id "youtube.thumbnails.set":
 
-type SubscriptionsUnsubscribeCall struct {
-	s            *Service
-	subscription *Subscription
-	opt_         map[string]interface{}
+type ThumbnailsSetCall struct {
+	s       *Service
+	videoId string
+	opt_    map[string]interface{}
+	media_  io.Reader
 }
 
-// Unsubscribe:
-func (r *SubscriptionsService) Unsubscribe(subscription *Subscription) *SubscriptionsUnsubscribeCall {
-	c := &SubscriptionsUnsubscribeCall{s: r.s, opt_: make(map[string]interface{})}
-	c.subscription = subscription
+// Set: Uploads a custom video thumbnail to YouTube and sets it for a
+// video.
+func (r *ThumbnailsService) Set(videoId string) *ThumbnailsSetCall {
+	c := &ThumbnailsSetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.videoId = videoId
+	return c
+}
+func (c *ThumbnailsSetCall) Media(r io.Reader) *ThumbnailsSetCall {
+	c.media_ = r
 	return c
 }
 
-func (c *SubscriptionsUnsubscribeCall) Do() error {
+func (c *ThumbnailsSetCall) Do() (*ThumbnailListResponse, error) {
 	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
-	if err != nil {
-		return err
-	}
-	ctype := "application/json"
 	params := make(url.Values)
 	params.Set("alt", "json")
-	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "subscriptions/unsubscribe")
+	params.Set("videoId", fmt.Sprintf("%v", c.videoId))
+	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "thumbnails/set")
+	if c.media_ != nil {
+		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
+		params.Set("uploadType", "multipart")
+	}
 	urls += "?" + params.Encode()
+	body = new(bytes.Buffer)
+	ctype := "application/json"
+	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	if hasMedia_ {
+		req.ContentLength = contentLength_
+	}
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
-		return err
+		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
-		return err
+		return nil, err
 	}
-	return nil
+	ret := new(ThumbnailListResponse)
+	if err := json.NewDecoder(res.Body).Decode(ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
 	// {
+	//   "description": "Uploads a custom video thumbnail to YouTube and sets it for a video.",
 	//   "httpMethod": "POST",
-	//   "id": "youtube.subscriptions.unsubscribe",
-	//   "path": "subscriptions/unsubscribe",
-	//   "request": {
-	//     "$ref": "Subscription"
+	//   "id": "youtube.thumbnails.set",
+	//   "mediaUpload": {
+	//     "accept": [
+	//       "application/octet-stream",
+	//       "image/jpeg",
+	//       "image/png"
+	//     ],
+	//     "maxSize": "2MB",
+	//     "protocols": {
+	//       "resumable": {
+	//         "multipart": true,
+	//         "path": "/resumable/upload/youtube/v3/thumbnails/set"
+	//       },
+	//       "simple": {
+	//         "multipart": true,
+	//         "path": "/upload/youtube/v3/thumbnails/set"
+	//       }
+	//     }
+	//   },
+	//   "parameterOrder": [
+	//     "videoId"
+	//   ],
+	//   "parameters": {
+	//     "videoId": {
+	//       "description": "The videoId parameter specifies a YouTube video ID for which the custom video thumbnail is being provided.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "thumbnails/set",
+	//   "response": {
+	//     "$ref": "ThumbnailListResponse"
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
-	//     "https://www.googleapis.com/auth/youtube.readonly",
+	//     "https://www.googleapis.com/auth/youtube.upload",
 	//     "https://www.googleapis.com/auth/youtubepartner"
-	//   ]
+	//   ],
+	//   "supportsMediaUpload": true
 	// }
 
 }
@@ -5844,11 +6210,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "videoCategories")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -5916,19 +6284,32 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *VideosDeleteCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *VideosDeleteCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *VideosDeleteCall) Do() error {
 	var body io.Reader = nil
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("id", fmt.Sprintf("%v", c.id))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "videos")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -5946,6 +6327,11 @@
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
+	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
 	//     }
 	//   },
 	//   "path": "videos",
@@ -5972,19 +6358,32 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *VideosGetRatingCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *VideosGetRatingCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *VideosGetRatingCall) Do() (*VideoGetRatingResponse, error) {
 	var body io.Reader = nil
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("id", fmt.Sprintf("%v", c.id))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "videos/getRating")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -6006,6 +6405,11 @@
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
+	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
 	//     }
 	//   },
 	//   "path": "videos/getRating",
@@ -6038,6 +6442,57 @@
 	c.video = video
 	return c
 }
+
+// AutoLevels sets the optional parameter "autoLevels": The autoLevels
+// parameter specifies whether the video should be auto-leveled by
+// YouTube.
+func (c *VideosInsertCall) AutoLevels(autoLevels bool) *VideosInsertCall {
+	c.opt_["autoLevels"] = autoLevels
+	return c
+}
+
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *VideosInsertCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *VideosInsertCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
+// OnBehalfOfContentOwnerChannel sets the optional parameter
+// "onBehalfOfContentOwnerChannel": This parameter can only be used in a
+// properly authorized request. Note: This parameter is intended
+// exclusively for YouTube content partners.
+//
+// The
+// onBehalfOfContentOwnerChannel parameter indicates that the request's
+// authorization credentials identify a YouTube CMS user who is acting
+// on behalf of the channel specified in the parameter value. This
+// parameter must be used in conjunction with the onBehalfOfContentOwner
+// parameter, and the user must be authenticated using a CMS account
+// that is linked to the content owner that the onBehalfOfContentOwner
+// parameter specifies. In addition, the channel that the
+// onBehalfOfContentOwnerChannel parameter value specifies must be
+// linked to the content owner that the onBehalfOfContentOwner parameter
+// specifies.
+//
+// This parameter is intended for YouTube content partners
+// that own and manage many different YouTube channels. It allows
+// content owners to authenticate once and perform actions on behalf of
+// the channel specified in the parameter value, without having to
+// provide authentication credentials for each separate channel.
+func (c *VideosInsertCall) OnBehalfOfContentOwnerChannel(onBehalfOfContentOwnerChannel string) *VideosInsertCall {
+	c.opt_["onBehalfOfContentOwnerChannel"] = onBehalfOfContentOwnerChannel
+	return c
+}
+
+// Stabilize sets the optional parameter "stabilize": The stabilize
+// parameter specifies whether the video should be stabilized by
+// YouTube.
+func (c *VideosInsertCall) Stabilize(stabilize bool) *VideosInsertCall {
+	c.opt_["stabilize"] = stabilize
+	return c
+}
 func (c *VideosInsertCall) Media(r io.Reader) *VideosInsertCall {
 	c.media_ = r
 	return c
@@ -6053,6 +6508,18 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("part", fmt.Sprintf("%v", c.part))
+	if v, ok := c.opt_["autoLevels"]; ok {
+		params.Set("autoLevels", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["onBehalfOfContentOwnerChannel"]; ok {
+		params.Set("onBehalfOfContentOwnerChannel", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["stabilize"]; ok {
+		params.Set("stabilize", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "videos")
 	if c.media_ != nil {
 		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
@@ -6061,6 +6528,7 @@
 	urls += "?" + params.Encode()
 	contentLength_, hasMedia_ := googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	if hasMedia_ {
 		req.ContentLength = contentLength_
 	}
@@ -6070,6 +6538,7 @@
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -6103,11 +6572,31 @@
 	//     "part"
 	//   ],
 	//   "parameters": {
+	//     "autoLevels": {
+	//       "description": "The autoLevels parameter specifies whether the video should be auto-leveled by YouTube.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "onBehalfOfContentOwnerChannel": {
+	//       "description": "This parameter can only be used in a properly authorized request. Note: This parameter is intended exclusively for YouTube content partners.\n\nThe onBehalfOfContentOwnerChannel parameter indicates that the request's authorization credentials identify a YouTube CMS user who is acting on behalf of the channel specified in the parameter value. This parameter must be used in conjunction with the onBehalfOfContentOwner parameter, and the user must be authenticated using a CMS account that is linked to the content owner that the onBehalfOfContentOwner parameter specifies. In addition, the channel that the onBehalfOfContentOwnerChannel parameter value specifies must be linked to the content owner that the onBehalfOfContentOwner parameter specifies.\n\nThis parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and perform actions on behalf of the channel specified in the parameter value, without having to provide authentication credentials for each separate channel.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "part": {
 	//       "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part names that you can include in the parameter value are snippet, contentDetails, player, statistics, status, and topicDetails. However, not all of those parts contain properties that can be set when setting or updating a video's metadata. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.",
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
+	//     },
+	//     "stabilize": {
+	//       "description": "The stabilize parameter specifies whether the video should be stabilized by YouTube.",
+	//       "location": "query",
+	//       "type": "boolean"
 	//     }
 	//   },
 	//   "path": "videos",
@@ -6131,51 +6620,86 @@
 
 type VideosListCall struct {
 	s    *Service
-	id   string
 	part string
 	opt_ map[string]interface{}
 }
 
 // List: Returns a list of videos that match the API request parameters.
-func (r *VideosService) List(id string, part string) *VideosListCall {
+func (r *VideosService) List(part string) *VideosListCall {
 	c := &VideosListCall{s: r.s, opt_: make(map[string]interface{})}
-	c.id = id
 	c.part = part
 	return c
 }
 
+// Id sets the optional parameter "id": The id parameter specifies a
+// comma-separated list of the YouTube video ID(s) for the resource(s)
+// that are being retrieved. In a video resource, the id property
+// specifies the video's ID.
+func (c *VideosListCall) Id(id string) *VideosListCall {
+	c.opt_["id"] = id
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": USE_DESCRIPTION
+// --- channels:list:maxResults
+func (c *VideosListCall) MaxResults(maxResults int64) *VideosListCall {
+	c.opt_["maxResults"] = maxResults
+	return c
+}
+
+// MyRating sets the optional parameter "myRating": Set this parameter's
+// value to like or dislike to instruct the API to only return videos
+// liked or disliked by the authenticated user.
+func (c *VideosListCall) MyRating(myRating string) *VideosListCall {
+	c.opt_["myRating"] = myRating
+	return c
+}
+
 // OnBehalfOfContentOwner sets the optional parameter
-// "onBehalfOfContentOwner": The onBehalfOfContentOwner parameter
-// indicates that the authenticated user is acting on behalf of the
-// content owner specified in the parameter value. This parameter is
-// intended for YouTube content partners that own and manage many
-// different YouTube channels. It allows content owners to authenticate
-// once and get access to all their video and channel data, without
-// having to provide authentication credentials for each individual
-// channel. The actual CMS account that the user authenticates with
-// needs to be linked to the specified YouTube content owner.
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
 func (c *VideosListCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *VideosListCall {
 	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
 	return c
 }
 
+// PageToken sets the optional parameter "pageToken": USE_DESCRIPTION
+// --- channels:list:pageToken
+func (c *VideosListCall) PageToken(pageToken string) *VideosListCall {
+	c.opt_["pageToken"] = pageToken
+	return c
+}
+
 func (c *VideosListCall) Do() (*VideoListResponse, error) {
 	var body io.Reader = nil
 	params := make(url.Values)
 	params.Set("alt", "json")
-	params.Set("id", fmt.Sprintf("%v", c.id))
 	params.Set("part", fmt.Sprintf("%v", c.part))
+	if v, ok := c.opt_["id"]; ok {
+		params.Set("id", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["maxResults"]; ok {
+		params.Set("maxResults", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["myRating"]; ok {
+		params.Set("myRating", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
 		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
 	}
+	if v, ok := c.opt_["pageToken"]; ok {
+		params.Set("pageToken", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "videos")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -6189,18 +6713,43 @@
 	//   "httpMethod": "GET",
 	//   "id": "youtube.videos.list",
 	//   "parameterOrder": [
-	//     "id",
 	//     "part"
 	//   ],
 	//   "parameters": {
 	//     "id": {
 	//       "description": "The id parameter specifies a comma-separated list of the YouTube video ID(s) for the resource(s) that are being retrieved. In a video resource, the id property specifies the video's ID.",
 	//       "location": "query",
-	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "5",
+	//       "description": "USE_DESCRIPTION --- channels:list:maxResults",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "maximum": "50",
+	//       "minimum": "1",
+	//       "type": "integer"
+	//     },
+	//     "myRating": {
+	//       "description": "Set this parameter's value to like or dislike to instruct the API to only return videos liked or disliked by the authenticated user.",
+	//       "enum": [
+	//         "dislike",
+	//         "like"
+	//       ],
+	//       "enumDescriptions": [
+	//         "Returns only videos disliked by the authenticated user.",
+	//         "Returns only video liked by the authenticated user."
+	//       ],
+	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "onBehalfOfContentOwner": {
-	//       "description": "The onBehalfOfContentOwner parameter indicates that the authenticated user is acting on behalf of the content owner specified in the parameter value. This parameter is intended for YouTube content partners that own and manage many different YouTube channels. It allows content owners to authenticate once and get access to all their video and channel data, without having to provide authentication credentials for each individual channel. The actual CMS account that the user authenticates with needs to be linked to the specified YouTube content owner.",
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "USE_DESCRIPTION --- channels:list:pageToken",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -6241,20 +6790,33 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *VideosRateCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *VideosRateCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *VideosRateCall) Do() error {
 	var body io.Reader = nil
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("id", fmt.Sprintf("%v", c.id))
 	params.Set("rating", fmt.Sprintf("%v", c.rating))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "videos/rate")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return err
 	}
@@ -6274,6 +6836,11 @@
 	//       "required": true,
 	//       "type": "string"
 	//     },
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "rating": {
 	//       "description": "Specifies the rating to record.",
 	//       "enum": [
@@ -6317,6 +6884,14 @@
 	return c
 }
 
+// OnBehalfOfContentOwner sets the optional parameter
+// "onBehalfOfContentOwner": USE_DESCRIPTION ---
+// channels:list:onBehalfOfContentOwner
+func (c *VideosUpdateCall) OnBehalfOfContentOwner(onBehalfOfContentOwner string) *VideosUpdateCall {
+	c.opt_["onBehalfOfContentOwner"] = onBehalfOfContentOwner
+	return c
+}
+
 func (c *VideosUpdateCall) Do() (*Video, error) {
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.video)
@@ -6327,15 +6902,20 @@
 	params := make(url.Values)
 	params.Set("alt", "json")
 	params.Set("part", fmt.Sprintf("%v", c.part))
+	if v, ok := c.opt_["onBehalfOfContentOwner"]; ok {
+		params.Set("onBehalfOfContentOwner", fmt.Sprintf("%v", v))
+	}
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/v3/", "videos")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -6352,6 +6932,11 @@
 	//     "part"
 	//   ],
 	//   "parameters": {
+	//     "onBehalfOfContentOwner": {
+	//       "description": "USE_DESCRIPTION --- channels:list:onBehalfOfContentOwner",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "part": {
 	//       "description": "The part parameter serves two purposes in this operation. It identifies the properties that the write operation will set as well as the properties that the API response will include.\n\nThe part names that you can include in the parameter value are snippet, contentDetails, player, statistics, status, and topicDetails.\n\nNote that this method will override the existing values for all of the mutable properties that are contained in any parts that the parameter value specifies. For example, a video's privacy setting is contained in the status part. As such, if your request is updating a private video, and the request's part parameter value includes the status part, the video's privacy setting will be updated to whatever value the request body specifies. If the request body does not specify a value, the existing privacy setting will be removed and the video will revert to the default privacy setting.\n\nIn addition, not all of those parts contain properties that can be set when setting or updating a video's metadata. For example, the statistics object encapsulates statistics that YouTube calculates for a video and does not contain values that you can set or modify. If the parameter value specifies a part that does not contain mutable values, that part will still be included in the API response.",
 	//       "location": "query",
@@ -6373,12 +6958,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/youtubeanalytics/v1/youtubeanalytics-api.json b/youtubeanalytics/v1/youtubeanalytics-api.json
index 064fe47..98ef675 100644
--- a/youtubeanalytics/v1/youtubeanalytics-api.json
+++ b/youtubeanalytics/v1/youtubeanalytics-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/dQQBo02J_AxM-3HAxH2TR0Soy80\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/K1JioxMHlF8MIXHfwPqF4rpXsEg\"",
  "discoveryVersion": "v1",
  "id": "youtubeAnalytics:v1",
  "name": "youtubeAnalytics",
  "canonicalName": "YouTube Analytics",
  "version": "v1",
- "revision": "20130308",
+ "revision": "20130422",
  "title": "YouTube Analytics API",
  "description": "Retrieve your YouTube Analytics reports.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/youtube-16.png",
   "x32": "http://www.google.com/images/icons/product/youtube-32.png"
@@ -175,7 +177,7 @@
       "sort": {
        "type": "string",
        "description": "A comma-separated list of dimensions or metrics that determine the sort order for YouTube Analytics data. By default the sort order is ascending. The '-' prefix causes descending sort order.",
-       "pattern": "(-)?[0-9a-zA-Z,]+",
+       "pattern": "[-0-9a-zA-Z,]+",
        "location": "query"
       },
       "start-date": {
diff --git a/youtubeanalytics/v1/youtubeanalytics-gen.go b/youtubeanalytics/v1/youtubeanalytics-gen.go
index 9673e3c..87e0c03 100644
--- a/youtubeanalytics/v1/youtubeanalytics-gen.go
+++ b/youtubeanalytics/v1/youtubeanalytics-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "youtubeAnalytics:v1"
 const apiName = "youtubeAnalytics"
@@ -206,11 +209,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/analytics/v1/", "reports")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -272,7 +277,7 @@
 	//     "sort": {
 	//       "description": "A comma-separated list of dimensions or metrics that determine the sort order for YouTube Analytics data. By default the sort order is ascending. The '-' prefix causes descending sort order.",
 	//       "location": "query",
-	//       "pattern": "(-)?[0-9a-zA-Z,]+",
+	//       "pattern": "[-0-9a-zA-Z,]+",
 	//       "type": "string"
 	//     },
 	//     "start-date": {
@@ -301,12 +306,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}
diff --git a/youtubeanalytics/v1beta1/youtubeanalytics-api.json b/youtubeanalytics/v1beta1/youtubeanalytics-api.json
index 503d96c..75059cb 100644
--- a/youtubeanalytics/v1beta1/youtubeanalytics-api.json
+++ b/youtubeanalytics/v1beta1/youtubeanalytics-api.json
@@ -1,14 +1,16 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"95FJOuWe9QdOljMvtEYMArTvwNI/UIyAkv_5pk3lLRK5A-ipqJHG-Ic\"",
+ "etag": "\"0kaFfN0xfjZjASExv-gUnrWhdto/Z4tojzfRtZUe6xHuPHmuyLI0Onc\"",
  "discoveryVersion": "v1",
  "id": "youtubeAnalytics:v1beta1",
  "name": "youtubeAnalytics",
  "canonicalName": "YouTube Analytics",
  "version": "v1beta1",
- "revision": "20130308",
+ "revision": "20130422",
  "title": "YouTube Analytics API",
  "description": "Retrieve your YouTube Analytics reports.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
  "icons": {
   "x16": "http://www.google.com/images/icons/product/youtube-16.png",
   "x32": "http://www.google.com/images/icons/product/youtube-32.png"
@@ -178,7 +180,7 @@
       "sort": {
        "type": "string",
        "description": "A comma-separated list of dimensions or metrics that determine the sort order for YouTube Analytics data. By default the sort order is ascending. The '-' prefix causes descending sort order.",
-       "pattern": "(-)?[0-9a-zA-Z,]+",
+       "pattern": "[-0-9a-zA-Z,]+",
        "location": "query"
       },
       "start-date": {
diff --git a/youtubeanalytics/v1beta1/youtubeanalytics-gen.go b/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
index 4eb4793..2d8ebf1 100644
--- a/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
+++ b/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
@@ -22,6 +22,8 @@
 	"strings"
 )
 
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
 var _ = bytes.NewBuffer
 var _ = strconv.Itoa
 var _ = fmt.Sprintf
@@ -30,6 +32,7 @@
 var _ = url.Parse
 var _ = googleapi.Version
 var _ = errors.New
+var _ = strings.Replace
 
 const apiId = "youtubeAnalytics:v1beta1"
 const apiName = "youtubeAnalytics"
@@ -206,11 +209,13 @@
 	urls := googleapi.ResolveRelative("https://www.googleapis.com/youtube/analytics/v1beta1/", "reports")
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
 	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
 	}
+	defer res.Body.Close()
 	if err := googleapi.CheckResponse(res); err != nil {
 		return nil, err
 	}
@@ -272,7 +277,7 @@
 	//     "sort": {
 	//       "description": "A comma-separated list of dimensions or metrics that determine the sort order for YouTube Analytics data. By default the sort order is ascending. The '-' prefix causes descending sort order.",
 	//       "location": "query",
-	//       "pattern": "(-)?[0-9a-zA-Z,]+",
+	//       "pattern": "[-0-9a-zA-Z,]+",
 	//       "type": "string"
 	//     },
 	//     "start-date": {
@@ -301,12 +306,3 @@
 	// }
 
 }
-
-func cleanPathString(s string) string {
-	return strings.Map(func(r rune) rune {
-		if r >= 0x2d && r <= 0x7a || r == '~' {
-			return r
-		}
-		return -1
-	}, s)
-}