google-api-go-client: enable user to add custom User-Agent

Change-Id: Ic76f44a744bc70100ee118ee3db76b8386530925
Reviewed-on: https://code-review.googlesource.com/2060
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/adexchangebuyer/v1.2/adexchangebuyer-gen.go b/adexchangebuyer/v1.2/adexchangebuyer-gen.go
index 299500d..c114948 100644
--- a/adexchangebuyer/v1.2/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1.2/adexchangebuyer-gen.go
@@ -58,14 +58,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
 	Creatives *CreativesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -285,7 +293,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -358,7 +366,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -432,7 +440,7 @@
 		"id": strconv.FormatInt(c.id, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -520,7 +528,7 @@
 		"id": strconv.FormatInt(c.id, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -604,7 +612,7 @@
 		"accountId":       strconv.FormatInt(c.accountId, 10),
 		"buyerCreativeId": c.buyerCreativeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -692,7 +700,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -790,7 +798,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adexchangebuyer/v1.3/adexchangebuyer-gen.go b/adexchangebuyer/v1.3/adexchangebuyer-gen.go
index 524683b..2ea1899 100644
--- a/adexchangebuyer/v1.3/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1.3/adexchangebuyer-gen.go
@@ -63,8 +63,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -81,6 +82,13 @@
 	PretargetingConfig *PretargetingConfigService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -683,7 +691,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -756,7 +764,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -830,7 +838,7 @@
 		"id": strconv.FormatInt(c.id, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -918,7 +926,7 @@
 		"id": strconv.FormatInt(c.id, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -999,7 +1007,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": strconv.FormatInt(c.accountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1073,7 +1081,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1142,7 +1150,7 @@
 		"accountId": strconv.FormatInt(c.accountId, 10),
 		"billingId": strconv.FormatInt(c.billingId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1240,7 +1248,7 @@
 		"billingId": strconv.FormatInt(c.billingId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1341,7 +1349,7 @@
 		"billingId": strconv.FormatInt(c.billingId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1433,7 +1441,7 @@
 		"accountId":       strconv.FormatInt(c.accountId, 10),
 		"buyerCreativeId": c.buyerCreativeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1521,7 +1529,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1640,7 +1648,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1748,7 +1756,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1821,7 +1829,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1914,7 +1922,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2021,7 +2029,7 @@
 		"accountId": strconv.FormatInt(c.accountId, 10),
 		"configId":  strconv.FormatInt(c.configId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2102,7 +2110,7 @@
 		"accountId": strconv.FormatInt(c.accountId, 10),
 		"configId":  strconv.FormatInt(c.configId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2195,7 +2203,7 @@
 		"accountId": strconv.FormatInt(c.accountId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2276,7 +2284,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": strconv.FormatInt(c.accountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2365,7 +2373,7 @@
 		"configId":  strconv.FormatInt(c.configId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2464,7 +2472,7 @@
 		"configId":  strconv.FormatInt(c.configId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adexchangeseller/v1.1/adexchangeseller-gen.go b/adexchangeseller/v1.1/adexchangeseller-gen.go
index cb7ec8a..3d45fd4 100644
--- a/adexchangeseller/v1.1/adexchangeseller-gen.go
+++ b/adexchangeseller/v1.1/adexchangeseller-gen.go
@@ -68,8 +68,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -90,6 +91,13 @@
 	Urlchannels *UrlchannelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -645,7 +653,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -740,7 +748,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -824,7 +832,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -941,7 +949,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1063,7 +1071,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1168,7 +1176,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1244,7 +1252,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1352,7 +1360,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1477,7 +1485,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1576,7 +1584,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1639,7 +1647,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1705,7 +1713,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"dealId": c.dealId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1778,7 +1786,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1921,7 +1929,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2090,7 +2098,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2207,7 +2215,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2311,7 +2319,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adexchangeseller/v1/adexchangeseller-gen.go b/adexchangeseller/v1/adexchangeseller-gen.go
index c8a8806..1e4a5de 100644
--- a/adexchangeseller/v1/adexchangeseller-gen.go
+++ b/adexchangeseller/v1/adexchangeseller-gen.go
@@ -64,8 +64,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Adclients *AdclientsService
 
@@ -78,6 +79,13 @@
 	Urlchannels *UrlchannelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAdclientsService(s *Service) *AdclientsService {
 	rs := &AdclientsService{s: s}
 	return rs
@@ -460,7 +468,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -544,7 +552,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -661,7 +669,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -783,7 +791,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -883,7 +891,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -991,7 +999,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1116,7 +1124,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1295,7 +1303,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1464,7 +1472,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1581,7 +1589,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1685,7 +1693,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adexchangeseller/v2.0/adexchangeseller-gen.go b/adexchangeseller/v2.0/adexchangeseller-gen.go
index 4098215..de28947 100644
--- a/adexchangeseller/v2.0/adexchangeseller-gen.go
+++ b/adexchangeseller/v2.0/adexchangeseller-gen.go
@@ -60,12 +60,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -579,7 +587,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -674,7 +682,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -777,7 +785,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -879,7 +887,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -967,7 +975,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1085,7 +1093,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1183,7 +1191,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1261,7 +1269,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1341,7 +1349,7 @@
 		"accountId": c.accountId,
 		"dealId":    c.dealId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1425,7 +1433,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1583,7 +1591,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1762,7 +1770,7 @@
 		"accountId":     c.accountId,
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1890,7 +1898,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2006,7 +2014,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/admin/directory_v1/admin-gen.go b/admin/directory_v1/admin-gen.go
index 7e50dca..a6eda1a 100644
--- a/admin/directory_v1/admin-gen.go
+++ b/admin/directory_v1/admin-gen.go
@@ -122,8 +122,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Asps *AspsService
 
@@ -150,6 +151,13 @@
 	VerificationCodes *VerificationCodesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAspsService(s *Service) *AspsService {
 	rs := &AspsService{s: s}
 	return rs
@@ -1354,7 +1362,7 @@
 		"userKey": c.userKey,
 		"codeId":  strconv.FormatInt(c.codeId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1434,7 +1442,7 @@
 		"userKey": c.userKey,
 		"codeId":  strconv.FormatInt(c.codeId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1518,7 +1526,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1598,7 +1606,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1676,7 +1684,7 @@
 		"customerId": c.customerId,
 		"deviceId":   c.deviceId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1836,7 +1844,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"customerId": c.customerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2000,7 +2008,7 @@
 		"deviceId":   c.deviceId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2120,7 +2128,7 @@
 		"deviceId":   c.deviceId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2219,7 +2227,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"groupKey": c.groupKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2288,7 +2296,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"groupKey": c.groupKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2369,7 +2377,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2486,7 +2494,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2589,7 +2597,7 @@
 		"groupKey": c.groupKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2676,7 +2684,7 @@
 		"groupKey": c.groupKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2758,7 +2766,7 @@
 		"groupKey": c.groupKey,
 		"alias":    c.alias,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2842,7 +2850,7 @@
 		"groupKey": c.groupKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2921,7 +2929,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"groupKey": c.groupKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3002,7 +3010,7 @@
 		"groupKey":  c.groupKey,
 		"memberKey": c.memberKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3082,7 +3090,7 @@
 		"groupKey":  c.groupKey,
 		"memberKey": c.memberKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3176,7 +3184,7 @@
 		"groupKey": c.groupKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3286,7 +3294,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"groupKey": c.groupKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3394,7 +3402,7 @@
 		"memberKey": c.memberKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3492,7 +3500,7 @@
 		"memberKey": c.memberKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3590,7 +3598,7 @@
 		"resourceId": c.resourceId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3673,7 +3681,7 @@
 		"customerId": c.customerId,
 		"resourceId": c.resourceId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3762,7 +3770,7 @@
 		"customerId": c.customerId,
 		"resourceId": c.resourceId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3922,7 +3930,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"customerId": c.customerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4071,7 +4079,7 @@
 		"customer":       c.customer,
 		"notificationId": c.notificationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4150,7 +4158,7 @@
 		"customer":       c.customer,
 		"notificationId": c.notificationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4264,7 +4272,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"customer": c.customer,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4367,7 +4375,7 @@
 		"notificationId": c.notificationId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4464,7 +4472,7 @@
 		"notificationId": c.notificationId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4553,7 +4561,7 @@
 		"customerId":  c.customerId,
 		"orgUnitPath": c.orgUnitPath[0],
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4633,7 +4641,7 @@
 		"customerId":  c.customerId,
 		"orgUnitPath": c.orgUnitPath[0],
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4726,7 +4734,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4825,7 +4833,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"customerId": c.customerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4933,7 +4941,7 @@
 		"orgUnitPath": c.orgUnitPath[0],
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5031,7 +5039,7 @@
 		"orgUnitPath": c.orgUnitPath[0],
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5121,7 +5129,7 @@
 		"customerId": c.customerId,
 		"schemaKey":  c.schemaKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5200,7 +5208,7 @@
 		"customerId": c.customerId,
 		"schemaKey":  c.schemaKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5292,7 +5300,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5371,7 +5379,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"customerId": c.customerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5459,7 +5467,7 @@
 		"schemaKey":  c.schemaKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5556,7 +5564,7 @@
 		"schemaKey":  c.schemaKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5645,7 +5653,7 @@
 		"userKey":  c.userKey,
 		"clientId": c.clientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5724,7 +5732,7 @@
 		"userKey":  c.userKey,
 		"clientId": c.clientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5808,7 +5816,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5884,7 +5892,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5984,7 +5992,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6100,7 +6108,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6290,7 +6298,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6482,7 +6490,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6562,7 +6570,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6649,7 +6657,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6729,7 +6737,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6937,7 +6945,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7128,7 +7136,7 @@
 		"userKey": c.userKey,
 		"alias":   c.alias,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7213,7 +7221,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7303,7 +7311,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7414,7 +7422,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7511,7 +7519,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7580,7 +7588,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7666,7 +7674,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7753,7 +7761,7 @@
 		"userKey": c.userKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7832,7 +7840,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7902,7 +7910,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7972,7 +7980,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userKey": c.userKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/admin/email_migration_v2/admin-gen.go b/admin/email_migration_v2/admin-gen.go
index c9fdbc5..c0413bd 100644
--- a/admin/email_migration_v2/admin-gen.go
+++ b/admin/email_migration_v2/admin-gen.go
@@ -57,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Mail *MailService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewMailService(s *Service) *MailService {
 	rs := &MailService{s: s}
 	return rs
@@ -204,7 +212,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -217,6 +225,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
diff --git a/admin/reports_v1/admin-gen.go b/admin/reports_v1/admin-gen.go
index dc4163f..870598a 100644
--- a/admin/reports_v1/admin-gen.go
+++ b/admin/reports_v1/admin-gen.go
@@ -63,8 +63,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Activities *ActivitiesService
 
@@ -75,6 +76,13 @@
 	UserUsageReport *UserUsageReportService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -461,7 +469,7 @@
 		"userKey":         c.userKey,
 		"applicationName": c.applicationName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -686,7 +694,7 @@
 		"applicationName": c.applicationName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -826,7 +834,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -920,7 +928,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"date": c.date,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1069,7 +1077,7 @@
 		"userKey": c.userKey,
 		"date":    c.date,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adsense/v1.2/adsense-gen.go b/adsense/v1.2/adsense-gen.go
index d0516f2..0c77007 100644
--- a/adsense/v1.2/adsense-gen.go
+++ b/adsense/v1.2/adsense-gen.go
@@ -66,8 +66,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -84,6 +85,13 @@
 	Urlchannels *UrlchannelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -755,7 +763,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -855,7 +863,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -958,7 +966,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1055,7 +1063,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1182,7 +1190,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1314,7 +1322,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1425,7 +1433,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1543,7 +1551,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1678,7 +1686,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1879,7 +1887,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2064,7 +2072,7 @@
 		"accountId":     c.accountId,
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2192,7 +2200,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2285,7 +2293,7 @@
 		"accountId":      c.accountId,
 		"savedAdStyleId": c.savedAdStyleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2392,7 +2400,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2508,7 +2516,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2623,7 +2631,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2707,7 +2715,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2824,7 +2832,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2946,7 +2954,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3046,7 +3054,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3154,7 +3162,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3279,7 +3287,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3479,7 +3487,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3660,7 +3668,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3777,7 +3785,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3858,7 +3866,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedAdStyleId": c.savedAdStyleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3954,7 +3962,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4058,7 +4066,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adsense/v1.3/adsense-gen.go b/adsense/v1.3/adsense-gen.go
index f9de316..8008b39 100644
--- a/adsense/v1.3/adsense-gen.go
+++ b/adsense/v1.3/adsense-gen.go
@@ -68,8 +68,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -90,6 +91,13 @@
 	Urlchannels *UrlchannelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -898,7 +906,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -998,7 +1006,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1101,7 +1109,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1198,7 +1206,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1295,7 +1303,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1422,7 +1430,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1554,7 +1562,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1670,7 +1678,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1759,7 +1767,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1877,7 +1885,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2012,7 +2020,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2225,7 +2233,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2415,7 +2423,7 @@
 		"accountId":     c.accountId,
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2543,7 +2551,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2636,7 +2644,7 @@
 		"accountId":      c.accountId,
 		"savedAdStyleId": c.savedAdStyleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2743,7 +2751,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2859,7 +2867,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2974,7 +2982,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3058,7 +3066,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3145,7 +3153,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3262,7 +3270,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3384,7 +3392,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3489,7 +3497,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3565,7 +3573,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3673,7 +3681,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3798,7 +3806,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3897,7 +3905,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3960,7 +3968,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4136,7 +4144,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4322,7 +4330,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4439,7 +4447,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4520,7 +4528,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedAdStyleId": c.savedAdStyleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4616,7 +4624,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4720,7 +4728,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adsense/v1.4/adsense-gen.go b/adsense/v1.4/adsense-gen.go
index 8e39a52..24dc92e 100644
--- a/adsense/v1.4/adsense-gen.go
+++ b/adsense/v1.4/adsense-gen.go
@@ -69,8 +69,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -93,6 +94,13 @@
 	Urlchannels *UrlchannelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -967,7 +975,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1067,7 +1075,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1170,7 +1178,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1267,7 +1275,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1364,7 +1372,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1491,7 +1499,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1623,7 +1631,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1731,7 +1739,7 @@
 		"accountId": c.accountId,
 		"alertId":   c.alertId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1819,7 +1827,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1908,7 +1916,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2026,7 +2034,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2161,7 +2169,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2270,7 +2278,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2451,7 +2459,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2641,7 +2649,7 @@
 		"accountId":     c.accountId,
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2769,7 +2777,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2862,7 +2870,7 @@
 		"accountId":      c.accountId,
 		"savedAdStyleId": c.savedAdStyleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2969,7 +2977,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3085,7 +3093,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3200,7 +3208,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3284,7 +3292,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3371,7 +3379,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3488,7 +3496,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3610,7 +3618,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3708,7 +3716,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"alertId": c.alertId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3785,7 +3793,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3861,7 +3869,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3969,7 +3977,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4094,7 +4102,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4193,7 +4201,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4256,7 +4264,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4318,7 +4326,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4494,7 +4502,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4680,7 +4688,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedReportId": c.savedReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4797,7 +4805,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4878,7 +4886,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"savedAdStyleId": c.savedAdStyleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4974,7 +4982,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5078,7 +5086,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/adsensehost/v4.1/adsensehost-gen.go b/adsensehost/v4.1/adsensehost-gen.go
index 326c156..db1ea57 100644
--- a/adsensehost/v4.1/adsensehost-gen.go
+++ b/adsensehost/v4.1/adsensehost-gen.go
@@ -62,8 +62,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -78,6 +79,13 @@
 	Urlchannels *UrlchannelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -563,7 +571,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -641,7 +649,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -722,7 +730,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -827,7 +835,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -923,7 +931,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1019,7 +1027,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1126,7 +1134,7 @@
 		"adClientId": c.adClientId,
 		"adUnitId":   c.adUnitId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1234,7 +1242,7 @@
 		"adClientId": c.adClientId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1355,7 +1363,7 @@
 		"accountId":  c.accountId,
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1471,7 +1479,7 @@
 		"adClientId": c.adClientId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1576,7 +1584,7 @@
 		"adClientId": c.adClientId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1743,7 +1751,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1886,7 +1894,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1980,7 +1988,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2085,7 +2093,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2193,7 +2201,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2273,7 +2281,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2359,7 +2367,7 @@
 		"adClientId":      c.adClientId,
 		"customChannelId": c.customChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2450,7 +2458,7 @@
 		"adClientId": c.adClientId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2552,7 +2560,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2653,7 +2661,7 @@
 		"adClientId": c.adClientId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2747,7 +2755,7 @@
 		"adClientId": c.adClientId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2903,7 +2911,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3041,7 +3049,7 @@
 		"adClientId":   c.adClientId,
 		"urlChannelId": c.urlChannelId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3132,7 +3140,7 @@
 		"adClientId": c.adClientId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3233,7 +3241,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"adClientId": c.adClientId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/analytics/v2.4/analytics-gen.go b/analytics/v2.4/analytics-gen.go
index dad52be..55ffa73 100644
--- a/analytics/v2.4/analytics-gen.go
+++ b/analytics/v2.4/analytics-gen.go
@@ -61,14 +61,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Data *DataService
 
 	Management *ManagementService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDataService(s *Service) *DataService {
 	rs := &DataService{s: s}
 	return rs
@@ -254,7 +262,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -402,7 +410,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -503,7 +511,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -624,7 +632,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -731,7 +739,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -826,7 +834,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/analytics/v3/analytics-api.json b/analytics/v3/analytics-api.json
index 04a5cb3..47a7093 100644
--- a/analytics/v3/analytics-api.json
+++ b/analytics/v3/analytics-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/A7O3agkh7yC4B7ApdQ5Stb69Ofk\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/6NlFUYEBMf81bxiwpXwPhu5e1RQ\"",
  "discoveryVersion": "v1",
  "id": "analytics:v3",
  "name": "analytics",
  "version": "v3",
- "revision": "20150115",
+ "revision": "20150308",
  "title": "Google Analytics API",
  "description": "View and manage your Google Analytics data",
  "ownerDomain": "google.com",
@@ -819,168 +819,6 @@
     }
    }
   },
-  "DailyUpload": {
-   "id": "DailyUpload",
-   "type": "object",
-   "description": "Metadata for daily upload entity.",
-   "properties": {
-    "accountId": {
-     "type": "string",
-     "description": "Account ID to which this daily upload belongs."
-    },
-    "appendCount": {
-     "type": "integer",
-     "description": "Number of appends for this date.",
-     "format": "int32"
-    },
-    "createdTime": {
-     "type": "string",
-     "description": "Time this daily upload was created.",
-     "format": "date-time"
-    },
-    "customDataSourceId": {
-     "type": "string",
-     "description": "Custom data source ID to which this daily upload belongs."
-    },
-    "date": {
-     "type": "string",
-     "description": "Date associated with daily upload."
-    },
-    "kind": {
-     "type": "string",
-     "description": "Resource type for Analytics daily upload.",
-     "default": "analytics#dailyUpload"
-    },
-    "modifiedTime": {
-     "type": "string",
-     "description": "Time this daily upload was last modified.",
-     "format": "date-time"
-    },
-    "parentLink": {
-     "type": "object",
-     "description": "Parent link for a daily upload. Points to the custom data source to which this daily upload belongs.",
-     "properties": {
-      "href": {
-       "type": "string",
-       "description": "Link to the custom data source to which this daily upload belongs."
-      },
-      "type": {
-       "type": "string",
-       "description": "Value is \"analytics#customDataSource\".",
-       "default": "analytics#customDataSource"
-      }
-     }
-    },
-    "recentChanges": {
-     "type": "array",
-     "description": "Change log for last 10 changes in chronological order.",
-     "items": {
-      "type": "object",
-      "properties": {
-       "change": {
-        "type": "string",
-        "description": "The type of change: APPEND, RESET, or DELETE."
-       },
-       "time": {
-        "type": "string",
-        "description": "The time when the change occurred.",
-        "format": "date-time"
-       }
-      }
-     }
-    },
-    "selfLink": {
-     "type": "string",
-     "description": "Link for this daily upload."
-    },
-    "webPropertyId": {
-     "type": "string",
-     "description": "Web property ID of the form UA-XXXXX-YY to which this daily upload belongs."
-    }
-   }
-  },
-  "DailyUploadAppend": {
-   "id": "DailyUploadAppend",
-   "type": "object",
-   "description": "Metadata returned for a successful append operation.",
-   "properties": {
-    "accountId": {
-     "type": "string",
-     "description": "Account Id to which this daily upload append belongs."
-    },
-    "appendNumber": {
-     "type": "integer",
-     "description": "Append number.",
-     "format": "int32"
-    },
-    "customDataSourceId": {
-     "type": "string",
-     "description": "Custom data source Id to which this daily upload append belongs."
-    },
-    "date": {
-     "type": "string",
-     "description": "Date associated with daily upload append."
-    },
-    "kind": {
-     "type": "string",
-     "description": "Resource type for Analytics daily upload append.",
-     "default": "analytics#dailyUploadAppend"
-    },
-    "nextAppendLink": {
-     "type": "string"
-    },
-    "webPropertyId": {
-     "type": "string",
-     "description": "Web property Id of the form UA-XXXXX-YY to which this daily upload append belongs."
-    }
-   }
-  },
-  "DailyUploads": {
-   "id": "DailyUploads",
-   "type": "object",
-   "description": "A daily upload collection lists Analytics daily uploads to which the user has access. Each resource in the collection corresponds to a single Analytics daily upload.",
-   "properties": {
-    "items": {
-     "type": "array",
-     "description": "A collection of daily uploads.",
-     "items": {
-      "$ref": "DailyUpload"
-     }
-    },
-    "itemsPerPage": {
-     "type": "integer",
-     "description": "The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.",
-     "format": "int32"
-    },
-    "kind": {
-     "type": "string",
-     "description": "Collection type. Value is analytics#dailyUploads.",
-     "default": "analytics#dailyUploads"
-    },
-    "nextLink": {
-     "type": "string",
-     "description": "Link to next page for this daily upload collection."
-    },
-    "previousLink": {
-     "type": "string",
-     "description": "Link to previous page for this daily upload collection."
-    },
-    "startIndex": {
-     "type": "integer",
-     "description": "The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.",
-     "format": "int32"
-    },
-    "totalResults": {
-     "type": "integer",
-     "description": "The total number of results for the query, regardless of the number of results in the response.",
-     "format": "int32"
-    },
-    "username": {
-     "type": "string",
-     "description": "Email ID of the authenticated user"
-    }
-   }
-  },
   "EntityAdWordsLink": {
    "id": "EntityAdWordsLink",
    "type": "object",
@@ -4374,233 +4212,6 @@
       }
      }
     },
-    "dailyUploads": {
-     "methods": {
-      "delete": {
-       "id": "analytics.management.dailyUploads.delete",
-       "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}",
-       "httpMethod": "DELETE",
-       "description": "Delete uploaded data for the given date.",
-       "parameters": {
-        "accountId": {
-         "type": "string",
-         "description": "Account Id associated with daily upload delete.",
-         "required": true,
-         "pattern": "[0-9]+",
-         "location": "path"
-        },
-        "customDataSourceId": {
-         "type": "string",
-         "description": "Custom data source Id associated with daily upload delete.",
-         "required": true,
-         "location": "path"
-        },
-        "date": {
-         "type": "string",
-         "description": "Date for which data is to be deleted. Date should be formatted as YYYY-MM-DD.",
-         "required": true,
-         "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-         "location": "path"
-        },
-        "type": {
-         "type": "string",
-         "description": "Type of data for this delete.",
-         "required": true,
-         "enum": [
-          "cost"
-         ],
-         "enumDescriptions": [
-          "Value for specifying cost data upload."
-         ],
-         "location": "query"
-        },
-        "webPropertyId": {
-         "type": "string",
-         "description": "Web property Id associated with daily upload delete.",
-         "required": true,
-         "pattern": "UA-[0-9]+-[0-9]+",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "accountId",
-        "webPropertyId",
-        "customDataSourceId",
-        "date",
-        "type"
-       ],
-       "scopes": [
-        "https://www.googleapis.com/auth/analytics",
-        "https://www.googleapis.com/auth/analytics.edit"
-       ]
-      },
-      "list": {
-       "id": "analytics.management.dailyUploads.list",
-       "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads",
-       "httpMethod": "GET",
-       "description": "List daily uploads to which the user has access.",
-       "parameters": {
-        "accountId": {
-         "type": "string",
-         "description": "Account Id for the daily uploads to retrieve.",
-         "required": true,
-         "pattern": "\\d+",
-         "location": "path"
-        },
-        "customDataSourceId": {
-         "type": "string",
-         "description": "Custom data source Id for daily uploads to retrieve.",
-         "required": true,
-         "pattern": ".{22}",
-         "location": "path"
-        },
-        "end-date": {
-         "type": "string",
-         "description": "End date of the form YYYY-MM-DD.",
-         "required": true,
-         "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-         "location": "query"
-        },
-        "max-results": {
-         "type": "integer",
-         "description": "The maximum number of custom data sources to include in this response.",
-         "format": "int32",
-         "minimum": "1",
-         "location": "query"
-        },
-        "start-date": {
-         "type": "string",
-         "description": "Start date of the form YYYY-MM-DD.",
-         "required": true,
-         "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-         "location": "query"
-        },
-        "start-index": {
-         "type": "integer",
-         "description": "A 1-based index of the first daily upload to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.",
-         "format": "int32",
-         "minimum": "1",
-         "location": "query"
-        },
-        "webPropertyId": {
-         "type": "string",
-         "description": "Web property Id for the daily uploads to retrieve.",
-         "required": true,
-         "pattern": "UA-(\\d+)-(\\d+)",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "accountId",
-        "webPropertyId",
-        "customDataSourceId",
-        "start-date",
-        "end-date"
-       ],
-       "response": {
-        "$ref": "DailyUploads"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/analytics",
-        "https://www.googleapis.com/auth/analytics.readonly"
-       ]
-      },
-      "upload": {
-       "id": "analytics.management.dailyUploads.upload",
-       "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads",
-       "httpMethod": "POST",
-       "description": "Update/Overwrite data for a custom data source.",
-       "parameters": {
-        "accountId": {
-         "type": "string",
-         "description": "Account Id associated with daily upload.",
-         "required": true,
-         "pattern": "\\d+",
-         "location": "path"
-        },
-        "appendNumber": {
-         "type": "integer",
-         "description": "Append number for this upload indexed from 1.",
-         "required": true,
-         "format": "int32",
-         "minimum": "1",
-         "maximum": "20",
-         "location": "query"
-        },
-        "customDataSourceId": {
-         "type": "string",
-         "description": "Custom data source Id to which the data being uploaded belongs.",
-         "required": true,
-         "location": "path"
-        },
-        "date": {
-         "type": "string",
-         "description": "Date for which data is uploaded. Date should be formatted as YYYY-MM-DD.",
-         "required": true,
-         "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-         "location": "path"
-        },
-        "reset": {
-         "type": "boolean",
-         "description": "Reset/Overwrite all previous appends for this date and start over with this file as the first upload.",
-         "default": "false",
-         "location": "query"
-        },
-        "type": {
-         "type": "string",
-         "description": "Type of data for this upload.",
-         "required": true,
-         "enum": [
-          "cost"
-         ],
-         "enumDescriptions": [
-          "Value for specifying cost data upload."
-         ],
-         "location": "query"
-        },
-        "webPropertyId": {
-         "type": "string",
-         "description": "Web property Id associated with daily upload.",
-         "required": true,
-         "pattern": "UA-\\d+-\\d+",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "accountId",
-        "webPropertyId",
-        "customDataSourceId",
-        "date",
-        "appendNumber",
-        "type"
-       ],
-       "response": {
-        "$ref": "DailyUploadAppend"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/analytics",
-        "https://www.googleapis.com/auth/analytics.edit"
-       ],
-       "supportsMediaUpload": true,
-       "mediaUpload": {
-        "accept": [
-         "application/octet-stream"
-        ],
-        "maxSize": "5MB",
-        "protocols": {
-         "simple": {
-          "multipart": true,
-          "path": "/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads"
-         },
-         "resumable": {
-          "multipart": true,
-          "path": "/resumable/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads"
-         }
-        }
-       }
-      }
-     }
-    },
     "experiments": {
      "methods": {
       "delete": {
@@ -6355,44 +5966,6 @@
         "https://www.googleapis.com/auth/analytics.readonly"
        ]
       },
-      "migrateDataImport": {
-       "id": "analytics.management.uploads.migrateDataImport",
-       "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/migrateDataImport",
-       "httpMethod": "POST",
-       "description": "Migrate custom data source and data imports to latest version.",
-       "parameters": {
-        "accountId": {
-         "type": "string",
-         "description": "Account Id for migration.",
-         "required": true,
-         "pattern": "\\d+",
-         "location": "path"
-        },
-        "customDataSourceId": {
-         "type": "string",
-         "description": "Custom data source Id for migration.",
-         "required": true,
-         "pattern": ".{22}",
-         "location": "path"
-        },
-        "webPropertyId": {
-         "type": "string",
-         "description": "Web property Id for migration.",
-         "required": true,
-         "pattern": "UA-(\\d+)-(\\d+)",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "accountId",
-        "webPropertyId",
-        "customDataSourceId"
-       ],
-       "scopes": [
-        "https://www.googleapis.com/auth/analytics",
-        "https://www.googleapis.com/auth/analytics.edit"
-       ]
-      },
       "uploadData": {
        "id": "analytics.management.uploads.uploadData",
        "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads",
diff --git a/analytics/v3/analytics-gen.go b/analytics/v3/analytics-gen.go
index 064c0dd..69136d9 100644
--- a/analytics/v3/analytics-gen.go
+++ b/analytics/v3/analytics-gen.go
@@ -76,8 +76,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Data *DataService
 
@@ -88,6 +89,13 @@
 	Provisioning *ProvisioningService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDataService(s *Service) *DataService {
 	rs := &DataService{s: s}
 	rs.Ga = NewDataGaService(s)
@@ -141,7 +149,6 @@
 	rs.CustomDataSources = NewManagementCustomDataSourcesService(s)
 	rs.CustomDimensions = NewManagementCustomDimensionsService(s)
 	rs.CustomMetrics = NewManagementCustomMetricsService(s)
-	rs.DailyUploads = NewManagementDailyUploadsService(s)
 	rs.Experiments = NewManagementExperimentsService(s)
 	rs.Filters = NewManagementFiltersService(s)
 	rs.Goals = NewManagementGoalsService(s)
@@ -172,8 +179,6 @@
 
 	CustomMetrics *ManagementCustomMetricsService
 
-	DailyUploads *ManagementDailyUploadsService
-
 	Experiments *ManagementExperimentsService
 
 	Filters *ManagementFiltersService
@@ -253,15 +258,6 @@
 	s *Service
 }
 
-func NewManagementDailyUploadsService(s *Service) *ManagementDailyUploadsService {
-	rs := &ManagementDailyUploadsService{s: s}
-	return rs
-}
-
-type ManagementDailyUploadsService struct {
-	s *Service
-}
-
 func NewManagementExperimentsService(s *Service) *ManagementExperimentsService {
 	rs := &ManagementExperimentsService{s: s}
 	return rs
@@ -868,116 +864,6 @@
 	Username string `json:"username,omitempty"`
 }
 
-type DailyUpload struct {
-	// AccountId: Account ID to which this daily upload belongs.
-	AccountId string `json:"accountId,omitempty"`
-
-	// AppendCount: Number of appends for this date.
-	AppendCount int64 `json:"appendCount,omitempty"`
-
-	// CreatedTime: Time this daily upload was created.
-	CreatedTime string `json:"createdTime,omitempty"`
-
-	// CustomDataSourceId: Custom data source ID to which this daily upload
-	// belongs.
-	CustomDataSourceId string `json:"customDataSourceId,omitempty"`
-
-	// Date: Date associated with daily upload.
-	Date string `json:"date,omitempty"`
-
-	// Kind: Resource type for Analytics daily upload.
-	Kind string `json:"kind,omitempty"`
-
-	// ModifiedTime: Time this daily upload was last modified.
-	ModifiedTime string `json:"modifiedTime,omitempty"`
-
-	// ParentLink: Parent link for a daily upload. Points to the custom data
-	// source to which this daily upload belongs.
-	ParentLink *DailyUploadParentLink `json:"parentLink,omitempty"`
-
-	// RecentChanges: Change log for last 10 changes in chronological order.
-	RecentChanges []*DailyUploadRecentChanges `json:"recentChanges,omitempty"`
-
-	// SelfLink: Link for this daily upload.
-	SelfLink string `json:"selfLink,omitempty"`
-
-	// WebPropertyId: Web property ID of the form UA-XXXXX-YY to which this
-	// daily upload belongs.
-	WebPropertyId string `json:"webPropertyId,omitempty"`
-}
-
-type DailyUploadParentLink struct {
-	// Href: Link to the custom data source to which this daily upload
-	// belongs.
-	Href string `json:"href,omitempty"`
-
-	// Type: Value is "analytics#customDataSource".
-	Type string `json:"type,omitempty"`
-}
-
-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"`
-}
-
-type DailyUploadAppend struct {
-	// AccountId: Account Id to which this daily upload append belongs.
-	AccountId string `json:"accountId,omitempty"`
-
-	// AppendNumber: Append number.
-	AppendNumber int64 `json:"appendNumber,omitempty"`
-
-	// CustomDataSourceId: Custom data source Id to which this daily upload
-	// append belongs.
-	CustomDataSourceId string `json:"customDataSourceId,omitempty"`
-
-	// Date: Date associated with daily upload append.
-	Date string `json:"date,omitempty"`
-
-	// Kind: Resource type for Analytics daily upload append.
-	Kind string `json:"kind,omitempty"`
-
-	NextAppendLink string `json:"nextAppendLink,omitempty"`
-
-	// WebPropertyId: Web property Id of the form UA-XXXXX-YY to which this
-	// daily upload append belongs.
-	WebPropertyId string `json:"webPropertyId,omitempty"`
-}
-
-type DailyUploads struct {
-	// Items: A collection of daily uploads.
-	Items []*DailyUpload `json:"items,omitempty"`
-
-	// ItemsPerPage: The maximum number of resources the response can
-	// contain, regardless of the actual number of resources returned. Its
-	// value ranges from 1 to 1000 with a value of 1000 by default, or
-	// otherwise specified by the max-results query parameter.
-	ItemsPerPage int64 `json:"itemsPerPage,omitempty"`
-
-	// Kind: Collection type. Value is analytics#dailyUploads.
-	Kind string `json:"kind,omitempty"`
-
-	// NextLink: Link to next page for this daily upload collection.
-	NextLink string `json:"nextLink,omitempty"`
-
-	// PreviousLink: Link to previous page for this daily upload collection.
-	PreviousLink string `json:"previousLink,omitempty"`
-
-	// StartIndex: The starting index of the resources, which is 1 by
-	// default or otherwise specified by the start-index query parameter.
-	StartIndex int64 `json:"startIndex,omitempty"`
-
-	// TotalResults: The total number of results for the query, regardless
-	// of the number of results in the response.
-	TotalResults int64 `json:"totalResults,omitempty"`
-
-	// Username: Email ID of the authenticated user
-	Username string `json:"username,omitempty"`
-}
-
 type EntityAdWordsLink struct {
 	// AdWordsAccounts: A list of AdWords client accounts. These cannot be
 	// MCC accounts. This field is required when creating an AdWords link.
@@ -2962,7 +2848,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3200,7 +3086,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3392,7 +3278,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3521,7 +3407,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3605,7 +3491,7 @@
 		"accountId": c.accountId,
 		"linkId":    c.linkId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3689,7 +3575,7 @@
 		"accountId": c.accountId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3789,7 +3675,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3891,7 +3777,7 @@
 		"linkId":    c.linkId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3994,7 +3880,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4100,7 +3986,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4207,7 +4093,7 @@
 		"webPropertyId":     c.webPropertyId,
 		"customDimensionId": c.customDimensionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4309,7 +4195,7 @@
 		"webPropertyId": c.webPropertyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4419,7 +4305,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4543,7 +4429,7 @@
 		"customDimensionId": c.customDimensionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4668,7 +4554,7 @@
 		"customDimensionId": c.customDimensionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4773,7 +4659,7 @@
 		"webPropertyId":  c.webPropertyId,
 		"customMetricId": c.customMetricId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4875,7 +4761,7 @@
 		"webPropertyId": c.webPropertyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4985,7 +4871,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5109,7 +4995,7 @@
 		"customMetricId": c.customMetricId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5234,7 +5120,7 @@
 		"customMetricId": c.customMetricId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5297,533 +5183,6 @@
 
 }
 
-// method id "analytics.management.dailyUploads.delete":
-
-type ManagementDailyUploadsDeleteCall struct {
-	s                  *Service
-	accountId          string
-	webPropertyId      string
-	customDataSourceId string
-	date               string
-	type_              string
-	opt_               map[string]interface{}
-}
-
-// Delete: Delete uploaded data for the given date.
-func (r *ManagementDailyUploadsService) Delete(accountId string, webPropertyId string, customDataSourceId string, date string, type_ string) *ManagementDailyUploadsDeleteCall {
-	c := &ManagementDailyUploadsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
-	c.accountId = accountId
-	c.webPropertyId = webPropertyId
-	c.customDataSourceId = customDataSourceId
-	c.date = date
-	c.type_ = type_
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ManagementDailyUploadsDeleteCall) Fields(s ...googleapi.Field) *ManagementDailyUploadsDeleteCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ManagementDailyUploadsDeleteCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	params.Set("type", fmt.Sprintf("%v", c.type_))
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"accountId":          c.accountId,
-		"webPropertyId":      c.webPropertyId,
-		"customDataSourceId": c.customDataSourceId,
-		"date":               c.date,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Delete uploaded data for the given date.",
-	//   "httpMethod": "DELETE",
-	//   "id": "analytics.management.dailyUploads.delete",
-	//   "parameterOrder": [
-	//     "accountId",
-	//     "webPropertyId",
-	//     "customDataSourceId",
-	//     "date",
-	//     "type"
-	//   ],
-	//   "parameters": {
-	//     "accountId": {
-	//       "description": "Account Id associated with daily upload delete.",
-	//       "location": "path",
-	//       "pattern": "[0-9]+",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "customDataSourceId": {
-	//       "description": "Custom data source Id associated with daily upload delete.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "date": {
-	//       "description": "Date for which data is to be deleted. Date should be formatted as YYYY-MM-DD.",
-	//       "location": "path",
-	//       "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "type": {
-	//       "description": "Type of data for this delete.",
-	//       "enum": [
-	//         "cost"
-	//       ],
-	//       "enumDescriptions": [
-	//         "Value for specifying cost data upload."
-	//       ],
-	//       "location": "query",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "webPropertyId": {
-	//       "description": "Web property Id associated with daily upload delete.",
-	//       "location": "path",
-	//       "pattern": "UA-[0-9]+-[0-9]+",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/analytics",
-	//     "https://www.googleapis.com/auth/analytics.edit"
-	//   ]
-	// }
-
-}
-
-// method id "analytics.management.dailyUploads.list":
-
-type ManagementDailyUploadsListCall struct {
-	s                  *Service
-	accountId          string
-	webPropertyId      string
-	customDataSourceId string
-	startDate          string
-	endDate            string
-	opt_               map[string]interface{}
-}
-
-// List: List daily uploads to which the user has access.
-func (r *ManagementDailyUploadsService) List(accountId string, webPropertyId string, customDataSourceId string, startDate string, endDate string) *ManagementDailyUploadsListCall {
-	c := &ManagementDailyUploadsListCall{s: r.s, opt_: make(map[string]interface{})}
-	c.accountId = accountId
-	c.webPropertyId = webPropertyId
-	c.customDataSourceId = customDataSourceId
-	c.startDate = startDate
-	c.endDate = endDate
-	return c
-}
-
-// MaxResults sets the optional parameter "max-results": The maximum
-// number of custom data sources to include in this response.
-func (c *ManagementDailyUploadsListCall) MaxResults(maxResults int64) *ManagementDailyUploadsListCall {
-	c.opt_["max-results"] = maxResults
-	return c
-}
-
-// StartIndex sets the optional parameter "start-index": A 1-based index
-// of the first daily upload to retrieve. Use this parameter as a
-// pagination mechanism along with the max-results parameter.
-func (c *ManagementDailyUploadsListCall) StartIndex(startIndex int64) *ManagementDailyUploadsListCall {
-	c.opt_["start-index"] = startIndex
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ManagementDailyUploadsListCall) Fields(s ...googleapi.Field) *ManagementDailyUploadsListCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ManagementDailyUploadsListCall) Do() (*DailyUploads, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	params.Set("end-date", fmt.Sprintf("%v", c.endDate))
-	params.Set("start-date", fmt.Sprintf("%v", c.startDate))
-	if v, ok := c.opt_["max-results"]; ok {
-		params.Set("max-results", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["start-index"]; ok {
-		params.Set("start-index", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"accountId":          c.accountId,
-		"webPropertyId":      c.webPropertyId,
-		"customDataSourceId": c.customDataSourceId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *DailyUploads
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "List daily uploads to which the user has access.",
-	//   "httpMethod": "GET",
-	//   "id": "analytics.management.dailyUploads.list",
-	//   "parameterOrder": [
-	//     "accountId",
-	//     "webPropertyId",
-	//     "customDataSourceId",
-	//     "start-date",
-	//     "end-date"
-	//   ],
-	//   "parameters": {
-	//     "accountId": {
-	//       "description": "Account Id for the daily uploads to retrieve.",
-	//       "location": "path",
-	//       "pattern": "\\d+",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "customDataSourceId": {
-	//       "description": "Custom data source Id for daily uploads to retrieve.",
-	//       "location": "path",
-	//       "pattern": ".{22}",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "end-date": {
-	//       "description": "End date of the form YYYY-MM-DD.",
-	//       "location": "query",
-	//       "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "max-results": {
-	//       "description": "The maximum number of custom data sources to include in this response.",
-	//       "format": "int32",
-	//       "location": "query",
-	//       "minimum": "1",
-	//       "type": "integer"
-	//     },
-	//     "start-date": {
-	//       "description": "Start date of the form YYYY-MM-DD.",
-	//       "location": "query",
-	//       "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "start-index": {
-	//       "description": "A 1-based index of the first daily upload to retrieve. Use this parameter as a pagination mechanism along with the max-results parameter.",
-	//       "format": "int32",
-	//       "location": "query",
-	//       "minimum": "1",
-	//       "type": "integer"
-	//     },
-	//     "webPropertyId": {
-	//       "description": "Web property Id for the daily uploads to retrieve.",
-	//       "location": "path",
-	//       "pattern": "UA-(\\d+)-(\\d+)",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads",
-	//   "response": {
-	//     "$ref": "DailyUploads"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/analytics",
-	//     "https://www.googleapis.com/auth/analytics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "analytics.management.dailyUploads.upload":
-
-type ManagementDailyUploadsUploadCall struct {
-	s                  *Service
-	accountId          string
-	webPropertyId      string
-	customDataSourceId string
-	date               string
-	appendNumber       int64
-	type_              string
-	opt_               map[string]interface{}
-	media_             io.Reader
-	resumable_         googleapi.SizeReaderAt
-	mediaType_         string
-	ctx_               context.Context
-	protocol_          string
-}
-
-// Upload: Update/Overwrite data for a custom data source.
-func (r *ManagementDailyUploadsService) Upload(accountId string, webPropertyId string, customDataSourceId string, date string, appendNumber int64, type_ string) *ManagementDailyUploadsUploadCall {
-	c := &ManagementDailyUploadsUploadCall{s: r.s, opt_: make(map[string]interface{})}
-	c.accountId = accountId
-	c.webPropertyId = webPropertyId
-	c.customDataSourceId = customDataSourceId
-	c.date = date
-	c.appendNumber = appendNumber
-	c.type_ = type_
-	return c
-}
-
-// Reset sets the optional parameter "reset": Reset/Overwrite all
-// previous appends for this date and start over with this file as the
-// first upload.
-func (c *ManagementDailyUploadsUploadCall) Reset(reset bool) *ManagementDailyUploadsUploadCall {
-	c.opt_["reset"] = reset
-	return c
-}
-
-// Media specifies the media to upload in a single chunk.
-// At most one of Media and ResumableMedia may be set.
-func (c *ManagementDailyUploadsUploadCall) Media(r io.Reader) *ManagementDailyUploadsUploadCall {
-	c.media_ = r
-	c.protocol_ = "multipart"
-	return c
-}
-
-// ResumableMedia specifies the media to upload in chunks and can be cancelled with ctx.
-// At most one of Media and ResumableMedia may be set.
-// mediaType identifies the MIME media type of the upload, such as "image/png".
-// If mediaType is "", it will be auto-detected.
-func (c *ManagementDailyUploadsUploadCall) ResumableMedia(ctx context.Context, r io.ReaderAt, size int64, mediaType string) *ManagementDailyUploadsUploadCall {
-	c.ctx_ = ctx
-	c.resumable_ = io.NewSectionReader(r, 0, size)
-	c.mediaType_ = mediaType
-	c.protocol_ = "resumable"
-	return c
-}
-
-// ProgressUpdater provides a callback function that will be called after every chunk.
-// It should be a low-latency function in order to not slow down the upload operation.
-// This should only be called when using ResumableMedia (as opposed to Media).
-func (c *ManagementDailyUploadsUploadCall) ProgressUpdater(pu googleapi.ProgressUpdater) *ManagementDailyUploadsUploadCall {
-	c.opt_["progressUpdater"] = pu
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ManagementDailyUploadsUploadCall) Fields(s ...googleapi.Field) *ManagementDailyUploadsUploadCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ManagementDailyUploadsUploadCall) Do() (*DailyUploadAppend, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	params.Set("appendNumber", fmt.Sprintf("%v", c.appendNumber))
-	params.Set("type", fmt.Sprintf("%v", c.type_))
-	if v, ok := c.opt_["reset"]; ok {
-		params.Set("reset", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads")
-	var progressUpdater_ googleapi.ProgressUpdater
-	if v, ok := c.opt_["progressUpdater"]; ok {
-		if pu, ok := v.(googleapi.ProgressUpdater); ok {
-			progressUpdater_ = pu
-		}
-	}
-	if c.media_ != nil || c.resumable_ != nil {
-		urls = strings.Replace(urls, "https://www.googleapis.com/", "https://www.googleapis.com/upload/", 1)
-		params.Set("uploadType", c.protocol_)
-	}
-	urls += "?" + params.Encode()
-	body = new(bytes.Buffer)
-	ctype := "application/json"
-	if c.protocol_ != "resumable" {
-		var cancel func()
-		cancel, _ = googleapi.ConditionallyIncludeMedia(c.media_, &body, &ctype)
-		if cancel != nil {
-			defer cancel()
-		}
-	}
-	req, _ := http.NewRequest("POST", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"accountId":          c.accountId,
-		"webPropertyId":      c.webPropertyId,
-		"customDataSourceId": c.customDataSourceId,
-		"date":               c.date,
-	})
-	if c.protocol_ == "resumable" {
-		req.ContentLength = 0
-		if c.mediaType_ == "" {
-			c.mediaType_ = googleapi.DetectMediaType(c.resumable_)
-		}
-		req.Header.Set("X-Upload-Content-Type", c.mediaType_)
-		req.Body = nil
-	} else {
-		req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	if c.protocol_ == "resumable" {
-		loc := res.Header.Get("Location")
-		rx := &googleapi.ResumableUpload{
-			Client:        c.s.client,
-			URI:           loc,
-			Media:         c.resumable_,
-			MediaType:     c.mediaType_,
-			ContentLength: c.resumable_.Size(),
-			Callback:      progressUpdater_,
-		}
-		res, err = rx.Upload(c.ctx_)
-		if err != nil {
-			return nil, err
-		}
-		defer res.Body.Close()
-	}
-	var ret *DailyUploadAppend
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Update/Overwrite data for a custom data source.",
-	//   "httpMethod": "POST",
-	//   "id": "analytics.management.dailyUploads.upload",
-	//   "mediaUpload": {
-	//     "accept": [
-	//       "application/octet-stream"
-	//     ],
-	//     "maxSize": "5MB",
-	//     "protocols": {
-	//       "resumable": {
-	//         "multipart": true,
-	//         "path": "/resumable/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads"
-	//       },
-	//       "simple": {
-	//         "multipart": true,
-	//         "path": "/upload/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads"
-	//       }
-	//     }
-	//   },
-	//   "parameterOrder": [
-	//     "accountId",
-	//     "webPropertyId",
-	//     "customDataSourceId",
-	//     "date",
-	//     "appendNumber",
-	//     "type"
-	//   ],
-	//   "parameters": {
-	//     "accountId": {
-	//       "description": "Account Id associated with daily upload.",
-	//       "location": "path",
-	//       "pattern": "\\d+",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "appendNumber": {
-	//       "description": "Append number for this upload indexed from 1.",
-	//       "format": "int32",
-	//       "location": "query",
-	//       "maximum": "20",
-	//       "minimum": "1",
-	//       "required": true,
-	//       "type": "integer"
-	//     },
-	//     "customDataSourceId": {
-	//       "description": "Custom data source Id to which the data being uploaded belongs.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "date": {
-	//       "description": "Date for which data is uploaded. Date should be formatted as YYYY-MM-DD.",
-	//       "location": "path",
-	//       "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "reset": {
-	//       "default": "false",
-	//       "description": "Reset/Overwrite all previous appends for this date and start over with this file as the first upload.",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     },
-	//     "type": {
-	//       "description": "Type of data for this upload.",
-	//       "enum": [
-	//         "cost"
-	//       ],
-	//       "enumDescriptions": [
-	//         "Value for specifying cost data upload."
-	//       ],
-	//       "location": "query",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "webPropertyId": {
-	//       "description": "Web property Id associated with daily upload.",
-	//       "location": "path",
-	//       "pattern": "UA-\\d+-\\d+",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/dailyUploads/{date}/uploads",
-	//   "response": {
-	//     "$ref": "DailyUploadAppend"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/analytics",
-	//     "https://www.googleapis.com/auth/analytics.edit"
-	//   ],
-	//   "supportsMediaUpload": true
-	// }
-
-}
-
 // method id "analytics.management.experiments.delete":
 
 type ManagementExperimentsDeleteCall struct {
@@ -5869,7 +5228,7 @@
 		"profileId":     c.profileId,
 		"experimentId":  c.experimentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5969,7 +5328,7 @@
 		"profileId":     c.profileId,
 		"experimentId":  c.experimentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6082,7 +5441,7 @@
 		"profileId":     c.profileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6203,7 +5562,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6329,7 +5688,7 @@
 		"experimentId":  c.experimentId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6447,7 +5806,7 @@
 		"experimentId":  c.experimentId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6551,7 +5910,7 @@
 		"accountId": c.accountId,
 		"filterId":  c.filterId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6637,7 +5996,7 @@
 		"accountId": c.accountId,
 		"filterId":  c.filterId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6729,7 +6088,7 @@
 		"accountId": c.accountId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6829,7 +6188,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6932,7 +6291,7 @@
 		"filterId":  c.filterId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7029,7 +6388,7 @@
 		"filterId":  c.filterId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7124,7 +6483,7 @@
 		"profileId":     c.profileId,
 		"goalId":        c.goalId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7236,7 +6595,7 @@
 		"profileId":     c.profileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7356,7 +6715,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7479,7 +6838,7 @@
 		"goalId":        c.goalId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7596,7 +6955,7 @@
 		"goalId":        c.goalId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7705,7 +7064,7 @@
 		"profileId":     c.profileId,
 		"linkId":        c.linkId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7808,7 +7167,7 @@
 		"profileId":     c.profileId,
 		"linkId":        c.linkId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7924,7 +7283,7 @@
 		"profileId":     c.profileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8047,7 +7406,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8170,7 +7529,7 @@
 		"linkId":        c.linkId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8291,7 +7650,7 @@
 		"linkId":        c.linkId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8404,7 +7763,7 @@
 		"profileId":     c.profileId,
 		"linkId":        c.linkId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -8508,7 +7867,7 @@
 		"profileId":     c.profileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8628,7 +7987,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8750,7 +8109,7 @@
 		"linkId":        c.linkId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8856,7 +8215,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -8945,7 +8304,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9050,7 +8409,7 @@
 		"webPropertyId": c.webPropertyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9160,7 +8519,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9273,7 +8632,7 @@
 		"profileId":     c.profileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9380,7 +8739,7 @@
 		"profileId":     c.profileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9490,7 +8849,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9581,7 +8940,7 @@
 		"profileId":         c.profileId,
 		"unsampledReportId": c.unsampledReportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9694,7 +9053,7 @@
 		"profileId":     c.profileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9815,7 +9174,7 @@
 		"webPropertyId": c.webPropertyId,
 		"profileId":     c.profileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9934,7 +9293,7 @@
 		"customDataSourceId": c.customDataSourceId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -10033,7 +9392,7 @@
 		"customDataSourceId": c.customDataSourceId,
 		"uploadId":           c.uploadId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10163,7 +9522,7 @@
 		"webPropertyId":      c.webPropertyId,
 		"customDataSourceId": c.customDataSourceId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10236,100 +9595,6 @@
 
 }
 
-// method id "analytics.management.uploads.migrateDataImport":
-
-type ManagementUploadsMigrateDataImportCall struct {
-	s                  *Service
-	accountId          string
-	webPropertyId      string
-	customDataSourceId string
-	opt_               map[string]interface{}
-}
-
-// MigrateDataImport: Migrate custom data source and data imports to
-// latest version.
-func (r *ManagementUploadsService) MigrateDataImport(accountId string, webPropertyId string, customDataSourceId string) *ManagementUploadsMigrateDataImportCall {
-	c := &ManagementUploadsMigrateDataImportCall{s: r.s, opt_: make(map[string]interface{})}
-	c.accountId = accountId
-	c.webPropertyId = webPropertyId
-	c.customDataSourceId = customDataSourceId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ManagementUploadsMigrateDataImportCall) Fields(s ...googleapi.Field) *ManagementUploadsMigrateDataImportCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ManagementUploadsMigrateDataImportCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/migrateDataImport")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"accountId":          c.accountId,
-		"webPropertyId":      c.webPropertyId,
-		"customDataSourceId": c.customDataSourceId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Migrate custom data source and data imports to latest version.",
-	//   "httpMethod": "POST",
-	//   "id": "analytics.management.uploads.migrateDataImport",
-	//   "parameterOrder": [
-	//     "accountId",
-	//     "webPropertyId",
-	//     "customDataSourceId"
-	//   ],
-	//   "parameters": {
-	//     "accountId": {
-	//       "description": "Account Id for migration.",
-	//       "location": "path",
-	//       "pattern": "\\d+",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "customDataSourceId": {
-	//       "description": "Custom data source Id for migration.",
-	//       "location": "path",
-	//       "pattern": ".{22}",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "webPropertyId": {
-	//       "description": "Web property Id for migration.",
-	//       "location": "path",
-	//       "pattern": "UA-(\\d+)-(\\d+)",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/migrateDataImport",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/analytics",
-	//     "https://www.googleapis.com/auth/analytics.edit"
-	//   ]
-	// }
-
-}
-
 // method id "analytics.management.uploads.uploadData":
 
 type ManagementUploadsUploadDataCall struct {
@@ -10434,7 +9699,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10447,6 +9712,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -10566,7 +9832,7 @@
 		"webPropertyId":            c.webPropertyId,
 		"webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -10656,7 +9922,7 @@
 		"webPropertyId":            c.webPropertyId,
 		"webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10758,7 +10024,7 @@
 		"webPropertyId": c.webPropertyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10868,7 +10134,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10981,7 +10247,7 @@
 		"webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11088,7 +10354,7 @@
 		"webPropertyAdWordsLinkId": c.webPropertyAdWordsLinkId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11184,7 +10450,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11280,7 +10546,7 @@
 		"accountId": c.accountId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11380,7 +10646,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11483,7 +10749,7 @@
 		"webPropertyId": c.webPropertyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11580,7 +10846,7 @@
 		"webPropertyId": c.webPropertyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11672,7 +10938,7 @@
 		"webPropertyId": c.webPropertyId,
 		"linkId":        c.linkId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -11766,7 +11032,7 @@
 		"webPropertyId": c.webPropertyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11876,7 +11142,7 @@
 		"accountId":     c.accountId,
 		"webPropertyId": c.webPropertyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11988,7 +11254,7 @@
 		"linkId":        c.linkId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12081,7 +11347,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"reportType": c.reportType,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12164,7 +11430,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/androidenterprise/v1/androidenterprise-api.json b/androidenterprise/v1/androidenterprise-api.json
new file mode 100644
index 0000000..9da3430
--- /dev/null
+++ b/androidenterprise/v1/androidenterprise-api.json
@@ -0,0 +1,2154 @@
+{
+ "kind": "discovery#restDescription",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/xO3KylrQCbUrcOq8RnL7dFXtEdE\"",
+ "discoveryVersion": "v1",
+ "id": "androidenterprise:v1",
+ "name": "androidenterprise",
+ "canonicalName": "Android Enterprise",
+ "version": "v1",
+ "revision": "20141112",
+ "title": "Google Play MDM API",
+ "description": "Allows MDMs/EMMs and enterprises to manage the deployment of apps to Android for Work users.",
+ "ownerDomain": "google.com",
+ "ownerName": "Google",
+ "icons": {
+  "x16": "https://www.google.com/images/icons/product/android-16.png",
+  "x32": "https://www.google.com/images/icons/product/android-32.png"
+ },
+ "protocol": "rest",
+ "baseUrl": "https://www.googleapis.com/androidenterprise/v1/",
+ "basePath": "/androidenterprise/v1/",
+ "rootUrl": "https://www.googleapis.com/",
+ "servicePath": "androidenterprise/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/androidenterprise": {
+     "description": "Manage corporate Android devices"
+    }
+   }
+  }
+ },
+ "schemas": {
+  "AppRestrictionsSchema": {
+   "id": "AppRestrictionsSchema",
+   "type": "object",
+   "description": "Represents the list of app restrictions available to be pre-configured for the product.",
+   "properties": {
+    "restrictions": {
+     "type": "array",
+     "description": "The set of restrictions that make up this schema.",
+     "items": {
+      "$ref": "AppRestrictionsSchemaRestriction"
+     }
+    }
+   }
+  },
+  "AppRestrictionsSchemaRestriction": {
+   "id": "AppRestrictionsSchemaRestriction",
+   "type": "object",
+   "description": "A restriction in the App Restriction Schema represents a piece of configuration that may be pre-applied.",
+   "properties": {
+    "defaultValue": {
+     "$ref": "AppRestrictionsSchemaRestrictionRestrictionValue",
+     "description": "The default value of the restriction."
+    },
+    "description": {
+     "type": "string",
+     "description": "A longer description of the restriction, giving more detail of what it affects."
+    },
+    "entry": {
+     "type": "array",
+     "description": "For choice or multiselect restrictions, the list of possible entries' human-readable names.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "entryValue": {
+     "type": "array",
+     "description": "For choice or multiselect restrictions, the list of possible entries' machine-readable values.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "key": {
+     "type": "string",
+     "description": "The unique key that the product uses to identify the restriction, e.g. \"com.google.android.gm.fieldname\"."
+    },
+    "restrictionType": {
+     "type": "string",
+     "description": "The type of the restriction."
+    },
+    "title": {
+     "type": "string",
+     "description": "The name of the restriction."
+    }
+   }
+  },
+  "AppRestrictionsSchemaRestrictionRestrictionValue": {
+   "id": "AppRestrictionsSchemaRestrictionRestrictionValue",
+   "type": "object",
+   "description": "A typed value for the restriction.",
+   "properties": {
+    "type": {
+     "type": "string",
+     "description": "The type of the value being provided."
+    },
+    "valueBool": {
+     "type": "boolean",
+     "description": "The boolean value - this will only be present if type is bool."
+    },
+    "valueInteger": {
+     "type": "integer",
+     "description": "The integer value - this will only be present if type is integer.",
+     "format": "int32"
+    },
+    "valueMultiselect": {
+     "type": "array",
+     "description": "The list of string values - this will only be present if type is multiselect.",
+     "items": {
+      "type": "string"
+     }
+    },
+    "valueString": {
+     "type": "string",
+     "description": "The string value - this will be present for types string, choice and hidden."
+    }
+   }
+  },
+  "Collection": {
+   "id": "Collection",
+   "type": "object",
+   "description": "A collection resource defines a named set of apps that is visible to a set of users in the Google Play Store app running on those users' managed devices. Those users can then install any of those apps if they wish (which will trigger creation of install and entitlement resources). A user cannot install an app on a managed device unless the app is listed in at least one collection that is visible to that user.\n\nNote that the API can be used to directly install an app regardless of whether it is in any collection - so an enterprise has a choice of either directly pushing apps to users, or allowing users to install apps if they want. Which is appropriate will depend on the enterprise's policies and the purpose of the apps concerned.",
+   "properties": {
+    "collectionId": {
+     "type": "string",
+     "description": "Arbitrary unique ID, allocated by the API on creation."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#collection\".",
+     "default": "androidenterprise#collection"
+    },
+    "name": {
+     "type": "string",
+     "description": "A user-friendly name for the collection (should be unique), e.g. \"Accounting apps\".",
+     "annotations": {
+      "required": [
+       "androidenterprise.collections.insert",
+       "androidenterprise.collections.update"
+      ]
+     }
+    },
+    "productId": {
+     "type": "array",
+     "description": "The IDs of the products in the collection, in the order in which they should be displayed.",
+     "items": {
+      "type": "string"
+     },
+     "annotations": {
+      "required": [
+       "androidenterprise.collections.insert",
+       "androidenterprise.collections.update"
+      ]
+     }
+    },
+    "visibility": {
+     "type": "string",
+     "description": "Whether this collection is visible to all users, or only to the users that have been granted access through the collection_viewers api. Even if a collection is visible to allUsers, it is possible to add and remove viewers, but this will have no effect until the collection's visibility changes to viewersOnly."
+    }
+   }
+  },
+  "CollectionViewersListResponse": {
+   "id": "CollectionViewersListResponse",
+   "type": "object",
+   "description": "The user resources for the collection.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#collectionViewersListResponse\".",
+     "default": "androidenterprise#collectionViewersListResponse"
+    },
+    "user": {
+     "type": "array",
+     "description": "A user of an enterprise.",
+     "items": {
+      "$ref": "User"
+     }
+    }
+   }
+  },
+  "CollectionsListResponse": {
+   "id": "CollectionsListResponse",
+   "type": "object",
+   "description": "The collection resources for the enterprise.",
+   "properties": {
+    "collection": {
+     "type": "array",
+     "description": "An ordered collection of products which can be made visible on the Google Play Store app to a selected group of users.",
+     "items": {
+      "$ref": "Collection"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#collectionsListResponse\".",
+     "default": "androidenterprise#collectionsListResponse"
+    }
+   }
+  },
+  "Device": {
+   "id": "Device",
+   "type": "object",
+   "description": "A device resource represents a mobile device managed by the MDM and belonging to a specific enterprise user.\n\nThis collection cannot be modified via the API; it is automatically populated as devices are set up to be managed.",
+   "properties": {
+    "androidId": {
+     "type": "string",
+     "description": "The Google Play Services Android ID for the device encoded as a lowercase hex string, e.g. \"123456789abcdef0\"."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#device\".",
+     "default": "androidenterprise#device"
+    }
+   }
+  },
+  "DeviceState": {
+   "id": "DeviceState",
+   "type": "object",
+   "description": "The state of a user's device, as accessed by the getState and setState methods on device resources.",
+   "properties": {
+    "accountState": {
+     "type": "string",
+     "description": "The state of the Google account on the device. \"enabled\" indicates that the Google account on the device can be used to access Google services (including Google Play), while \"disabled\" means that it cannot. A new device is initially in the \"disabled\" state."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#deviceState\".",
+     "default": "androidenterprise#deviceState"
+    }
+   }
+  },
+  "DevicesListResponse": {
+   "id": "DevicesListResponse",
+   "type": "object",
+   "description": "The device resources for the user.",
+   "properties": {
+    "device": {
+     "type": "array",
+     "description": "A managed device.",
+     "items": {
+      "$ref": "Device"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#devicesListResponse\".",
+     "default": "androidenterprise#devicesListResponse"
+    }
+   }
+  },
+  "Enterprise": {
+   "id": "Enterprise",
+   "type": "object",
+   "description": "An enterprise resource represents a binding between an organisation and their MDM.\n\nTo create an enterprise, an admin of the enterprise must first go through a Play for Work sign-up flow. At the end of this the admin will be presented with a token (a short opaque alphanumeric string). They must then present this to the MDM, who then supplies it to the enroll method. Until this is done the MDM will not have any access to the enterprise.\n\nAfter calling enroll the MDM should call setAccount to specify the service account that will be allowed to act on behalf of the enterprise, which will be required for access to the enterprise's data through this API. Only one call of setAccount is allowed for a given enterprise; the only way to change the account later is to unenroll the enterprise and enroll it again (obtaining a new token).\n\nThe MDM can unenroll an enterprise in order to sever the binding between them. Re-enrolling an enterprise is possible, but requires a new token to be retrieved. Enterprises.unenroll requires the MDM's credentials (as enroll does), not the enterprise's. Enterprises.unenroll can only be used for enterprises that were previously enrolled with the enroll call. Any enterprises that were enrolled using the (deprecated) Enterprises.insert call must be unenrolled with Enterprises.delete and can then be re-enrolled using the Enterprises.enroll call.\n\nThe ID for an enterprise is an opaque string. It is returned by insert and enroll and can also be retrieved if the enterprise's primary domain is known using the list method.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "The unique ID for the enterprise."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#enterprise\".",
+     "default": "androidenterprise#enterprise"
+    },
+    "name": {
+     "type": "string",
+     "description": "The name of the enterprise, e.g. \"Example Inc\"."
+    },
+    "primaryDomain": {
+     "type": "string",
+     "description": "The enterprise's primary domain, e.g. \"example.com\".",
+     "annotations": {
+      "required": [
+       "androidenterprise.enterprises.insert"
+      ]
+     }
+    }
+   }
+  },
+  "EnterpriseAccount": {
+   "id": "EnterpriseAccount",
+   "type": "object",
+   "description": "A service account that can be used to authenticate as the enterprise to API calls that require such authentication.",
+   "properties": {
+    "accountEmail": {
+     "type": "string",
+     "description": "The email address of the service account."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#enterpriseAccount\".",
+     "default": "androidenterprise#enterpriseAccount"
+    }
+   }
+  },
+  "EnterprisesListResponse": {
+   "id": "EnterprisesListResponse",
+   "type": "object",
+   "description": "The matching enterprise resources.",
+   "properties": {
+    "enterprise": {
+     "type": "array",
+     "description": "An enterprise.",
+     "items": {
+      "$ref": "Enterprise"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#enterprisesListResponse\".",
+     "default": "androidenterprise#enterprisesListResponse"
+    }
+   }
+  },
+  "Entitlement": {
+   "id": "Entitlement",
+   "type": "object",
+   "description": "The existence of an entitlement resource means that a user has the right to use a particular app on any of their devices. This might be because the app is free or because they have been allocated a license to the app from a group license purchased by the enterprise.\n\nIt should always be true that a user has an app installed on one of their devices only if they have an entitlement to it. So if an entitlement is deleted, the app will be uninstalled from all devices. Similarly if the user installs an app (and is permitted to do so), or the MDM triggers an install of the app, an entitlement to that app is automatically created. If this is impossible - e.g. the enterprise has not purchased sufficient licenses - then installation fails.\n\nNote that entitlements are always user specific, not device specific; a user may have an entitlement even though they have not installed the app anywhere. Once they have an entitlement they can install the app on multiple devices.\n\nThe API can be used to create an entitlement. If the app is a free app, a group license for that app is created. If it's a paid app, creating the entitlement consumes one license; it remains consumed until the entitlement is removed. Optionally an installation of the app on all the user's managed devices can be triggered at the time the entitlement is created. An entitlement cannot be created for an app if the app requires permissions that the enterprise has not yet accepted.\n\nEntitlements for paid apps that are due to purchases by the user on a non-managed profile will have \"userPurchase\" as entitlement reason; those entitlements cannot be removed via the API.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#entitlement\".",
+     "default": "androidenterprise#entitlement"
+    },
+    "productId": {
+     "type": "string",
+     "description": "The ID of the product that the entitlement is for, e.g. \"app:com.google.android.gm\"."
+    },
+    "reason": {
+     "type": "string",
+     "description": "The reason for the entitlement, e.g. \"free\" for free apps. This is temporary, it will be replaced by the acquisition kind field of group licenses."
+    }
+   }
+  },
+  "EntitlementsListResponse": {
+   "id": "EntitlementsListResponse",
+   "type": "object",
+   "description": "The entitlement resources for the user.",
+   "properties": {
+    "entitlement": {
+     "type": "array",
+     "description": "An entitlement of a user to a product (e.g. an app). For example, a free app that they have installed, or a paid app that they have been allocated a license to.",
+     "items": {
+      "$ref": "Entitlement"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#entitlementsListResponse\".",
+     "default": "androidenterprise#entitlementsListResponse"
+    }
+   }
+  },
+  "GroupLicense": {
+   "id": "GroupLicense",
+   "type": "object",
+   "description": "A group license object indicates a product that an enterprise admin has approved for use in the enterprise. The product may be free or paid. For free products, a group license object is created in these cases: if the enterprise admin approves a product in Google Play, if the product is added to a collection, or if an entitlement for the product is created for a user via the API. For paid products, a group license object is only created as part of the first bulk purchase of that product in Google Play done by the enterprise admin.\n\nThe API can be used to query group licenses; the available information includes the total number of licenses purchased (for paid products) and the total number of licenses that have been provisioned, i.e. the total number of user entitlements in existence for the product.\n\nGroup license objects are never deleted; if e.g. a free app is added to a collection and then removed, the group license will remain, allowing to keep track of any remaining entitlements. An enterprise admin may indicate they are no longer interested in the group license by marking it as unapproved in Google Play.",
+   "properties": {
+    "acquisitionKind": {
+     "type": "string",
+     "description": "How this group license was acquired. \"bulkPurchase\" means that this group license object was created because the enterprise purchased licenses for this product; this is \"free\" otherwise (for free products)."
+    },
+    "approval": {
+     "type": "string",
+     "description": "Whether the product to which this group license relates is currently approved by the enterprise, as either \"approved\" or \"unapproved\". Products are approved when a group license is first created, but this approval may be revoked by an enterprise admin via Google Play. Unapproved products will not be visible to end users in collections and new entitlements to them should not normally be created."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#groupLicense\".",
+     "default": "androidenterprise#groupLicense"
+    },
+    "numProvisioned": {
+     "type": "integer",
+     "description": "The total number of provisioned licenses for this product. Returned by read operations, but ignored in write operations.",
+     "format": "int32"
+    },
+    "numPurchased": {
+     "type": "integer",
+     "description": "The number of purchased licenses (possibly in multiple purchases). If this field is omitted then there is no limit on the number of licenses that can be provisioned (e.g. if the acquisition kind is \"free\").",
+     "format": "int32"
+    },
+    "productId": {
+     "type": "string",
+     "description": "The ID of the product that the license is for, e.g. \"app:com.google.android.gm\"."
+    }
+   }
+  },
+  "GroupLicenseUsersListResponse": {
+   "id": "GroupLicenseUsersListResponse",
+   "type": "object",
+   "description": "The user resources for the group license.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#groupLicenseUsersListResponse\".",
+     "default": "androidenterprise#groupLicenseUsersListResponse"
+    },
+    "user": {
+     "type": "array",
+     "description": "A user of an enterprise.",
+     "items": {
+      "$ref": "User"
+     }
+    }
+   }
+  },
+  "GroupLicensesListResponse": {
+   "id": "GroupLicensesListResponse",
+   "type": "object",
+   "description": "The grouplicense resources for the enterprise.",
+   "properties": {
+    "groupLicense": {
+     "type": "array",
+     "description": "A group license for a product approved for use in the enterprise.",
+     "items": {
+      "$ref": "GroupLicense"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#groupLicensesListResponse\".",
+     "default": "androidenterprise#groupLicensesListResponse"
+    }
+   }
+  },
+  "Install": {
+   "id": "Install",
+   "type": "object",
+   "description": "The existence of an install resource indicates that an app is installed on a particular device (or that an install is pending).\n\nThe API can be used to create an install resource using the update method. This triggers the actual install of the app on the device. If the user does not already have an entitlement for the app then an attempt is made to create one. If this fails (e.g. because the app is not free and there is no available license) then the creation of the install fails.\n\nThe API can also be used to update an installed app. If the update method is used on an existing install then the app will be updated to the latest available version.\n\nNote that it is not possible to force the installation of a specific version of an app; the version code is read-only.\n\nIf a user installs an app themselves (as permitted by the enterprise), then again an install resource and possibly an entitlement resource are automatically created.\n\nThe API can also be used to delete an install resource, which triggers the removal of the app from the device. Note that deleting an install does not automatically remove the corresponding entitlement, even if there are no remaining installs. The install resource will also be deleted if the user uninstalls the app themselves.",
+   "properties": {
+    "installState": {
+     "type": "string",
+     "description": "Install state. The state \"installPending\" means that an install request has recently been made and download to the device is in progress. The state \"installed\" means that the app has been installed. This field is read-only."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#install\".",
+     "default": "androidenterprise#install"
+    },
+    "productId": {
+     "type": "string",
+     "description": "The ID of the product that the install is for, e.g. \"app:com.google.android.gm\"."
+    },
+    "versionCode": {
+     "type": "integer",
+     "description": "The version of the installed product. Guaranteed to be set only if the install state is \"installed\".",
+     "format": "int32"
+    }
+   }
+  },
+  "InstallsListResponse": {
+   "id": "InstallsListResponse",
+   "type": "object",
+   "description": "The install resources for the device.",
+   "properties": {
+    "install": {
+     "type": "array",
+     "description": "An installation of an app for a user on a specific device. The existence of an install implies that the user must have an entitlement to the app.",
+     "items": {
+      "$ref": "Install"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#installsListResponse\".",
+     "default": "androidenterprise#installsListResponse"
+    }
+   }
+  },
+  "Permission": {
+   "id": "Permission",
+   "type": "object",
+   "description": "A permission represents some extra capability, to be granted to an Android app, which requires explicit consent. An enterprise admin must consent to these permissions on behalf of their users before an entitlement for the app can be created.\n\nThe permissions collection is read-only. The information provided for each permission (localized name and description) is intended to be used in the MDM user interface when obtaining consent from the enterprise.",
+   "properties": {
+    "description": {
+     "type": "string",
+     "description": "A longer description of the permissions giving more details of what it affects."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#permission\".",
+     "default": "androidenterprise#permission"
+    },
+    "name": {
+     "type": "string",
+     "description": "The name of the permission."
+    },
+    "permissionId": {
+     "type": "string",
+     "description": "An opaque string uniquely identifying the permission."
+    }
+   }
+  },
+  "Product": {
+   "id": "Product",
+   "type": "object",
+   "description": "A product represents an app in the Google Play Store that is available to at least some users in the enterprise. (Some apps are restricted to a single enterprise, and no information about them is made available outside that enterprise.)\n\nThe information provided for each product (localized name, icon, link to the full Google Play details page) is intended to allow a basic representation of the product within an MDM user interface.",
+   "properties": {
+    "authorName": {
+     "type": "string",
+     "description": "The name of the author of the product (e.g. the app developer)."
+    },
+    "detailsUrl": {
+     "type": "string",
+     "description": "A link to the (consumer) Google Play details page for the product."
+    },
+    "iconUrl": {
+     "type": "string",
+     "description": "A link to an image that can be used as an icon for the product."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#product\".",
+     "default": "androidenterprise#product"
+    },
+    "productId": {
+     "type": "string",
+     "description": "A string of the form \"app:\n\" - e.g. \"app:com.google.android.gm\" represents the GMail app."
+    },
+    "title": {
+     "type": "string",
+     "description": "The name of the product."
+    },
+    "workDetailsUrl": {
+     "type": "string",
+     "description": "A link to the Google Play for Work details page for the product, for use by an Enterprise administrator."
+    }
+   }
+  },
+  "ProductPermission": {
+   "id": "ProductPermission",
+   "type": "object",
+   "description": "A product permissions resource represents the set of permissions required by a specific app and whether or not they have been accepted by an enterprise admin.\n\nThe API can be used to read the set of permissions, and also to update the set to indicate that permissions have been accepted.",
+   "properties": {
+    "permissionId": {
+     "type": "string",
+     "description": "An opaque string uniquely identifying the permission."
+    },
+    "state": {
+     "type": "string",
+     "description": "Whether the permission has been accepted or not."
+    }
+   }
+  },
+  "ProductPermissions": {
+   "id": "ProductPermissions",
+   "type": "object",
+   "description": "Information about the permissions required by a specific app and whether they have been accepted by the enterprise.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#productPermissions\".",
+     "default": "androidenterprise#productPermissions"
+    },
+    "permission": {
+     "type": "array",
+     "description": "The permissions required by the app.",
+     "items": {
+      "$ref": "ProductPermission"
+     },
+     "annotations": {
+      "required": [
+       "androidenterprise.products.updatePermissions"
+      ]
+     }
+    },
+    "productId": {
+     "type": "string",
+     "description": "The ID of the app that the permissions relate to, e.g. \"app:com.google.android.gm\"."
+    }
+   }
+  },
+  "User": {
+   "id": "User",
+   "type": "object",
+   "description": "A user resource represents an individual user within the enterprise's domain.\n\nNote that each user is associated with a Google account based on the user's corporate email address (which must be in one of the enterprise's domains). As part of installing an MDM app to manage a device the Google account must be provisioned to the device, and so the user resource must be created before that. This can be done using the Google Admin SDK Directory API.\n\nThe ID for a user is an opaque string. It can be retrieved using the list method queried by the user's primary email address.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "The unique ID for the user."
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#user\".",
+     "default": "androidenterprise#user"
+    },
+    "primaryEmail": {
+     "type": "string",
+     "description": "The user's primary email, e.g. \"jsmith@example.com\"."
+    }
+   }
+  },
+  "UserToken": {
+   "id": "UserToken",
+   "type": "object",
+   "description": "A UserToken is used by a user when setting up a managed device or profile with their work account on a device. When the user enters their email address and token (activation code) the appropriate MDM app can be automatically downloaded.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#userToken\".",
+     "default": "androidenterprise#userToken"
+    },
+    "token": {
+     "type": "string",
+     "description": "The token (activation code) to be entered by the user. This consists of a sequence of decimal digits. Note that the leading digit may be 0."
+    },
+    "userId": {
+     "type": "string",
+     "description": "The unique ID for the user."
+    }
+   }
+  },
+  "UsersListResponse": {
+   "id": "UsersListResponse",
+   "type": "object",
+   "description": "The matching user resources.",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"androidenterprise#usersListResponse\".",
+     "default": "androidenterprise#usersListResponse"
+    },
+    "user": {
+     "type": "array",
+     "description": "A user of an enterprise.",
+     "items": {
+      "$ref": "User"
+     }
+    }
+   }
+  }
+ },
+ "resources": {
+  "collections": {
+   "methods": {
+    "delete": {
+     "id": "androidenterprise.collections.delete",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+     "httpMethod": "DELETE",
+     "description": "Deletes a collection.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "get": {
+     "id": "androidenterprise.collections.get",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+     "httpMethod": "GET",
+     "description": "Retrieves the details of a collection.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId"
+     ],
+     "response": {
+      "$ref": "Collection"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "insert": {
+     "id": "androidenterprise.collections.insert",
+     "path": "enterprises/{enterpriseId}/collections",
+     "httpMethod": "POST",
+     "description": "Creates a new collection.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId"
+     ],
+     "request": {
+      "$ref": "Collection"
+     },
+     "response": {
+      "$ref": "Collection"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.collections.list",
+     "path": "enterprises/{enterpriseId}/collections",
+     "httpMethod": "GET",
+     "description": "Retrieves the IDs of all the collections for an enterprise.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId"
+     ],
+     "response": {
+      "$ref": "CollectionsListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "patch": {
+     "id": "androidenterprise.collections.patch",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+     "httpMethod": "PATCH",
+     "description": "Updates a collection. This method supports patch semantics.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId"
+     ],
+     "request": {
+      "$ref": "Collection"
+     },
+     "response": {
+      "$ref": "Collection"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "update": {
+     "id": "androidenterprise.collections.update",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+     "httpMethod": "PUT",
+     "description": "Updates a collection.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId"
+     ],
+     "request": {
+      "$ref": "Collection"
+     },
+     "response": {
+      "$ref": "Collection"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "collectionviewers": {
+   "methods": {
+    "delete": {
+     "id": "androidenterprise.collectionviewers.delete",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+     "httpMethod": "DELETE",
+     "description": "Removes the user from the list of those specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only such users will see the collection.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId",
+      "userId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "get": {
+     "id": "androidenterprise.collectionviewers.get",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+     "httpMethod": "GET",
+     "description": "Retrieves the ID of the user if they have been specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only these users will see the collection.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId",
+      "userId"
+     ],
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.collectionviewers.list",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}/users",
+     "httpMethod": "GET",
+     "description": "Retrieves the IDs of the users who have been specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only these users will see the collection.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId"
+     ],
+     "response": {
+      "$ref": "CollectionViewersListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "patch": {
+     "id": "androidenterprise.collectionviewers.patch",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+     "httpMethod": "PATCH",
+     "description": "Adds the user to the list of those specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only such users will see the collection. This method supports patch semantics.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId",
+      "userId"
+     ],
+     "request": {
+      "$ref": "User"
+     },
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "update": {
+     "id": "androidenterprise.collectionviewers.update",
+     "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+     "httpMethod": "PUT",
+     "description": "Adds the user to the list of those specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only such users will see the collection.",
+     "parameters": {
+      "collectionId": {
+       "type": "string",
+       "description": "The ID of the collection.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "collectionId",
+      "userId"
+     ],
+     "request": {
+      "$ref": "User"
+     },
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "devices": {
+   "methods": {
+    "get": {
+     "id": "androidenterprise.devices.get",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}",
+     "httpMethod": "GET",
+     "description": "Retrieves the details of a device.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId"
+     ],
+     "response": {
+      "$ref": "Device"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "getState": {
+     "id": "androidenterprise.devices.getState",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state",
+     "httpMethod": "GET",
+     "description": "Retrieves whether a device is enabled or disabled for access by the user to Google services. The device state takes effect only if enforcing EMM policies on Android devices is enabled in the Google Admin Console. Otherwise, the device state is ignored and all devices are allowed access to Google services.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId"
+     ],
+     "response": {
+      "$ref": "DeviceState"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.devices.list",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices",
+     "httpMethod": "GET",
+     "description": "Retrieves the IDs of all of a user's devices.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId"
+     ],
+     "response": {
+      "$ref": "DevicesListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "setState": {
+     "id": "androidenterprise.devices.setState",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state",
+     "httpMethod": "PUT",
+     "description": "Sets whether a device is enabled or disabled for access by the user to Google services. The device state takes effect only if enforcing EMM policies on Android devices is enabled in the Google Admin Console. Otherwise, the device state is ignored and all devices are allowed access to Google services.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId"
+     ],
+     "request": {
+      "$ref": "DeviceState"
+     },
+     "response": {
+      "$ref": "DeviceState"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "enterprises": {
+   "methods": {
+    "delete": {
+     "id": "androidenterprise.enterprises.delete",
+     "path": "enterprises/{enterpriseId}",
+     "httpMethod": "DELETE",
+     "description": "Deletes the binding between the MDM and enterprise. This is now deprecated; use this to unenroll customers that were previously enrolled with the 'insert' call, then enroll them again with the 'enroll' call.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "enroll": {
+     "id": "androidenterprise.enterprises.enroll",
+     "path": "enterprises/enroll",
+     "httpMethod": "POST",
+     "description": "Enrolls an enterprise with the calling MDM.",
+     "parameters": {
+      "token": {
+       "type": "string",
+       "description": "The token provided by the enterprise to register the MDM.",
+       "required": true,
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "token"
+     ],
+     "request": {
+      "$ref": "Enterprise"
+     },
+     "response": {
+      "$ref": "Enterprise"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "get": {
+     "id": "androidenterprise.enterprises.get",
+     "path": "enterprises/{enterpriseId}",
+     "httpMethod": "GET",
+     "description": "Retrieves the name and domain of an enterprise.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId"
+     ],
+     "response": {
+      "$ref": "Enterprise"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "insert": {
+     "id": "androidenterprise.enterprises.insert",
+     "path": "enterprises",
+     "httpMethod": "POST",
+     "description": "Establishes the binding between the MDM and an enterprise. This is now deprecated; use enroll instead.",
+     "parameters": {
+      "token": {
+       "type": "string",
+       "description": "The token provided by the enterprise to register the MDM.",
+       "required": true,
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "token"
+     ],
+     "request": {
+      "$ref": "Enterprise"
+     },
+     "response": {
+      "$ref": "Enterprise"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.enterprises.list",
+     "path": "enterprises",
+     "httpMethod": "GET",
+     "description": "Looks up an enterprise by domain name.",
+     "parameters": {
+      "domain": {
+       "type": "string",
+       "description": "The exact primary domain name of the enterprise to look up.",
+       "required": true,
+       "location": "query"
+      }
+     },
+     "parameterOrder": [
+      "domain"
+     ],
+     "response": {
+      "$ref": "EnterprisesListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "setAccount": {
+     "id": "androidenterprise.enterprises.setAccount",
+     "path": "enterprises/{enterpriseId}/account",
+     "httpMethod": "PUT",
+     "description": "Set the account that will be used to authenticate to the API as the enterprise.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId"
+     ],
+     "request": {
+      "$ref": "EnterpriseAccount"
+     },
+     "response": {
+      "$ref": "EnterpriseAccount"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "unenroll": {
+     "id": "androidenterprise.enterprises.unenroll",
+     "path": "enterprises/{enterpriseId}/unenroll",
+     "httpMethod": "POST",
+     "description": "Unenrolls an enterprise from the calling MDM.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "entitlements": {
+   "methods": {
+    "delete": {
+     "id": "androidenterprise.entitlements.delete",
+     "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+     "httpMethod": "DELETE",
+     "description": "Removes an entitlement to an app for a user and uninstalls it.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "entitlementId": {
+       "type": "string",
+       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "entitlementId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "get": {
+     "id": "androidenterprise.entitlements.get",
+     "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+     "httpMethod": "GET",
+     "description": "Retrieves details of an entitlement.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "entitlementId": {
+       "type": "string",
+       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "entitlementId"
+     ],
+     "response": {
+      "$ref": "Entitlement"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.entitlements.list",
+     "path": "enterprises/{enterpriseId}/users/{userId}/entitlements",
+     "httpMethod": "GET",
+     "description": "List of all entitlements for the specified user. Only the ID is set.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId"
+     ],
+     "response": {
+      "$ref": "EntitlementsListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "patch": {
+     "id": "androidenterprise.entitlements.patch",
+     "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+     "httpMethod": "PATCH",
+     "description": "Adds or updates an entitlement to an app for a user. This method supports patch semantics.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "entitlementId": {
+       "type": "string",
+       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "install": {
+       "type": "boolean",
+       "description": "Set to true to also install the product on all the user's devices where possible. Failure to install on one or more devices will not prevent this operation from returning successfully, as long as the entitlement was successfully assigned to the user.",
+       "location": "query"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "entitlementId"
+     ],
+     "request": {
+      "$ref": "Entitlement"
+     },
+     "response": {
+      "$ref": "Entitlement"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "update": {
+     "id": "androidenterprise.entitlements.update",
+     "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+     "httpMethod": "PUT",
+     "description": "Adds or updates an entitlement to an app for a user.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "entitlementId": {
+       "type": "string",
+       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "install": {
+       "type": "boolean",
+       "description": "Set to true to also install the product on all the user's devices where possible. Failure to install on one or more devices will not prevent this operation from returning successfully, as long as the entitlement was successfully assigned to the user.",
+       "location": "query"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "entitlementId"
+     ],
+     "request": {
+      "$ref": "Entitlement"
+     },
+     "response": {
+      "$ref": "Entitlement"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "grouplicenses": {
+   "methods": {
+    "get": {
+     "id": "androidenterprise.grouplicenses.get",
+     "path": "enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}",
+     "httpMethod": "GET",
+     "description": "Retrieves details of an enterprise's group license for a product.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "groupLicenseId": {
+       "type": "string",
+       "description": "The ID of the product the group license is for, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "groupLicenseId"
+     ],
+     "response": {
+      "$ref": "GroupLicense"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.grouplicenses.list",
+     "path": "enterprises/{enterpriseId}/groupLicenses",
+     "httpMethod": "GET",
+     "description": "Retrieves IDs of all products for which the enterprise has a group license.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId"
+     ],
+     "response": {
+      "$ref": "GroupLicensesListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "grouplicenseusers": {
+   "methods": {
+    "list": {
+     "id": "androidenterprise.grouplicenseusers.list",
+     "path": "enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}/users",
+     "httpMethod": "GET",
+     "description": "Retrieves the IDs of the users who have been granted entitlements under the license.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "groupLicenseId": {
+       "type": "string",
+       "description": "The ID of the product the group license is for, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "groupLicenseId"
+     ],
+     "response": {
+      "$ref": "GroupLicenseUsersListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "installs": {
+   "methods": {
+    "delete": {
+     "id": "androidenterprise.installs.delete",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+     "httpMethod": "DELETE",
+     "description": "Requests to remove an app from a device. A call to get or list will still show the app as installed on the device until it is actually removed.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The Android ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "installId": {
+       "type": "string",
+       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId",
+      "installId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "get": {
+     "id": "androidenterprise.installs.get",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+     "httpMethod": "GET",
+     "description": "Retrieves details of an installation of an app on a device.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The Android ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "installId": {
+       "type": "string",
+       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId",
+      "installId"
+     ],
+     "response": {
+      "$ref": "Install"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.installs.list",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs",
+     "httpMethod": "GET",
+     "description": "Retrieves the details of all apps installed on the specified device.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The Android ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId"
+     ],
+     "response": {
+      "$ref": "InstallsListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "patch": {
+     "id": "androidenterprise.installs.patch",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+     "httpMethod": "PATCH",
+     "description": "Requests to install the latest version of an app to a device. If the app is already installed then it is updated to the latest version if necessary. This method supports patch semantics.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The Android ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "installId": {
+       "type": "string",
+       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId",
+      "installId"
+     ],
+     "request": {
+      "$ref": "Install"
+     },
+     "response": {
+      "$ref": "Install"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "update": {
+     "id": "androidenterprise.installs.update",
+     "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+     "httpMethod": "PUT",
+     "description": "Requests to install the latest version of an app to a device. If the app is already installed then it is updated to the latest version if necessary.",
+     "parameters": {
+      "deviceId": {
+       "type": "string",
+       "description": "The Android ID of the device.",
+       "required": true,
+       "location": "path"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "installId": {
+       "type": "string",
+       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId",
+      "deviceId",
+      "installId"
+     ],
+     "request": {
+      "$ref": "Install"
+     },
+     "response": {
+      "$ref": "Install"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "permissions": {
+   "methods": {
+    "get": {
+     "id": "androidenterprise.permissions.get",
+     "path": "permissions/{permissionId}",
+     "httpMethod": "GET",
+     "description": "Retrieves details of an Android app permission for display to an enterprise admin.",
+     "parameters": {
+      "language": {
+       "type": "string",
+       "description": "The BCP47 tag for the user's preferred language (e.g. \"en-US\", \"de\")",
+       "location": "query"
+      },
+      "permissionId": {
+       "type": "string",
+       "description": "The ID of the permission.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "permissionId"
+     ],
+     "response": {
+      "$ref": "Permission"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "products": {
+   "methods": {
+    "get": {
+     "id": "androidenterprise.products.get",
+     "path": "enterprises/{enterpriseId}/products/{productId}",
+     "httpMethod": "GET",
+     "description": "Retrieves details of a product for display to an enterprise admin.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "language": {
+       "type": "string",
+       "description": "The BCP47 tag for the user's preferred language (e.g. \"en-US\", \"de\").",
+       "location": "query"
+      },
+      "productId": {
+       "type": "string",
+       "description": "The ID of the product, e.g. \"app:com.google.android.gm\".",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "productId"
+     ],
+     "response": {
+      "$ref": "Product"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "getAppRestrictionsSchema": {
+     "id": "androidenterprise.products.getAppRestrictionsSchema",
+     "path": "enterprises/{enterpriseId}/products/{productId}/appRestrictionsSchema",
+     "httpMethod": "GET",
+     "description": "Retrieves the schema defining app restrictions configurable for this product. All products have a schema, but this may be empty if no app restrictions are defined.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "language": {
+       "type": "string",
+       "description": "The BCP47 tag for the user's preferred language (e.g. \"en-US\", \"de\").",
+       "location": "query"
+      },
+      "productId": {
+       "type": "string",
+       "description": "The ID of the product.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "productId"
+     ],
+     "response": {
+      "$ref": "AppRestrictionsSchema"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "getPermissions": {
+     "id": "androidenterprise.products.getPermissions",
+     "path": "enterprises/{enterpriseId}/products/{productId}/permissions",
+     "httpMethod": "GET",
+     "description": "Retrieves the Android app permissions required by this app.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "productId": {
+       "type": "string",
+       "description": "The ID of the product.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "productId"
+     ],
+     "response": {
+      "$ref": "ProductPermissions"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "updatePermissions": {
+     "id": "androidenterprise.products.updatePermissions",
+     "path": "enterprises/{enterpriseId}/products/{productId}/permissions",
+     "httpMethod": "PUT",
+     "description": "Updates the set of Android app permissions for this app that have been accepted by the enterprise.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "productId": {
+       "type": "string",
+       "description": "The ID of the product.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "productId"
+     ],
+     "request": {
+      "$ref": "ProductPermissions"
+     },
+     "response": {
+      "$ref": "ProductPermissions"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  },
+  "users": {
+   "methods": {
+    "generateToken": {
+     "id": "androidenterprise.users.generateToken",
+     "path": "enterprises/{enterpriseId}/users/{userId}/token",
+     "httpMethod": "POST",
+     "description": "Generates a token (activation code) to allow this user to configure their work account in the Android Setup Wizard. Revokes any previously generated token.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId"
+     ],
+     "response": {
+      "$ref": "UserToken"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "get": {
+     "id": "androidenterprise.users.get",
+     "path": "enterprises/{enterpriseId}/users/{userId}",
+     "httpMethod": "GET",
+     "description": "Retrieves a user's details.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId"
+     ],
+     "response": {
+      "$ref": "User"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "list": {
+     "id": "androidenterprise.users.list",
+     "path": "enterprises/{enterpriseId}/users",
+     "httpMethod": "GET",
+     "description": "Looks up a user by email address.",
+     "parameters": {
+      "email": {
+       "type": "string",
+       "description": "The exact primary email address of the user to look up.",
+       "required": true,
+       "location": "query"
+      },
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "email"
+     ],
+     "response": {
+      "$ref": "UsersListResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    },
+    "revokeToken": {
+     "id": "androidenterprise.users.revokeToken",
+     "path": "enterprises/{enterpriseId}/users/{userId}/token",
+     "httpMethod": "DELETE",
+     "description": "Revokes a previously generated token (activation code) for the user.",
+     "parameters": {
+      "enterpriseId": {
+       "type": "string",
+       "description": "The ID of the enterprise.",
+       "required": true,
+       "location": "path"
+      },
+      "userId": {
+       "type": "string",
+       "description": "The ID of the user.",
+       "required": true,
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "enterpriseId",
+      "userId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/androidenterprise"
+     ]
+    }
+   }
+  }
+ }
+}
diff --git a/androidenterprise/v1/androidenterprise-gen.go b/androidenterprise/v1/androidenterprise-gen.go
new file mode 100644
index 0000000..a28c6a1
--- /dev/null
+++ b/androidenterprise/v1/androidenterprise-gen.go
@@ -0,0 +1,4677 @@
+// Package androidenterprise provides access to the Google Play MDM API.
+//
+// Usage example:
+//
+//   import "google.golang.org/api/androidenterprise/v1"
+//   ...
+//   androidenterpriseService, err := androidenterprise.New(oauthHttpClient)
+package androidenterprise
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"golang.org/x/net/context"
+	"google.golang.org/api/googleapi"
+	"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
+var _ = context.Background
+
+const apiId = "androidenterprise:v1"
+const apiName = "androidenterprise"
+const apiVersion = "v1"
+const basePath = "https://www.googleapis.com/androidenterprise/v1/"
+
+// OAuth2 scopes used by this API.
+const (
+	// Manage corporate Android devices
+	AndroidenterpriseScope = "https://www.googleapis.com/auth/androidenterprise"
+)
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client, BasePath: basePath}
+	s.Collections = NewCollectionsService(s)
+	s.Collectionviewers = NewCollectionviewersService(s)
+	s.Devices = NewDevicesService(s)
+	s.Enterprises = NewEnterprisesService(s)
+	s.Entitlements = NewEntitlementsService(s)
+	s.Grouplicenses = NewGrouplicensesService(s)
+	s.Grouplicenseusers = NewGrouplicenseusersService(s)
+	s.Installs = NewInstallsService(s)
+	s.Permissions = NewPermissionsService(s)
+	s.Products = NewProductsService(s)
+	s.Users = NewUsersService(s)
+	return s, nil
+}
+
+type Service struct {
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+
+	Collections *CollectionsService
+
+	Collectionviewers *CollectionviewersService
+
+	Devices *DevicesService
+
+	Enterprises *EnterprisesService
+
+	Entitlements *EntitlementsService
+
+	Grouplicenses *GrouplicensesService
+
+	Grouplicenseusers *GrouplicenseusersService
+
+	Installs *InstallsService
+
+	Permissions *PermissionsService
+
+	Products *ProductsService
+
+	Users *UsersService
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
+func NewCollectionsService(s *Service) *CollectionsService {
+	rs := &CollectionsService{s: s}
+	return rs
+}
+
+type CollectionsService struct {
+	s *Service
+}
+
+func NewCollectionviewersService(s *Service) *CollectionviewersService {
+	rs := &CollectionviewersService{s: s}
+	return rs
+}
+
+type CollectionviewersService struct {
+	s *Service
+}
+
+func NewDevicesService(s *Service) *DevicesService {
+	rs := &DevicesService{s: s}
+	return rs
+}
+
+type DevicesService struct {
+	s *Service
+}
+
+func NewEnterprisesService(s *Service) *EnterprisesService {
+	rs := &EnterprisesService{s: s}
+	return rs
+}
+
+type EnterprisesService struct {
+	s *Service
+}
+
+func NewEntitlementsService(s *Service) *EntitlementsService {
+	rs := &EntitlementsService{s: s}
+	return rs
+}
+
+type EntitlementsService struct {
+	s *Service
+}
+
+func NewGrouplicensesService(s *Service) *GrouplicensesService {
+	rs := &GrouplicensesService{s: s}
+	return rs
+}
+
+type GrouplicensesService struct {
+	s *Service
+}
+
+func NewGrouplicenseusersService(s *Service) *GrouplicenseusersService {
+	rs := &GrouplicenseusersService{s: s}
+	return rs
+}
+
+type GrouplicenseusersService struct {
+	s *Service
+}
+
+func NewInstallsService(s *Service) *InstallsService {
+	rs := &InstallsService{s: s}
+	return rs
+}
+
+type InstallsService struct {
+	s *Service
+}
+
+func NewPermissionsService(s *Service) *PermissionsService {
+	rs := &PermissionsService{s: s}
+	return rs
+}
+
+type PermissionsService struct {
+	s *Service
+}
+
+func NewProductsService(s *Service) *ProductsService {
+	rs := &ProductsService{s: s}
+	return rs
+}
+
+type ProductsService struct {
+	s *Service
+}
+
+func NewUsersService(s *Service) *UsersService {
+	rs := &UsersService{s: s}
+	return rs
+}
+
+type UsersService struct {
+	s *Service
+}
+
+type AppRestrictionsSchema struct {
+	// Restrictions: The set of restrictions that make up this schema.
+	Restrictions []*AppRestrictionsSchemaRestriction `json:"restrictions,omitempty"`
+}
+
+type AppRestrictionsSchemaRestriction struct {
+	// DefaultValue: The default value of the restriction.
+	DefaultValue *AppRestrictionsSchemaRestrictionRestrictionValue `json:"defaultValue,omitempty"`
+
+	// Description: A longer description of the restriction, giving more
+	// detail of what it affects.
+	Description string `json:"description,omitempty"`
+
+	// Entry: For choice or multiselect restrictions, the list of possible
+	// entries' human-readable names.
+	Entry []string `json:"entry,omitempty"`
+
+	// EntryValue: For choice or multiselect restrictions, the list of
+	// possible entries' machine-readable values.
+	EntryValue []string `json:"entryValue,omitempty"`
+
+	// Key: The unique key that the product uses to identify the
+	// restriction, e.g. "com.google.android.gm.fieldname".
+	Key string `json:"key,omitempty"`
+
+	// RestrictionType: The type of the restriction.
+	RestrictionType string `json:"restrictionType,omitempty"`
+
+	// Title: The name of the restriction.
+	Title string `json:"title,omitempty"`
+}
+
+type AppRestrictionsSchemaRestrictionRestrictionValue struct {
+	// Type: The type of the value being provided.
+	Type string `json:"type,omitempty"`
+
+	// ValueBool: The boolean value - this will only be present if type is
+	// bool.
+	ValueBool bool `json:"valueBool,omitempty"`
+
+	// ValueInteger: The integer value - this will only be present if type
+	// is integer.
+	ValueInteger int64 `json:"valueInteger,omitempty"`
+
+	// ValueMultiselect: The list of string values - this will only be
+	// present if type is multiselect.
+	ValueMultiselect []string `json:"valueMultiselect,omitempty"`
+
+	// ValueString: The string value - this will be present for types
+	// string, choice and hidden.
+	ValueString string `json:"valueString,omitempty"`
+}
+
+type Collection struct {
+	// CollectionId: Arbitrary unique ID, allocated by the API on creation.
+	CollectionId string `json:"collectionId,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#collection".
+	Kind string `json:"kind,omitempty"`
+
+	// Name: A user-friendly name for the collection (should be unique),
+	// e.g. "Accounting apps".
+	Name string `json:"name,omitempty"`
+
+	// ProductId: The IDs of the products in the collection, in the order in
+	// which they should be displayed.
+	ProductId []string `json:"productId,omitempty"`
+
+	// Visibility: Whether this collection is visible to all users, or only
+	// to the users that have been granted access through the
+	// collection_viewers api. Even if a collection is visible to allUsers,
+	// it is possible to add and remove viewers, but this will have no
+	// effect until the collection's visibility changes to viewersOnly.
+	Visibility string `json:"visibility,omitempty"`
+}
+
+type CollectionViewersListResponse struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#collectionViewersListResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// User: A user of an enterprise.
+	User []*User `json:"user,omitempty"`
+}
+
+type CollectionsListResponse struct {
+	// Collection: An ordered collection of products which can be made
+	// visible on the Google Play Store app to a selected group of users.
+	Collection []*Collection `json:"collection,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#collectionsListResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type Device struct {
+	// AndroidId: The Google Play Services Android ID for the device encoded
+	// as a lowercase hex string, e.g. "123456789abcdef0".
+	AndroidId string `json:"androidId,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#device".
+	Kind string `json:"kind,omitempty"`
+}
+
+type DeviceState struct {
+	// AccountState: The state of the Google account on the device.
+	// "enabled" indicates that the Google account on the device can be used
+	// to access Google services (including Google Play), while "disabled"
+	// means that it cannot. A new device is initially in the "disabled"
+	// state.
+	AccountState string `json:"accountState,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#deviceState".
+	Kind string `json:"kind,omitempty"`
+}
+
+type DevicesListResponse struct {
+	// Device: A managed device.
+	Device []*Device `json:"device,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#devicesListResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type Enterprise struct {
+	// Id: The unique ID for the enterprise.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#enterprise".
+	Kind string `json:"kind,omitempty"`
+
+	// Name: The name of the enterprise, e.g. "Example Inc".
+	Name string `json:"name,omitempty"`
+
+	// PrimaryDomain: The enterprise's primary domain, e.g. "example.com".
+	PrimaryDomain string `json:"primaryDomain,omitempty"`
+}
+
+type EnterpriseAccount struct {
+	// AccountEmail: The email address of the service account.
+	AccountEmail string `json:"accountEmail,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#enterpriseAccount".
+	Kind string `json:"kind,omitempty"`
+}
+
+type EnterprisesListResponse struct {
+	// Enterprise: An enterprise.
+	Enterprise []*Enterprise `json:"enterprise,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#enterprisesListResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type Entitlement struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#entitlement".
+	Kind string `json:"kind,omitempty"`
+
+	// ProductId: The ID of the product that the entitlement is for, e.g.
+	// "app:com.google.android.gm".
+	ProductId string `json:"productId,omitempty"`
+
+	// Reason: The reason for the entitlement, e.g. "free" for free apps.
+	// This is temporary, it will be replaced by the acquisition kind field
+	// of group licenses.
+	Reason string `json:"reason,omitempty"`
+}
+
+type EntitlementsListResponse struct {
+	// Entitlement: An entitlement of a user to a product (e.g. an app). For
+	// example, a free app that they have installed, or a paid app that they
+	// have been allocated a license to.
+	Entitlement []*Entitlement `json:"entitlement,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#entitlementsListResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type GroupLicense struct {
+	// AcquisitionKind: How this group license was acquired. "bulkPurchase"
+	// means that this group license object was created because the
+	// enterprise purchased licenses for this product; this is "free"
+	// otherwise (for free products).
+	AcquisitionKind string `json:"acquisitionKind,omitempty"`
+
+	// Approval: Whether the product to which this group license relates is
+	// currently approved by the enterprise, as either "approved" or
+	// "unapproved". Products are approved when a group license is first
+	// created, but this approval may be revoked by an enterprise admin via
+	// Google Play. Unapproved products will not be visible to end users in
+	// collections and new entitlements to them should not normally be
+	// created.
+	Approval string `json:"approval,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#groupLicense".
+	Kind string `json:"kind,omitempty"`
+
+	// NumProvisioned: The total number of provisioned licenses for this
+	// product. Returned by read operations, but ignored in write
+	// operations.
+	NumProvisioned int64 `json:"numProvisioned,omitempty"`
+
+	// NumPurchased: The number of purchased licenses (possibly in multiple
+	// purchases). If this field is omitted then there is no limit on the
+	// number of licenses that can be provisioned (e.g. if the acquisition
+	// kind is "free").
+	NumPurchased int64 `json:"numPurchased,omitempty"`
+
+	// ProductId: The ID of the product that the license is for, e.g.
+	// "app:com.google.android.gm".
+	ProductId string `json:"productId,omitempty"`
+}
+
+type GroupLicenseUsersListResponse struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#groupLicenseUsersListResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// User: A user of an enterprise.
+	User []*User `json:"user,omitempty"`
+}
+
+type GroupLicensesListResponse struct {
+	// GroupLicense: A group license for a product approved for use in the
+	// enterprise.
+	GroupLicense []*GroupLicense `json:"groupLicense,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#groupLicensesListResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type Install struct {
+	// InstallState: Install state. The state "installPending" means that an
+	// install request has recently been made and download to the device is
+	// in progress. The state "installed" means that the app has been
+	// installed. This field is read-only.
+	InstallState string `json:"installState,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#install".
+	Kind string `json:"kind,omitempty"`
+
+	// ProductId: The ID of the product that the install is for, e.g.
+	// "app:com.google.android.gm".
+	ProductId string `json:"productId,omitempty"`
+
+	// VersionCode: The version of the installed product. Guaranteed to be
+	// set only if the install state is "installed".
+	VersionCode int64 `json:"versionCode,omitempty"`
+}
+
+type InstallsListResponse struct {
+	// Install: An installation of an app for a user on a specific device.
+	// The existence of an install implies that the user must have an
+	// entitlement to the app.
+	Install []*Install `json:"install,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#installsListResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
+type Permission struct {
+	// Description: A longer description of the permissions giving more
+	// details of what it affects.
+	Description string `json:"description,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#permission".
+	Kind string `json:"kind,omitempty"`
+
+	// Name: The name of the permission.
+	Name string `json:"name,omitempty"`
+
+	// PermissionId: An opaque string uniquely identifying the permission.
+	PermissionId string `json:"permissionId,omitempty"`
+}
+
+type Product struct {
+	// AuthorName: The name of the author of the product (e.g. the app
+	// developer).
+	AuthorName string `json:"authorName,omitempty"`
+
+	// DetailsUrl: A link to the (consumer) Google Play details page for the
+	// product.
+	DetailsUrl string `json:"detailsUrl,omitempty"`
+
+	// IconUrl: A link to an image that can be used as an icon for the
+	// product.
+	IconUrl string `json:"iconUrl,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#product".
+	Kind string `json:"kind,omitempty"`
+
+	// ProductId: A string of the form "app:
+	// " - e.g.
+	// "app:com.google.android.gm" represents the GMail app.
+	ProductId string `json:"productId,omitempty"`
+
+	// Title: The name of the product.
+	Title string `json:"title,omitempty"`
+
+	// WorkDetailsUrl: A link to the Google Play for Work details page for
+	// the product, for use by an Enterprise administrator.
+	WorkDetailsUrl string `json:"workDetailsUrl,omitempty"`
+}
+
+type ProductPermission struct {
+	// PermissionId: An opaque string uniquely identifying the permission.
+	PermissionId string `json:"permissionId,omitempty"`
+
+	// State: Whether the permission has been accepted or not.
+	State string `json:"state,omitempty"`
+}
+
+type ProductPermissions struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#productPermissions".
+	Kind string `json:"kind,omitempty"`
+
+	// Permission: The permissions required by the app.
+	Permission []*ProductPermission `json:"permission,omitempty"`
+
+	// ProductId: The ID of the app that the permissions relate to, e.g.
+	// "app:com.google.android.gm".
+	ProductId string `json:"productId,omitempty"`
+}
+
+type User struct {
+	// Id: The unique ID for the user.
+	Id string `json:"id,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#user".
+	Kind string `json:"kind,omitempty"`
+
+	// PrimaryEmail: The user's primary email, e.g. "jsmith@example.com".
+	PrimaryEmail string `json:"primaryEmail,omitempty"`
+}
+
+type UserToken struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#userToken".
+	Kind string `json:"kind,omitempty"`
+
+	// Token: The token (activation code) to be entered by the user. This
+	// consists of a sequence of decimal digits. Note that the leading digit
+	// may be 0.
+	Token string `json:"token,omitempty"`
+
+	// UserId: The unique ID for the user.
+	UserId string `json:"userId,omitempty"`
+}
+
+type UsersListResponse struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "androidenterprise#usersListResponse".
+	Kind string `json:"kind,omitempty"`
+
+	// User: A user of an enterprise.
+	User []*User `json:"user,omitempty"`
+}
+
+// method id "androidenterprise.collections.delete":
+
+type CollectionsDeleteCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	opt_         map[string]interface{}
+}
+
+// Delete: Deletes a collection.
+func (r *CollectionsService) Delete(enterpriseId string, collectionId string) *CollectionsDeleteCall {
+	c := &CollectionsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionsDeleteCall) Fields(s ...googleapi.Field) *CollectionsDeleteCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes a collection.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidenterprise.collections.delete",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collections.get":
+
+type CollectionsGetCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves the details of a collection.
+func (r *CollectionsService) Get(enterpriseId string, collectionId string) *CollectionsGetCall {
+	c := &CollectionsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionsGetCall) Fields(s ...googleapi.Field) *CollectionsGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionsGetCall) Do() (*Collection, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Collection
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the details of a collection.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.collections.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+	//   "response": {
+	//     "$ref": "Collection"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collections.insert":
+
+type CollectionsInsertCall struct {
+	s            *Service
+	enterpriseId string
+	collection   *Collection
+	opt_         map[string]interface{}
+}
+
+// Insert: Creates a new collection.
+func (r *CollectionsService) Insert(enterpriseId string, collection *Collection) *CollectionsInsertCall {
+	c := &CollectionsInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collection = collection
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionsInsertCall) Fields(s ...googleapi.Field) *CollectionsInsertCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionsInsertCall) Do() (*Collection, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.collection)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Collection
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates a new collection.",
+	//   "httpMethod": "POST",
+	//   "id": "androidenterprise.collections.insert",
+	//   "parameterOrder": [
+	//     "enterpriseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections",
+	//   "request": {
+	//     "$ref": "Collection"
+	//   },
+	//   "response": {
+	//     "$ref": "Collection"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collections.list":
+
+type CollectionsListCall struct {
+	s            *Service
+	enterpriseId string
+	opt_         map[string]interface{}
+}
+
+// List: Retrieves the IDs of all the collections for an enterprise.
+func (r *CollectionsService) List(enterpriseId string) *CollectionsListCall {
+	c := &CollectionsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionsListCall) Fields(s ...googleapi.Field) *CollectionsListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionsListCall) Do() (*CollectionsListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *CollectionsListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the IDs of all the collections for an enterprise.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.collections.list",
+	//   "parameterOrder": [
+	//     "enterpriseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections",
+	//   "response": {
+	//     "$ref": "CollectionsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collections.patch":
+
+type CollectionsPatchCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	collection   *Collection
+	opt_         map[string]interface{}
+}
+
+// Patch: Updates a collection. This method supports patch semantics.
+func (r *CollectionsService) Patch(enterpriseId string, collectionId string, collection *Collection) *CollectionsPatchCall {
+	c := &CollectionsPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	c.collection = collection
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionsPatchCall) Fields(s ...googleapi.Field) *CollectionsPatchCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionsPatchCall) Do() (*Collection, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.collection)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Collection
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a collection. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidenterprise.collections.patch",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+	//   "request": {
+	//     "$ref": "Collection"
+	//   },
+	//   "response": {
+	//     "$ref": "Collection"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collections.update":
+
+type CollectionsUpdateCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	collection   *Collection
+	opt_         map[string]interface{}
+}
+
+// Update: Updates a collection.
+func (r *CollectionsService) Update(enterpriseId string, collectionId string, collection *Collection) *CollectionsUpdateCall {
+	c := &CollectionsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	c.collection = collection
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionsUpdateCall) Fields(s ...googleapi.Field) *CollectionsUpdateCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionsUpdateCall) Do() (*Collection, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.collection)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Collection
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a collection.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidenterprise.collections.update",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}",
+	//   "request": {
+	//     "$ref": "Collection"
+	//   },
+	//   "response": {
+	//     "$ref": "Collection"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collectionviewers.delete":
+
+type CollectionviewersDeleteCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	userId       string
+	opt_         map[string]interface{}
+}
+
+// Delete: Removes the user from the list of those specifically allowed
+// to see the collection. If the collection's visibility is set to
+// viewersOnly then only such users will see the collection.
+func (r *CollectionviewersService) Delete(enterpriseId string, collectionId string, userId string) *CollectionviewersDeleteCall {
+	c := &CollectionviewersDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	c.userId = userId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionviewersDeleteCall) Fields(s ...googleapi.Field) *CollectionviewersDeleteCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionviewersDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Removes the user from the list of those specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only such users will see the collection.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidenterprise.collectionviewers.delete",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collectionviewers.get":
+
+type CollectionviewersGetCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	userId       string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves the ID of the user if they have been specifically
+// allowed to see the collection. If the collection's visibility is set
+// to viewersOnly then only these users will see the collection.
+func (r *CollectionviewersService) Get(enterpriseId string, collectionId string, userId string) *CollectionviewersGetCall {
+	c := &CollectionviewersGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	c.userId = userId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionviewersGetCall) Fields(s ...googleapi.Field) *CollectionviewersGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionviewersGetCall) Do() (*User, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *User
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the ID of the user if they have been specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only these users will see the collection.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.collectionviewers.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collectionviewers.list":
+
+type CollectionviewersListCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	opt_         map[string]interface{}
+}
+
+// List: Retrieves the IDs of the users who have been specifically
+// allowed to see the collection. If the collection's visibility is set
+// to viewersOnly then only these users will see the collection.
+func (r *CollectionviewersService) List(enterpriseId string, collectionId string) *CollectionviewersListCall {
+	c := &CollectionviewersListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionviewersListCall) Fields(s ...googleapi.Field) *CollectionviewersListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionviewersListCall) Do() (*CollectionViewersListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}/users")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *CollectionViewersListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the IDs of the users who have been specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only these users will see the collection.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.collectionviewers.list",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}/users",
+	//   "response": {
+	//     "$ref": "CollectionViewersListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collectionviewers.patch":
+
+type CollectionviewersPatchCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	userId       string
+	user         *User
+	opt_         map[string]interface{}
+}
+
+// Patch: Adds the user to the list of those specifically allowed to see
+// the collection. If the collection's visibility is set to viewersOnly
+// then only such users will see the collection. This method supports
+// patch semantics.
+func (r *CollectionviewersService) Patch(enterpriseId string, collectionId string, userId string, user *User) *CollectionviewersPatchCall {
+	c := &CollectionviewersPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	c.userId = userId
+	c.user = user
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionviewersPatchCall) Fields(s ...googleapi.Field) *CollectionviewersPatchCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionviewersPatchCall) 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")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *User
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Adds the user to the list of those specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only such users will see the collection. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidenterprise.collectionviewers.patch",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+	//   "request": {
+	//     "$ref": "User"
+	//   },
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.collectionviewers.update":
+
+type CollectionviewersUpdateCall struct {
+	s            *Service
+	enterpriseId string
+	collectionId string
+	userId       string
+	user         *User
+	opt_         map[string]interface{}
+}
+
+// Update: Adds the user to the list of those specifically allowed to
+// see the collection. If the collection's visibility is set to
+// viewersOnly then only such users will see the collection.
+func (r *CollectionviewersService) Update(enterpriseId string, collectionId string, userId string, user *User) *CollectionviewersUpdateCall {
+	c := &CollectionviewersUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.collectionId = collectionId
+	c.userId = userId
+	c.user = user
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *CollectionviewersUpdateCall) Fields(s ...googleapi.Field) *CollectionviewersUpdateCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *CollectionviewersUpdateCall) 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")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"collectionId": c.collectionId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *User
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Adds the user to the list of those specifically allowed to see the collection. If the collection's visibility is set to viewersOnly then only such users will see the collection.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidenterprise.collectionviewers.update",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "collectionId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "collectionId": {
+	//       "description": "The ID of the collection.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/collections/{collectionId}/users/{userId}",
+	//   "request": {
+	//     "$ref": "User"
+	//   },
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.devices.get":
+
+type DevicesGetCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves the details of a device.
+func (r *DevicesService) Get(enterpriseId string, userId string, deviceId string) *DevicesGetCall {
+	c := &DevicesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *DevicesGetCall) Fields(s ...googleapi.Field) *DevicesGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *DevicesGetCall) Do() (*Device, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Device
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the details of a device.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.devices.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}",
+	//   "response": {
+	//     "$ref": "Device"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.devices.getState":
+
+type DevicesGetStateCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	opt_         map[string]interface{}
+}
+
+// GetState: Retrieves whether a device is enabled or disabled for
+// access by the user to Google services. The device state takes effect
+// only if enforcing EMM policies on Android devices is enabled in the
+// Google Admin Console. Otherwise, the device state is ignored and all
+// devices are allowed access to Google services.
+func (r *DevicesService) GetState(enterpriseId string, userId string, deviceId string) *DevicesGetStateCall {
+	c := &DevicesGetStateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *DevicesGetStateCall) Fields(s ...googleapi.Field) *DevicesGetStateCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *DevicesGetStateCall) Do() (*DeviceState, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *DeviceState
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves whether a device is enabled or disabled for access by the user to Google services. The device state takes effect only if enforcing EMM policies on Android devices is enabled in the Google Admin Console. Otherwise, the device state is ignored and all devices are allowed access to Google services.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.devices.getState",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state",
+	//   "response": {
+	//     "$ref": "DeviceState"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.devices.list":
+
+type DevicesListCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	opt_         map[string]interface{}
+}
+
+// List: Retrieves the IDs of all of a user's devices.
+func (r *DevicesService) List(enterpriseId string, userId string) *DevicesListCall {
+	c := &DevicesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *DevicesListCall) Fields(s ...googleapi.Field) *DevicesListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *DevicesListCall) Do() (*DevicesListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *DevicesListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the IDs of all of a user's devices.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.devices.list",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices",
+	//   "response": {
+	//     "$ref": "DevicesListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.devices.setState":
+
+type DevicesSetStateCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	devicestate  *DeviceState
+	opt_         map[string]interface{}
+}
+
+// SetState: Sets whether a device is enabled or disabled for access by
+// the user to Google services. The device state takes effect only if
+// enforcing EMM policies on Android devices is enabled in the Google
+// Admin Console. Otherwise, the device state is ignored and all devices
+// are allowed access to Google services.
+func (r *DevicesService) SetState(enterpriseId string, userId string, deviceId string, devicestate *DeviceState) *DevicesSetStateCall {
+	c := &DevicesSetStateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	c.devicestate = devicestate
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *DevicesSetStateCall) Fields(s ...googleapi.Field) *DevicesSetStateCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *DevicesSetStateCall) Do() (*DeviceState, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.devicestate)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *DeviceState
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets whether a device is enabled or disabled for access by the user to Google services. The device state takes effect only if enforcing EMM policies on Android devices is enabled in the Google Admin Console. Otherwise, the device state is ignored and all devices are allowed access to Google services.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidenterprise.devices.setState",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state",
+	//   "request": {
+	//     "$ref": "DeviceState"
+	//   },
+	//   "response": {
+	//     "$ref": "DeviceState"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.enterprises.delete":
+
+type EnterprisesDeleteCall struct {
+	s            *Service
+	enterpriseId string
+	opt_         map[string]interface{}
+}
+
+// Delete: Deletes the binding between the MDM and enterprise. This is
+// now deprecated; use this to unenroll customers that were previously
+// enrolled with the 'insert' call, then enroll them again with the
+// 'enroll' call.
+func (r *EnterprisesService) Delete(enterpriseId string) *EnterprisesDeleteCall {
+	c := &EnterprisesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EnterprisesDeleteCall) Fields(s ...googleapi.Field) *EnterprisesDeleteCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EnterprisesDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes the binding between the MDM and enterprise. This is now deprecated; use this to unenroll customers that were previously enrolled with the 'insert' call, then enroll them again with the 'enroll' call.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidenterprise.enterprises.delete",
+	//   "parameterOrder": [
+	//     "enterpriseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.enterprises.enroll":
+
+type EnterprisesEnrollCall struct {
+	s          *Service
+	token      string
+	enterprise *Enterprise
+	opt_       map[string]interface{}
+}
+
+// Enroll: Enrolls an enterprise with the calling MDM.
+func (r *EnterprisesService) Enroll(token string, enterprise *Enterprise) *EnterprisesEnrollCall {
+	c := &EnterprisesEnrollCall{s: r.s, opt_: make(map[string]interface{})}
+	c.token = token
+	c.enterprise = enterprise
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EnterprisesEnrollCall) Fields(s ...googleapi.Field) *EnterprisesEnrollCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EnterprisesEnrollCall) Do() (*Enterprise, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.enterprise)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("token", fmt.Sprintf("%v", c.token))
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/enroll")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Enterprise
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Enrolls an enterprise with the calling MDM.",
+	//   "httpMethod": "POST",
+	//   "id": "androidenterprise.enterprises.enroll",
+	//   "parameterOrder": [
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "token": {
+	//       "description": "The token provided by the enterprise to register the MDM.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/enroll",
+	//   "request": {
+	//     "$ref": "Enterprise"
+	//   },
+	//   "response": {
+	//     "$ref": "Enterprise"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.enterprises.get":
+
+type EnterprisesGetCall struct {
+	s            *Service
+	enterpriseId string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves the name and domain of an enterprise.
+func (r *EnterprisesService) Get(enterpriseId string) *EnterprisesGetCall {
+	c := &EnterprisesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EnterprisesGetCall) Fields(s ...googleapi.Field) *EnterprisesGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EnterprisesGetCall) Do() (*Enterprise, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Enterprise
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the name and domain of an enterprise.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.enterprises.get",
+	//   "parameterOrder": [
+	//     "enterpriseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}",
+	//   "response": {
+	//     "$ref": "Enterprise"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.enterprises.insert":
+
+type EnterprisesInsertCall struct {
+	s          *Service
+	token      string
+	enterprise *Enterprise
+	opt_       map[string]interface{}
+}
+
+// Insert: Establishes the binding between the MDM and an enterprise.
+// This is now deprecated; use enroll instead.
+func (r *EnterprisesService) Insert(token string, enterprise *Enterprise) *EnterprisesInsertCall {
+	c := &EnterprisesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+	c.token = token
+	c.enterprise = enterprise
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EnterprisesInsertCall) Fields(s ...googleapi.Field) *EnterprisesInsertCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EnterprisesInsertCall) Do() (*Enterprise, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.enterprise)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("token", fmt.Sprintf("%v", c.token))
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Enterprise
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Establishes the binding between the MDM and an enterprise. This is now deprecated; use enroll instead.",
+	//   "httpMethod": "POST",
+	//   "id": "androidenterprise.enterprises.insert",
+	//   "parameterOrder": [
+	//     "token"
+	//   ],
+	//   "parameters": {
+	//     "token": {
+	//       "description": "The token provided by the enterprise to register the MDM.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises",
+	//   "request": {
+	//     "$ref": "Enterprise"
+	//   },
+	//   "response": {
+	//     "$ref": "Enterprise"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.enterprises.list":
+
+type EnterprisesListCall struct {
+	s      *Service
+	domain string
+	opt_   map[string]interface{}
+}
+
+// List: Looks up an enterprise by domain name.
+func (r *EnterprisesService) List(domain string) *EnterprisesListCall {
+	c := &EnterprisesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.domain = domain
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EnterprisesListCall) Fields(s ...googleapi.Field) *EnterprisesListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EnterprisesListCall) Do() (*EnterprisesListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("domain", fmt.Sprintf("%v", c.domain))
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *EnterprisesListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Looks up an enterprise by domain name.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.enterprises.list",
+	//   "parameterOrder": [
+	//     "domain"
+	//   ],
+	//   "parameters": {
+	//     "domain": {
+	//       "description": "The exact primary domain name of the enterprise to look up.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises",
+	//   "response": {
+	//     "$ref": "EnterprisesListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.enterprises.setAccount":
+
+type EnterprisesSetAccountCall struct {
+	s                 *Service
+	enterpriseId      string
+	enterpriseaccount *EnterpriseAccount
+	opt_              map[string]interface{}
+}
+
+// SetAccount: Set the account that will be used to authenticate to the
+// API as the enterprise.
+func (r *EnterprisesService) SetAccount(enterpriseId string, enterpriseaccount *EnterpriseAccount) *EnterprisesSetAccountCall {
+	c := &EnterprisesSetAccountCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.enterpriseaccount = enterpriseaccount
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EnterprisesSetAccountCall) Fields(s ...googleapi.Field) *EnterprisesSetAccountCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EnterprisesSetAccountCall) Do() (*EnterpriseAccount, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.enterpriseaccount)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/account")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *EnterpriseAccount
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Set the account that will be used to authenticate to the API as the enterprise.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidenterprise.enterprises.setAccount",
+	//   "parameterOrder": [
+	//     "enterpriseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/account",
+	//   "request": {
+	//     "$ref": "EnterpriseAccount"
+	//   },
+	//   "response": {
+	//     "$ref": "EnterpriseAccount"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.enterprises.unenroll":
+
+type EnterprisesUnenrollCall struct {
+	s            *Service
+	enterpriseId string
+	opt_         map[string]interface{}
+}
+
+// Unenroll: Unenrolls an enterprise from the calling MDM.
+func (r *EnterprisesService) Unenroll(enterpriseId string) *EnterprisesUnenrollCall {
+	c := &EnterprisesUnenrollCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EnterprisesUnenrollCall) Fields(s ...googleapi.Field) *EnterprisesUnenrollCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EnterprisesUnenrollCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/unenroll")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Unenrolls an enterprise from the calling MDM.",
+	//   "httpMethod": "POST",
+	//   "id": "androidenterprise.enterprises.unenroll",
+	//   "parameterOrder": [
+	//     "enterpriseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/unenroll",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.entitlements.delete":
+
+type EntitlementsDeleteCall struct {
+	s             *Service
+	enterpriseId  string
+	userId        string
+	entitlementId string
+	opt_          map[string]interface{}
+}
+
+// Delete: Removes an entitlement to an app for a user and uninstalls
+// it.
+func (r *EntitlementsService) Delete(enterpriseId string, userId string, entitlementId string) *EntitlementsDeleteCall {
+	c := &EntitlementsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.entitlementId = entitlementId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EntitlementsDeleteCall) Fields(s ...googleapi.Field) *EntitlementsDeleteCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EntitlementsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId":  c.enterpriseId,
+		"userId":        c.userId,
+		"entitlementId": c.entitlementId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Removes an entitlement to an app for a user and uninstalls it.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidenterprise.entitlements.delete",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "entitlementId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "entitlementId": {
+	//       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.entitlements.get":
+
+type EntitlementsGetCall struct {
+	s             *Service
+	enterpriseId  string
+	userId        string
+	entitlementId string
+	opt_          map[string]interface{}
+}
+
+// Get: Retrieves details of an entitlement.
+func (r *EntitlementsService) Get(enterpriseId string, userId string, entitlementId string) *EntitlementsGetCall {
+	c := &EntitlementsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.entitlementId = entitlementId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EntitlementsGetCall) Fields(s ...googleapi.Field) *EntitlementsGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EntitlementsGetCall) Do() (*Entitlement, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId":  c.enterpriseId,
+		"userId":        c.userId,
+		"entitlementId": c.entitlementId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Entitlement
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves details of an entitlement.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.entitlements.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "entitlementId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "entitlementId": {
+	//       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+	//   "response": {
+	//     "$ref": "Entitlement"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.entitlements.list":
+
+type EntitlementsListCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	opt_         map[string]interface{}
+}
+
+// List: List of all entitlements for the specified user. Only the ID is
+// set.
+func (r *EntitlementsService) List(enterpriseId string, userId string) *EntitlementsListCall {
+	c := &EntitlementsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EntitlementsListCall) Fields(s ...googleapi.Field) *EntitlementsListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EntitlementsListCall) Do() (*EntitlementsListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/entitlements")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *EntitlementsListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "List of all entitlements for the specified user. Only the ID is set.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.entitlements.list",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/entitlements",
+	//   "response": {
+	//     "$ref": "EntitlementsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.entitlements.patch":
+
+type EntitlementsPatchCall struct {
+	s             *Service
+	enterpriseId  string
+	userId        string
+	entitlementId string
+	entitlement   *Entitlement
+	opt_          map[string]interface{}
+}
+
+// Patch: Adds or updates an entitlement to an app for a user. This
+// method supports patch semantics.
+func (r *EntitlementsService) Patch(enterpriseId string, userId string, entitlementId string, entitlement *Entitlement) *EntitlementsPatchCall {
+	c := &EntitlementsPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.entitlementId = entitlementId
+	c.entitlement = entitlement
+	return c
+}
+
+// Install sets the optional parameter "install": Set to true to also
+// install the product on all the user's devices where possible. Failure
+// to install on one or more devices will not prevent this operation
+// from returning successfully, as long as the entitlement was
+// successfully assigned to the user.
+func (c *EntitlementsPatchCall) Install(install bool) *EntitlementsPatchCall {
+	c.opt_["install"] = install
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EntitlementsPatchCall) Fields(s ...googleapi.Field) *EntitlementsPatchCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EntitlementsPatchCall) Do() (*Entitlement, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entitlement)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["install"]; ok {
+		params.Set("install", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId":  c.enterpriseId,
+		"userId":        c.userId,
+		"entitlementId": c.entitlementId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Entitlement
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Adds or updates an entitlement to an app for a user. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidenterprise.entitlements.patch",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "entitlementId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "entitlementId": {
+	//       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "install": {
+	//       "description": "Set to true to also install the product on all the user's devices where possible. Failure to install on one or more devices will not prevent this operation from returning successfully, as long as the entitlement was successfully assigned to the user.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+	//   "request": {
+	//     "$ref": "Entitlement"
+	//   },
+	//   "response": {
+	//     "$ref": "Entitlement"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.entitlements.update":
+
+type EntitlementsUpdateCall struct {
+	s             *Service
+	enterpriseId  string
+	userId        string
+	entitlementId string
+	entitlement   *Entitlement
+	opt_          map[string]interface{}
+}
+
+// Update: Adds or updates an entitlement to an app for a user.
+func (r *EntitlementsService) Update(enterpriseId string, userId string, entitlementId string, entitlement *Entitlement) *EntitlementsUpdateCall {
+	c := &EntitlementsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.entitlementId = entitlementId
+	c.entitlement = entitlement
+	return c
+}
+
+// Install sets the optional parameter "install": Set to true to also
+// install the product on all the user's devices where possible. Failure
+// to install on one or more devices will not prevent this operation
+// from returning successfully, as long as the entitlement was
+// successfully assigned to the user.
+func (c *EntitlementsUpdateCall) Install(install bool) *EntitlementsUpdateCall {
+	c.opt_["install"] = install
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *EntitlementsUpdateCall) Fields(s ...googleapi.Field) *EntitlementsUpdateCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *EntitlementsUpdateCall) Do() (*Entitlement, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entitlement)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["install"]; ok {
+		params.Set("install", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId":  c.enterpriseId,
+		"userId":        c.userId,
+		"entitlementId": c.entitlementId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Entitlement
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Adds or updates an entitlement to an app for a user.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidenterprise.entitlements.update",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "entitlementId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "entitlementId": {
+	//       "description": "The ID of the entitlement, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "install": {
+	//       "description": "Set to true to also install the product on all the user's devices where possible. Failure to install on one or more devices will not prevent this operation from returning successfully, as long as the entitlement was successfully assigned to the user.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}",
+	//   "request": {
+	//     "$ref": "Entitlement"
+	//   },
+	//   "response": {
+	//     "$ref": "Entitlement"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.grouplicenses.get":
+
+type GrouplicensesGetCall struct {
+	s              *Service
+	enterpriseId   string
+	groupLicenseId string
+	opt_           map[string]interface{}
+}
+
+// Get: Retrieves details of an enterprise's group license for a
+// product.
+func (r *GrouplicensesService) Get(enterpriseId string, groupLicenseId string) *GrouplicensesGetCall {
+	c := &GrouplicensesGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.groupLicenseId = groupLicenseId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *GrouplicensesGetCall) Fields(s ...googleapi.Field) *GrouplicensesGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *GrouplicensesGetCall) Do() (*GroupLicense, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId":   c.enterpriseId,
+		"groupLicenseId": c.groupLicenseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *GroupLicense
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves details of an enterprise's group license for a product.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.grouplicenses.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "groupLicenseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "groupLicenseId": {
+	//       "description": "The ID of the product the group license is for, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}",
+	//   "response": {
+	//     "$ref": "GroupLicense"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.grouplicenses.list":
+
+type GrouplicensesListCall struct {
+	s            *Service
+	enterpriseId string
+	opt_         map[string]interface{}
+}
+
+// List: Retrieves IDs of all products for which the enterprise has a
+// group license.
+func (r *GrouplicensesService) List(enterpriseId string) *GrouplicensesListCall {
+	c := &GrouplicensesListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *GrouplicensesListCall) Fields(s ...googleapi.Field) *GrouplicensesListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *GrouplicensesListCall) Do() (*GroupLicensesListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/groupLicenses")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *GroupLicensesListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves IDs of all products for which the enterprise has a group license.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.grouplicenses.list",
+	//   "parameterOrder": [
+	//     "enterpriseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/groupLicenses",
+	//   "response": {
+	//     "$ref": "GroupLicensesListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.grouplicenseusers.list":
+
+type GrouplicenseusersListCall struct {
+	s              *Service
+	enterpriseId   string
+	groupLicenseId string
+	opt_           map[string]interface{}
+}
+
+// List: Retrieves the IDs of the users who have been granted
+// entitlements under the license.
+func (r *GrouplicenseusersService) List(enterpriseId string, groupLicenseId string) *GrouplicenseusersListCall {
+	c := &GrouplicenseusersListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.groupLicenseId = groupLicenseId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *GrouplicenseusersListCall) Fields(s ...googleapi.Field) *GrouplicenseusersListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *GrouplicenseusersListCall) Do() (*GroupLicenseUsersListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}/users")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId":   c.enterpriseId,
+		"groupLicenseId": c.groupLicenseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *GroupLicenseUsersListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the IDs of the users who have been granted entitlements under the license.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.grouplicenseusers.list",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "groupLicenseId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "groupLicenseId": {
+	//       "description": "The ID of the product the group license is for, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}/users",
+	//   "response": {
+	//     "$ref": "GroupLicenseUsersListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.installs.delete":
+
+type InstallsDeleteCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	installId    string
+	opt_         map[string]interface{}
+}
+
+// Delete: Requests to remove an app from a device. A call to get or
+// list will still show the app as installed on the device until it is
+// actually removed.
+func (r *InstallsService) Delete(enterpriseId string, userId string, deviceId string, installId string) *InstallsDeleteCall {
+	c := &InstallsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	c.installId = installId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InstallsDeleteCall) Fields(s ...googleapi.Field) *InstallsDeleteCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *InstallsDeleteCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+		"installId":    c.installId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Requests to remove an app from a device. A call to get or list will still show the app as installed on the device until it is actually removed.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidenterprise.installs.delete",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId",
+	//     "installId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The Android ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "installId": {
+	//       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.installs.get":
+
+type InstallsGetCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	installId    string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves details of an installation of an app on a device.
+func (r *InstallsService) Get(enterpriseId string, userId string, deviceId string, installId string) *InstallsGetCall {
+	c := &InstallsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	c.installId = installId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InstallsGetCall) Fields(s ...googleapi.Field) *InstallsGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *InstallsGetCall) Do() (*Install, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+		"installId":    c.installId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Install
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves details of an installation of an app on a device.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.installs.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId",
+	//     "installId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The Android ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "installId": {
+	//       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+	//   "response": {
+	//     "$ref": "Install"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.installs.list":
+
+type InstallsListCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	opt_         map[string]interface{}
+}
+
+// List: Retrieves the details of all apps installed on the specified
+// device.
+func (r *InstallsService) List(enterpriseId string, userId string, deviceId string) *InstallsListCall {
+	c := &InstallsListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InstallsListCall) Fields(s ...googleapi.Field) *InstallsListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *InstallsListCall) Do() (*InstallsListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *InstallsListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the details of all apps installed on the specified device.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.installs.list",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The Android ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs",
+	//   "response": {
+	//     "$ref": "InstallsListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.installs.patch":
+
+type InstallsPatchCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	installId    string
+	install      *Install
+	opt_         map[string]interface{}
+}
+
+// Patch: Requests to install the latest version of an app to a device.
+// If the app is already installed then it is updated to the latest
+// version if necessary. This method supports patch semantics.
+func (r *InstallsService) Patch(enterpriseId string, userId string, deviceId string, installId string, install *Install) *InstallsPatchCall {
+	c := &InstallsPatchCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	c.installId = installId
+	c.install = install
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InstallsPatchCall) Fields(s ...googleapi.Field) *InstallsPatchCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *InstallsPatchCall) Do() (*Install, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.install)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+		"installId":    c.installId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Install
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Requests to install the latest version of an app to a device. If the app is already installed then it is updated to the latest version if necessary. This method supports patch semantics.",
+	//   "httpMethod": "PATCH",
+	//   "id": "androidenterprise.installs.patch",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId",
+	//     "installId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The Android ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "installId": {
+	//       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+	//   "request": {
+	//     "$ref": "Install"
+	//   },
+	//   "response": {
+	//     "$ref": "Install"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.installs.update":
+
+type InstallsUpdateCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	deviceId     string
+	installId    string
+	install      *Install
+	opt_         map[string]interface{}
+}
+
+// Update: Requests to install the latest version of an app to a device.
+// If the app is already installed then it is updated to the latest
+// version if necessary.
+func (r *InstallsService) Update(enterpriseId string, userId string, deviceId string, installId string, install *Install) *InstallsUpdateCall {
+	c := &InstallsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	c.deviceId = deviceId
+	c.installId = installId
+	c.install = install
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InstallsUpdateCall) Fields(s ...googleapi.Field) *InstallsUpdateCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *InstallsUpdateCall) Do() (*Install, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.install)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+		"deviceId":     c.deviceId,
+		"installId":    c.installId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Install
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Requests to install the latest version of an app to a device. If the app is already installed then it is updated to the latest version if necessary.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidenterprise.installs.update",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId",
+	//     "deviceId",
+	//     "installId"
+	//   ],
+	//   "parameters": {
+	//     "deviceId": {
+	//       "description": "The Android ID of the device.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "installId": {
+	//       "description": "The ID of the product represented by the install, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}",
+	//   "request": {
+	//     "$ref": "Install"
+	//   },
+	//   "response": {
+	//     "$ref": "Install"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.permissions.get":
+
+type PermissionsGetCall struct {
+	s            *Service
+	permissionId string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves details of an Android app permission for display to an
+// enterprise admin.
+func (r *PermissionsService) Get(permissionId string) *PermissionsGetCall {
+	c := &PermissionsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.permissionId = permissionId
+	return c
+}
+
+// Language sets the optional parameter "language": The BCP47 tag for
+// the user's preferred language (e.g. "en-US", "de")
+func (c *PermissionsGetCall) Language(language string) *PermissionsGetCall {
+	c.opt_["language"] = language
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *PermissionsGetCall) Fields(s ...googleapi.Field) *PermissionsGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *PermissionsGetCall) Do() (*Permission, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["language"]; ok {
+		params.Set("language", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "permissions/{permissionId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"permissionId": c.permissionId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Permission
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves details of an Android app permission for display to an enterprise admin.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.permissions.get",
+	//   "parameterOrder": [
+	//     "permissionId"
+	//   ],
+	//   "parameters": {
+	//     "language": {
+	//       "description": "The BCP47 tag for the user's preferred language (e.g. \"en-US\", \"de\")",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "permissionId": {
+	//       "description": "The ID of the permission.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "permissions/{permissionId}",
+	//   "response": {
+	//     "$ref": "Permission"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.products.get":
+
+type ProductsGetCall struct {
+	s            *Service
+	enterpriseId string
+	productId    string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves details of a product for display to an enterprise
+// admin.
+func (r *ProductsService) Get(enterpriseId string, productId string) *ProductsGetCall {
+	c := &ProductsGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.productId = productId
+	return c
+}
+
+// Language sets the optional parameter "language": The BCP47 tag for
+// the user's preferred language (e.g. "en-US", "de").
+func (c *ProductsGetCall) Language(language string) *ProductsGetCall {
+	c.opt_["language"] = language
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProductsGetCall) Fields(s ...googleapi.Field) *ProductsGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *ProductsGetCall) Do() (*Product, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["language"]; ok {
+		params.Set("language", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/products/{productId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"productId":    c.productId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Product
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves details of a product for display to an enterprise admin.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.products.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "productId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The BCP47 tag for the user's preferred language (e.g. \"en-US\", \"de\").",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "productId": {
+	//       "description": "The ID of the product, e.g. \"app:com.google.android.gm\".",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/products/{productId}",
+	//   "response": {
+	//     "$ref": "Product"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.products.getAppRestrictionsSchema":
+
+type ProductsGetAppRestrictionsSchemaCall struct {
+	s            *Service
+	enterpriseId string
+	productId    string
+	opt_         map[string]interface{}
+}
+
+// GetAppRestrictionsSchema: Retrieves the schema defining app
+// restrictions configurable for this product. All products have a
+// schema, but this may be empty if no app restrictions are defined.
+func (r *ProductsService) GetAppRestrictionsSchema(enterpriseId string, productId string) *ProductsGetAppRestrictionsSchemaCall {
+	c := &ProductsGetAppRestrictionsSchemaCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.productId = productId
+	return c
+}
+
+// Language sets the optional parameter "language": The BCP47 tag for
+// the user's preferred language (e.g. "en-US", "de").
+func (c *ProductsGetAppRestrictionsSchemaCall) Language(language string) *ProductsGetAppRestrictionsSchemaCall {
+	c.opt_["language"] = language
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProductsGetAppRestrictionsSchemaCall) Fields(s ...googleapi.Field) *ProductsGetAppRestrictionsSchemaCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *ProductsGetAppRestrictionsSchemaCall) Do() (*AppRestrictionsSchema, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["language"]; ok {
+		params.Set("language", fmt.Sprintf("%v", v))
+	}
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/products/{productId}/appRestrictionsSchema")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"productId":    c.productId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *AppRestrictionsSchema
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the schema defining app restrictions configurable for this product. All products have a schema, but this may be empty if no app restrictions are defined.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.products.getAppRestrictionsSchema",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "productId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "language": {
+	//       "description": "The BCP47 tag for the user's preferred language (e.g. \"en-US\", \"de\").",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "productId": {
+	//       "description": "The ID of the product.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/products/{productId}/appRestrictionsSchema",
+	//   "response": {
+	//     "$ref": "AppRestrictionsSchema"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.products.getPermissions":
+
+type ProductsGetPermissionsCall struct {
+	s            *Service
+	enterpriseId string
+	productId    string
+	opt_         map[string]interface{}
+}
+
+// GetPermissions: Retrieves the Android app permissions required by
+// this app.
+func (r *ProductsService) GetPermissions(enterpriseId string, productId string) *ProductsGetPermissionsCall {
+	c := &ProductsGetPermissionsCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.productId = productId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProductsGetPermissionsCall) Fields(s ...googleapi.Field) *ProductsGetPermissionsCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *ProductsGetPermissionsCall) Do() (*ProductPermissions, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/products/{productId}/permissions")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"productId":    c.productId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *ProductPermissions
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves the Android app permissions required by this app.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.products.getPermissions",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "productId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "productId": {
+	//       "description": "The ID of the product.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/products/{productId}/permissions",
+	//   "response": {
+	//     "$ref": "ProductPermissions"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.products.updatePermissions":
+
+type ProductsUpdatePermissionsCall struct {
+	s                  *Service
+	enterpriseId       string
+	productId          string
+	productpermissions *ProductPermissions
+	opt_               map[string]interface{}
+}
+
+// UpdatePermissions: Updates the set of Android app permissions for
+// this app that have been accepted by the enterprise.
+func (r *ProductsService) UpdatePermissions(enterpriseId string, productId string, productpermissions *ProductPermissions) *ProductsUpdatePermissionsCall {
+	c := &ProductsUpdatePermissionsCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.productId = productId
+	c.productpermissions = productpermissions
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProductsUpdatePermissionsCall) Fields(s ...googleapi.Field) *ProductsUpdatePermissionsCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *ProductsUpdatePermissionsCall) Do() (*ProductPermissions, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.productpermissions)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/products/{productId}/permissions")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("PUT", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"productId":    c.productId,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *ProductPermissions
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates the set of Android app permissions for this app that have been accepted by the enterprise.",
+	//   "httpMethod": "PUT",
+	//   "id": "androidenterprise.products.updatePermissions",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "productId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "productId": {
+	//       "description": "The ID of the product.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/products/{productId}/permissions",
+	//   "request": {
+	//     "$ref": "ProductPermissions"
+	//   },
+	//   "response": {
+	//     "$ref": "ProductPermissions"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.users.generateToken":
+
+type UsersGenerateTokenCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	opt_         map[string]interface{}
+}
+
+// GenerateToken: Generates a token (activation code) to allow this user
+// to configure their work account in the Android Setup Wizard. Revokes
+// any previously generated token.
+func (r *UsersService) GenerateToken(enterpriseId string, userId string) *UsersGenerateTokenCall {
+	c := &UsersGenerateTokenCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersGenerateTokenCall) Fields(s ...googleapi.Field) *UsersGenerateTokenCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *UsersGenerateTokenCall) Do() (*UserToken, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/token")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *UserToken
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Generates a token (activation code) to allow this user to configure their work account in the Android Setup Wizard. Revokes any previously generated token.",
+	//   "httpMethod": "POST",
+	//   "id": "androidenterprise.users.generateToken",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/token",
+	//   "response": {
+	//     "$ref": "UserToken"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.users.get":
+
+type UsersGetCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	opt_         map[string]interface{}
+}
+
+// Get: Retrieves a user's details.
+func (r *UsersService) Get(enterpriseId string, userId string) *UsersGetCall {
+	c := &UsersGetCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersGetCall) Fields(s ...googleapi.Field) *UsersGetCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *UsersGetCall) Do() (*User, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *User
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a user's details.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.users.get",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}",
+	//   "response": {
+	//     "$ref": "User"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.users.list":
+
+type UsersListCall struct {
+	s            *Service
+	enterpriseId string
+	email        string
+	opt_         map[string]interface{}
+}
+
+// List: Looks up a user by email address.
+func (r *UsersService) List(enterpriseId string, email string) *UsersListCall {
+	c := &UsersListCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.email = email
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersListCall) Fields(s ...googleapi.Field) *UsersListCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *UsersListCall) Do() (*UsersListResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	params.Set("email", fmt.Sprintf("%v", c.email))
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *UsersListResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Looks up a user by email address.",
+	//   "httpMethod": "GET",
+	//   "id": "androidenterprise.users.list",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "email"
+	//   ],
+	//   "parameters": {
+	//     "email": {
+	//       "description": "The exact primary email address of the user to look up.",
+	//       "location": "query",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users",
+	//   "response": {
+	//     "$ref": "UsersListResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
+
+// method id "androidenterprise.users.revokeToken":
+
+type UsersRevokeTokenCall struct {
+	s            *Service
+	enterpriseId string
+	userId       string
+	opt_         map[string]interface{}
+}
+
+// RevokeToken: Revokes a previously generated token (activation code)
+// for the user.
+func (r *UsersService) RevokeToken(enterpriseId string, userId string) *UsersRevokeTokenCall {
+	c := &UsersRevokeTokenCall{s: r.s, opt_: make(map[string]interface{})}
+	c.enterpriseId = enterpriseId
+	c.userId = userId
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersRevokeTokenCall) Fields(s ...googleapi.Field) *UsersRevokeTokenCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *UsersRevokeTokenCall) Do() error {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/token")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"enterpriseId": c.enterpriseId,
+		"userId":       c.userId,
+	})
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Revokes a previously generated token (activation code) for the user.",
+	//   "httpMethod": "DELETE",
+	//   "id": "androidenterprise.users.revokeToken",
+	//   "parameterOrder": [
+	//     "enterpriseId",
+	//     "userId"
+	//   ],
+	//   "parameters": {
+	//     "enterpriseId": {
+	//       "description": "The ID of the enterprise.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "description": "The ID of the user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "enterprises/{enterpriseId}/users/{userId}/token",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/androidenterprise"
+	//   ]
+	// }
+
+}
diff --git a/androidpublisher/v1.1/androidpublisher-gen.go b/androidpublisher/v1.1/androidpublisher-gen.go
index 2ddcec8..99a55cf 100644
--- a/androidpublisher/v1.1/androidpublisher-gen.go
+++ b/androidpublisher/v1.1/androidpublisher-gen.go
@@ -58,14 +58,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Inapppurchases *InapppurchasesService
 
 	Purchases *PurchasesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewInapppurchasesService(s *Service) *InapppurchasesService {
 	rs := &InapppurchasesService{s: s}
 	return rs
@@ -170,7 +178,7 @@
 		"productId":   c.productId,
 		"token":       c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -267,7 +275,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -357,7 +365,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/androidpublisher/v1/androidpublisher-gen.go b/androidpublisher/v1/androidpublisher-gen.go
index b25d601..b75ba95 100644
--- a/androidpublisher/v1/androidpublisher-gen.go
+++ b/androidpublisher/v1/androidpublisher-gen.go
@@ -57,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Purchases *PurchasesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewPurchasesService(s *Service) *PurchasesService {
 	rs := &PurchasesService{s: s}
 	return rs
@@ -133,7 +141,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -223,7 +231,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/androidpublisher/v2/androidpublisher-gen.go b/androidpublisher/v2/androidpublisher-gen.go
index 05ae9fd..7604bae 100644
--- a/androidpublisher/v2/androidpublisher-gen.go
+++ b/androidpublisher/v2/androidpublisher-gen.go
@@ -59,8 +59,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Edits *EditsService
 
@@ -69,6 +70,13 @@
 	Purchases *PurchasesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewEditsService(s *Service) *EditsService {
 	rs := &EditsService{s: s}
 	rs.Apklistings = NewEditsApklistingsService(s)
@@ -700,7 +708,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -788,7 +796,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -869,7 +877,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -961,7 +969,7 @@
 		"packageName": c.packageNameid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1044,7 +1052,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1137,7 +1145,7 @@
 		"apkVersionCode": strconv.FormatInt(c.apkVersionCode, 10),
 		"language":       c.language,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1235,7 +1243,7 @@
 		"editId":         c.editId,
 		"apkVersionCode": strconv.FormatInt(c.apkVersionCode, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1329,7 +1337,7 @@
 		"apkVersionCode": strconv.FormatInt(c.apkVersionCode, 10),
 		"language":       c.language,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1434,7 +1442,7 @@
 		"editId":         c.editId,
 		"apkVersionCode": strconv.FormatInt(c.apkVersionCode, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1544,7 +1552,7 @@
 		"language":       c.language,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1663,7 +1671,7 @@
 		"language":       c.language,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1779,7 +1787,7 @@
 		"editId":      c.editId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1868,7 +1876,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2015,7 +2023,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2028,6 +2036,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2135,7 +2144,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2230,7 +2239,7 @@
 		"editId":      c.editId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2327,7 +2336,7 @@
 		"editId":      c.editId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2422,7 +2431,7 @@
 		"apkVersionCode":    strconv.FormatInt(c.apkVersionCode, 10),
 		"expansionFileType": c.expansionFileType,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2546,7 +2555,7 @@
 		"expansionFileType": c.expansionFileType,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2673,7 +2682,7 @@
 		"expansionFileType": c.expansionFileType,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2853,7 +2862,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2866,6 +2875,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -3003,7 +3013,7 @@
 		"imageType":   c.imageType,
 		"imageId":     c.imageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3129,7 +3139,7 @@
 		"language":    c.language,
 		"imageType":   c.imageType,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3254,7 +3264,7 @@
 		"language":    c.language,
 		"imageType":   c.imageType,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3442,7 +3452,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3455,6 +3465,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -3597,7 +3608,7 @@
 		"editId":      c.editId,
 		"language":    c.language,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3683,7 +3694,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3765,7 +3776,7 @@
 		"editId":      c.editId,
 		"language":    c.language,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3859,7 +3870,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3957,7 +3968,7 @@
 		"language":    c.language,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4064,7 +4075,7 @@
 		"language":    c.language,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4163,7 +4174,7 @@
 		"editId":      c.editId,
 		"track":       c.track,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4277,7 +4288,7 @@
 		"track":       c.track,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4394,7 +4405,7 @@
 		"track":       c.track,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4504,7 +4515,7 @@
 		"editId":      c.editId,
 		"track":       c.track,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4609,7 +4620,7 @@
 		"packageName": c.packageNameid,
 		"editId":      c.editId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4709,7 +4720,7 @@
 		"track":       c.track,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4830,7 +4841,7 @@
 		"track":       c.track,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4939,7 +4950,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5009,7 +5020,7 @@
 		"packageName": c.packageNameid,
 		"sku":         c.skuid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5088,7 +5099,7 @@
 		"packageName": c.packageName,
 		"sku":         c.skuid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5191,7 +5202,7 @@
 		"packageName": c.packageNameid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5303,7 +5314,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"packageName": c.packageNameid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5418,7 +5429,7 @@
 		"sku":         c.skuid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5533,7 +5544,7 @@
 		"sku":         c.skuid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5630,7 +5641,7 @@
 		"productId":   c.productId,
 		"token":       c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5727,7 +5738,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5825,7 +5836,7 @@
 		"token":          c.token,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5925,7 +5936,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6023,7 +6034,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6114,7 +6125,7 @@
 		"subscriptionId": c.subscriptionId,
 		"token":          c.token,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/appsactivity/v1/appsactivity-gen.go b/appsactivity/v1/appsactivity-gen.go
index 6511b97..883bae8 100644
--- a/appsactivity/v1/appsactivity-gen.go
+++ b/appsactivity/v1/appsactivity-gen.go
@@ -66,12 +66,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Activities *ActivitiesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -333,7 +341,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/appstate/v1/appstate-gen.go b/appstate/v1/appstate-gen.go
index bc8fb22..17d7e7c 100644
--- a/appstate/v1/appstate-gen.go
+++ b/appstate/v1/appstate-gen.go
@@ -57,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	States *StatesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewStatesService(s *Service) *StatesService {
 	rs := &StatesService{s: s}
 	return rs
@@ -171,7 +179,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"stateKey": strconv.FormatInt(c.stateKey, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -260,7 +268,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"stateKey": strconv.FormatInt(c.stateKey, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -333,7 +341,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"stateKey": strconv.FormatInt(c.stateKey, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -418,7 +426,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -516,7 +524,7 @@
 		"stateKey": strconv.FormatInt(c.stateKey, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/audit/v1/audit-gen.go b/audit/v1/audit-gen.go
index 0be8538..9914a23 100644
--- a/audit/v1/audit-gen.go
+++ b/audit/v1/audit-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Activities *ActivitiesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -277,7 +285,7 @@
 		"customerId":    c.customerId,
 		"applicationId": strconv.FormatInt(c.applicationId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/autoscaler/v1beta2/autoscaler-gen.go b/autoscaler/v1beta2/autoscaler-gen.go
index 4886bc8..9ed5cd0 100644
--- a/autoscaler/v1beta2/autoscaler-gen.go
+++ b/autoscaler/v1beta2/autoscaler-gen.go
@@ -62,8 +62,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Autoscalers *AutoscalersService
 
@@ -72,6 +73,13 @@
 	Zones *ZonesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAutoscalersService(s *Service) *AutoscalersService {
 	rs := &AutoscalersService{s: s}
 	return rs
@@ -402,7 +410,7 @@
 		"zone":       c.zone,
 		"autoscaler": c.autoscaler,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -498,7 +506,7 @@
 		"zone":       c.zone,
 		"autoscaler": c.autoscaler,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -600,7 +608,7 @@
 		"zone":    c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -716,7 +724,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -831,7 +839,7 @@
 		"autoscaler": c.autoscaler,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -938,7 +946,7 @@
 		"autoscaler": c.autoscaler,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1037,7 +1045,7 @@
 		"zone":      c.zone,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1126,7 +1134,7 @@
 		"zone":      c.zone,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1248,7 +1256,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1375,7 +1383,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/bigquery/v2/bigquery-api.json b/bigquery/v2/bigquery-api.json
index 7d3ae41..d32c8a1 100644
--- a/bigquery/v2/bigquery-api.json
+++ b/bigquery/v2/bigquery-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/obZ6DzO3dJZ3dBfZd8bmlNVgqVs\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/QxG7oirHrzfDxJoQseQwOqPzaG0\"",
  "discoveryVersion": "v1",
  "id": "bigquery:v2",
  "name": "bigquery",
  "version": "v2",
- "revision": "20150209",
+ "revision": "20141112",
  "title": "BigQuery API",
  "description": "A data platform for customers to create, manage, share and query data.",
  "ownerDomain": "google.com",
@@ -1071,6 +1071,10 @@
    "id": "TableDataInsertAllRequest",
    "type": "object",
    "properties": {
+    "ignoreUnknownValues": {
+     "type": "boolean",
+     "description": "[Optional] Accept rows that contain values that do not match the schema. The unknown values are ignored. Default is false, which treats unknown values as errors."
+    },
     "kind": {
      "type": "string",
      "description": "The resource type of the response.",
@@ -1092,6 +1096,10 @@
        }
       }
      }
+    },
+    "skipInvalidRows": {
+     "type": "boolean",
+     "description": "[Optional] Insert all valid rows of a request, even if invalid rows exist. The default value is false, which causes the entire request to fail if any invalid rows exist."
     }
    }
   },
diff --git a/bigquery/v2/bigquery-gen.go b/bigquery/v2/bigquery-gen.go
index ab7dcc9..fc43002 100644
--- a/bigquery/v2/bigquery-gen.go
+++ b/bigquery/v2/bigquery-gen.go
@@ -76,8 +76,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Datasets *DatasetsService
 
@@ -90,6 +91,13 @@
 	Tables *TablesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDatasetsService(s *Service) *DatasetsService {
 	rs := &DatasetsService{s: s}
 	return rs
@@ -984,11 +992,21 @@
 }
 
 type TableDataInsertAllRequest struct {
+	// IgnoreUnknownValues: [Optional] Accept rows that contain values that
+	// do not match the schema. The unknown values are ignored. Default is
+	// false, which treats unknown values as errors.
+	IgnoreUnknownValues bool `json:"ignoreUnknownValues,omitempty"`
+
 	// Kind: The resource type of the response.
 	Kind string `json:"kind,omitempty"`
 
 	// Rows: The rows to insert.
 	Rows []*TableDataInsertAllRequestRows `json:"rows,omitempty"`
+
+	// SkipInvalidRows: [Optional] Insert all valid rows of a request, even
+	// if invalid rows exist. The default value is false, which causes the
+	// entire request to fail if any invalid rows exist.
+	SkipInvalidRows bool `json:"skipInvalidRows,omitempty"`
 }
 
 type TableDataInsertAllRequestRows struct {
@@ -1178,7 +1196,7 @@
 		"projectId": c.projectId,
 		"datasetId": c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1263,7 +1281,7 @@
 		"projectId": c.projectId,
 		"datasetId": c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1355,7 +1373,7 @@
 		"projectId": c.projectId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1467,7 +1485,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1574,7 +1592,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1674,7 +1692,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1764,7 +1782,7 @@
 		"projectId": c.projectId,
 		"jobId":     c.jobId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1893,7 +1911,7 @@
 		"projectId": c.projectId,
 		"jobId":     c.jobId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2067,7 +2085,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2080,6 +2098,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2235,7 +2254,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2366,7 +2385,7 @@
 		"projectId": c.projectId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2462,7 +2481,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2556,7 +2575,7 @@
 		"tableId":   c.tableId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2687,7 +2706,7 @@
 		"datasetId": c.datasetId,
 		"tableId":   c.tableId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2802,7 +2821,7 @@
 		"datasetId": c.datasetId,
 		"tableId":   c.tableId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2894,7 +2913,7 @@
 		"datasetId": c.datasetId,
 		"tableId":   c.tableId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2996,7 +3015,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3106,7 +3125,7 @@
 		"projectId": c.projectId,
 		"datasetId": c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3218,7 +3237,7 @@
 		"tableId":   c.tableId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3328,7 +3347,7 @@
 		"tableId":   c.tableId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/blogger/v2/blogger-gen.go b/blogger/v2/blogger-gen.go
index f76c085..dde8ecb 100644
--- a/blogger/v2/blogger-gen.go
+++ b/blogger/v2/blogger-gen.go
@@ -61,8 +61,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Blogs *BlogsService
 
@@ -75,6 +76,13 @@
 	Users *UsersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBlogsService(s *Service) *BlogsService {
 	rs := &BlogsService{s: s}
 	return rs
@@ -519,7 +527,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -601,7 +609,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -734,7 +742,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -842,7 +850,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -935,7 +943,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1019,7 +1027,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1142,7 +1150,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1240,7 +1248,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1316,7 +1324,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/blogger/v3/blogger-gen.go b/blogger/v3/blogger-gen.go
index 079ff67..8c872cc 100644
--- a/blogger/v3/blogger-gen.go
+++ b/blogger/v3/blogger-gen.go
@@ -67,8 +67,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BlogUserInfos *BlogUserInfosService
 
@@ -87,6 +88,13 @@
 	Users *UsersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBlogUserInfosService(s *Service) *BlogUserInfosService {
 	rs := &BlogUserInfosService{s: s}
 	return rs
@@ -718,7 +726,7 @@
 		"userId": c.userId,
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -828,7 +836,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -935,7 +943,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1071,7 +1079,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1205,7 +1213,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1301,7 +1309,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1403,7 +1411,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1582,7 +1590,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1786,7 +1794,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1914,7 +1922,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2010,7 +2018,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2109,7 +2117,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2203,7 +2211,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2291,7 +2299,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2407,7 +2415,7 @@
 		"blogId": c.blogId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2542,7 +2550,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2694,7 +2702,7 @@
 		"pageId": c.pageId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2793,7 +2801,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2879,7 +2887,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2993,7 +3001,7 @@
 		"pageId": c.pageId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3107,7 +3115,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3299,7 +3307,7 @@
 		"userId": c.userId,
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3464,7 +3472,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3586,7 +3594,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3726,7 +3734,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3870,7 +3878,7 @@
 		"blogId": c.blogId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4067,7 +4075,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4290,7 +4298,7 @@
 		"postId": c.postId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4420,7 +4428,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4512,7 +4520,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4619,7 +4627,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4785,7 +4793,7 @@
 		"postId": c.postId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4898,7 +4906,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/books/v1/books-api.json b/books/v1/books-api.json
index 8f105fc..3ccd501 100644
--- a/books/v1/books-api.json
+++ b/books/v1/books-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/kNB4QIeM_hYb1gDtvlVUUPro4uQ\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/7vCHfrhi9Lj_cY5xxg_5Db6xPtw\"",
  "discoveryVersion": "v1",
  "id": "books:v1",
  "name": "books",
  "version": "v1",
- "revision": "20150115",
+ "revision": "20150309",
  "title": "Books API",
  "description": "Lets you search for books and manage your Google Books library.",
  "ownerDomain": "google.com",
@@ -2817,34 +2817,6 @@
         "https://www.googleapis.com/auth/books"
        ]
       },
-      "get": {
-       "id": "books.mylibrary.annotations.get",
-       "path": "mylibrary/annotations/{annotationId}",
-       "httpMethod": "GET",
-       "description": "Gets an annotation by its ID.",
-       "parameters": {
-        "annotationId": {
-         "type": "string",
-         "description": "The ID for the annotation to retrieve.",
-         "required": true,
-         "location": "path"
-        },
-        "source": {
-         "type": "string",
-         "description": "String to identify the originator of this request.",
-         "location": "query"
-        }
-       },
-       "parameterOrder": [
-        "annotationId"
-       ],
-       "response": {
-        "$ref": "Annotation"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/books"
-       ]
-      },
       "insert": {
        "id": "books.mylibrary.annotations.insert",
        "path": "mylibrary/annotations",
@@ -2907,12 +2879,6 @@
          "maximum": "40",
          "location": "query"
         },
-        "pageIds": {
-         "type": "string",
-         "description": "The page ID(s) for the volume that is being queried.",
-         "repeated": true,
-         "location": "query"
-        },
         "pageToken": {
          "type": "string",
          "description": "The value of the nextToken from the previous page.",
diff --git a/books/v1/books-gen.go b/books/v1/books-gen.go
index 343b45f..3f0dac4 100644
--- a/books/v1/books-gen.go
+++ b/books/v1/books-gen.go
@@ -65,8 +65,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Bookshelves *BookshelvesService
 
@@ -87,6 +88,13 @@
 	Volumes *VolumesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBookshelvesService(s *Service) *BookshelvesService {
 	rs := &BookshelvesService{s: s}
 	rs.Volumes = NewBookshelvesVolumesService(s)
@@ -1689,7 +1697,7 @@
 		"userId": c.userId,
 		"shelf":  c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1787,7 +1795,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1912,7 +1920,7 @@
 		"userId": c.userId,
 		"shelf":  c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2055,7 +2063,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2140,7 +2148,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2213,7 +2221,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2281,7 +2289,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2380,7 +2388,7 @@
 		"volumeId":  c.volumeId,
 		"summaryId": c.summaryId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2513,7 +2521,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"volumeId": c.volumeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2683,7 +2691,7 @@
 		"layerId":          c.layerId,
 		"annotationDataId": c.annotationDataId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2924,7 +2932,7 @@
 		"volumeId": c.volumeId,
 		"layerId":  c.layerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3099,7 +3107,7 @@
 		"layerId":      c.layerId,
 		"annotationId": c.annotationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3330,7 +3338,7 @@
 		"volumeId": c.volumeId,
 		"layerId":  c.layerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3479,7 +3487,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3568,7 +3576,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3690,7 +3698,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3853,7 +3861,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3976,7 +3984,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4054,7 +4062,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"annotationId": c.annotationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4092,97 +4100,6 @@
 
 }
 
-// method id "books.mylibrary.annotations.get":
-
-type MylibraryAnnotationsGetCall struct {
-	s            *Service
-	annotationId string
-	opt_         map[string]interface{}
-}
-
-// Get: Gets an annotation by its ID.
-func (r *MylibraryAnnotationsService) Get(annotationId string) *MylibraryAnnotationsGetCall {
-	c := &MylibraryAnnotationsGetCall{s: r.s, opt_: make(map[string]interface{})}
-	c.annotationId = annotationId
-	return c
-}
-
-// Source sets the optional parameter "source": String to identify the
-// originator of this request.
-func (c *MylibraryAnnotationsGetCall) Source(source string) *MylibraryAnnotationsGetCall {
-	c.opt_["source"] = source
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *MylibraryAnnotationsGetCall) Fields(s ...googleapi.Field) *MylibraryAnnotationsGetCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *MylibraryAnnotationsGetCall) Do() (*Annotation, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["source"]; ok {
-		params.Set("source", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/annotations/{annotationId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"annotationId": c.annotationId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Annotation
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets an annotation by its ID.",
-	//   "httpMethod": "GET",
-	//   "id": "books.mylibrary.annotations.get",
-	//   "parameterOrder": [
-	//     "annotationId"
-	//   ],
-	//   "parameters": {
-	//     "annotationId": {
-	//       "description": "The ID for the annotation to retrieve.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "source": {
-	//       "description": "String to identify the originator of this request.",
-	//       "location": "query",
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "mylibrary/annotations/{annotationId}",
-	//   "response": {
-	//     "$ref": "Annotation"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/books"
-	//   ]
-	// }
-
-}
-
 // method id "books.mylibrary.annotations.insert":
 
 type MylibraryAnnotationsInsertCall struct {
@@ -4254,7 +4171,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4344,13 +4261,6 @@
 	return c
 }
 
-// PageIds sets the optional parameter "pageIds": The page ID(s) for the
-// volume that is being queried.
-func (c *MylibraryAnnotationsListCall) PageIds(pageIds string) *MylibraryAnnotationsListCall {
-	c.opt_["pageIds"] = pageIds
-	return c
-}
-
 // PageToken sets the optional parameter "pageToken": The value of the
 // nextToken from the previous page.
 func (c *MylibraryAnnotationsListCall) PageToken(pageToken string) *MylibraryAnnotationsListCall {
@@ -4420,9 +4330,6 @@
 	if v, ok := c.opt_["maxResults"]; ok {
 		params.Set("maxResults", fmt.Sprintf("%v", v))
 	}
-	if v, ok := c.opt_["pageIds"]; ok {
-		params.Set("pageIds", fmt.Sprintf("%v", v))
-	}
 	if v, ok := c.opt_["pageToken"]; ok {
 		params.Set("pageToken", fmt.Sprintf("%v", v))
 	}
@@ -4448,7 +4355,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4491,12 +4398,6 @@
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
-	//     "pageIds": {
-	//       "description": "The page ID(s) for the volume that is being queried.",
-	//       "location": "query",
-	//       "repeated": true,
-	//       "type": "string"
-	//     },
 	//     "pageToken": {
 	//       "description": "The value of the nextToken from the previous page.",
 	//       "location": "query",
@@ -4579,7 +4480,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4681,7 +4582,7 @@
 		"annotationId": c.annotationId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4788,7 +4689,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"shelf": c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4894,7 +4795,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"shelf": c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4979,7 +4880,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"shelf": c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5067,7 +4968,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5155,7 +5056,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"shelf": c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5267,7 +5168,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"shelf": c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5429,7 +5330,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"shelf": c.shelf,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5572,7 +5473,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"volumeId": c.volumeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5704,7 +5605,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"volumeId": c.volumeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5829,7 +5730,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5938,7 +5839,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6097,7 +5998,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6256,7 +6157,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6402,7 +6303,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6549,7 +6450,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"volumeId": c.volumeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6774,7 +6675,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7000,7 +6901,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"volumeId": c.volumeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7159,7 +7060,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7308,7 +7209,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7408,7 +7309,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7567,7 +7468,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/calendar/v3/calendar-api.json b/calendar/v3/calendar-api.json
index ffdc467..3eb6f35 100644
--- a/calendar/v3/calendar-api.json
+++ b/calendar/v3/calendar-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/IMFldb9KK1xhvvmWpAqvvLL8wN4\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/0tpC9BbaQPK_TZmlZK5cHsIr_JY\"",
  "discoveryVersion": "v1",
  "id": "calendar:v3",
  "name": "calendar",
  "version": "v3",
- "revision": "20141214",
+ "revision": "20150303",
  "title": "Calendar API",
  "description": "Lets you manipulate events and other calendar data.",
  "ownerDomain": "google.com",
@@ -1658,7 +1658,7 @@
      "id": "calendar.calendars.clear",
      "path": "calendars/{calendarId}/clear",
      "httpMethod": "POST",
-     "description": "Clears a primary calendar. This operation deletes all data associated with the primary calendar of an account and cannot be undone.",
+     "description": "Clears a primary calendar. This operation deletes all events associated with the primary calendar of an account.",
      "parameters": {
       "calendarId": {
        "type": "string",
@@ -1678,7 +1678,7 @@
      "id": "calendar.calendars.delete",
      "path": "calendars/{calendarId}",
      "httpMethod": "DELETE",
-     "description": "Deletes a secondary calendar.",
+     "description": "Deletes a secondary calendar. Use calendars.clear for clearing all events on primary calendars.",
      "parameters": {
       "calendarId": {
        "type": "string",
diff --git a/calendar/v3/calendar-gen.go b/calendar/v3/calendar-gen.go
index 5da8f35..0aaae2e 100644
--- a/calendar/v3/calendar-gen.go
+++ b/calendar/v3/calendar-gen.go
@@ -67,8 +67,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Acl *AclService
 
@@ -87,6 +88,13 @@
 	Settings *SettingsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAclService(s *Service) *AclService {
 	rs := &AclService{s: s}
 	return rs
@@ -1034,7 +1042,7 @@
 		"calendarId": c.calendarId,
 		"ruleId":     c.ruleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1113,7 +1121,7 @@
 		"calendarId": c.calendarId,
 		"ruleId":     c.ruleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1205,7 +1213,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1338,7 +1346,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1449,7 +1457,7 @@
 		"ruleId":     c.ruleId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1546,7 +1554,7 @@
 		"ruleId":     c.ruleId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1694,7 +1702,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1797,7 +1805,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1866,7 +1874,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1960,7 +1968,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2110,7 +2118,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2245,7 +2253,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2350,7 +2358,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2517,7 +2525,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2606,9 +2614,8 @@
 	opt_       map[string]interface{}
 }
 
-// Clear: Clears a primary calendar. This operation deletes all data
-// associated with the primary calendar of an account and cannot be
-// undone.
+// Clear: Clears a primary calendar. This operation deletes all events
+// associated with the primary calendar of an account.
 func (r *CalendarsService) Clear(calendarId string) *CalendarsClearCall {
 	c := &CalendarsClearCall{s: r.s, opt_: make(map[string]interface{})}
 	c.calendarId = calendarId
@@ -2636,7 +2643,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2647,7 +2654,7 @@
 	}
 	return nil
 	// {
-	//   "description": "Clears a primary calendar. This operation deletes all data associated with the primary calendar of an account and cannot be undone.",
+	//   "description": "Clears a primary calendar. This operation deletes all events associated with the primary calendar of an account.",
 	//   "httpMethod": "POST",
 	//   "id": "calendar.calendars.clear",
 	//   "parameterOrder": [
@@ -2677,7 +2684,8 @@
 	opt_       map[string]interface{}
 }
 
-// Delete: Deletes a secondary calendar.
+// Delete: Deletes a secondary calendar. Use calendars.clear for
+// clearing all events on primary calendars.
 func (r *CalendarsService) Delete(calendarId string) *CalendarsDeleteCall {
 	c := &CalendarsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
 	c.calendarId = calendarId
@@ -2705,7 +2713,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2716,7 +2724,7 @@
 	}
 	return nil
 	// {
-	//   "description": "Deletes a secondary calendar.",
+	//   "description": "Deletes a secondary calendar. Use calendars.clear for clearing all events on primary calendars.",
 	//   "httpMethod": "DELETE",
 	//   "id": "calendar.calendars.delete",
 	//   "parameterOrder": [
@@ -2774,7 +2782,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2855,7 +2863,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2932,7 +2940,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3019,7 +3027,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3102,7 +3110,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3161,7 +3169,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3241,7 +3249,7 @@
 		"calendarId": c.calendarId,
 		"eventId":    c.eventId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3362,7 +3370,7 @@
 		"calendarId": c.calendarId,
 		"eventId":    c.eventId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3472,7 +3480,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3582,7 +3590,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3778,7 +3786,7 @@
 		"calendarId": c.calendarId,
 		"eventId":    c.eventId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4138,7 +4146,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4336,7 +4344,7 @@
 		"calendarId": c.calendarId,
 		"eventId":    c.eventId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4480,7 +4488,7 @@
 		"eventId":    c.eventId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4597,7 +4605,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"calendarId": c.calendarId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4734,7 +4742,7 @@
 		"eventId":    c.eventId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5069,7 +5077,7 @@
 		"calendarId": c.calendarId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5257,7 +5265,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5326,7 +5334,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"setting": c.setting,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5439,7 +5447,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5569,7 +5577,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/civicinfo/us_v1/civicinfo-api.json b/civicinfo/us_v1/civicinfo-api.json
deleted file mode 100644
index 9445058..0000000
--- a/civicinfo/us_v1/civicinfo-api.json
+++ /dev/null
@@ -1,874 +0,0 @@
-{
- "kind": "discovery#restDescription",
- "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ixlTlCZ6lprJQCHG1SmuBjDXiaM\"",
- "discoveryVersion": "v1",
- "id": "civicinfo:us_v1",
- "name": "civicinfo",
- "canonicalName": "Civic Info",
- "version": "us_v1",
- "revision": "20141023",
- "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"
- },
- "documentationLink": "https://developers.google.com/civic-information",
- "protocol": "rest",
- "baseUrl": "https://www.googleapis.com/civicinfo/us_v1/",
- "basePath": "/civicinfo/us_v1/",
- "rootUrl": "https://www.googleapis.com/",
- "servicePath": "civicinfo/us_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"
-  }
- },
- "schemas": {
-  "AdministrationRegion": {
-   "id": "AdministrationRegion",
-   "type": "object",
-   "description": "Describes information about a regional election administrative area.",
-   "properties": {
-    "electionAdministrationBody": {
-     "$ref": "AdministrativeBody",
-     "description": "The election administration body for this area."
-    },
-    "id": {
-     "type": "string",
-     "description": "An ID for this object. IDs may change in future requests and should not be cached. Access to this field requires special access that can be requested from the Request more link on the Quotas page."
-    },
-    "local_jurisdiction": {
-     "$ref": "AdministrationRegion",
-     "description": "The city or county that provides election information for this voter. This object can have the same elements as state."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the jurisdiction."
-    },
-    "sources": {
-     "type": "array",
-     "description": "A list of sources for this area. If multiple sources are listed the data has been aggregated from those sources.",
-     "items": {
-      "$ref": "Source"
-     }
-    }
-   }
-  },
-  "AdministrativeBody": {
-   "id": "AdministrativeBody",
-   "type": "object",
-   "description": "Information about an election administrative body (e.g. County Board of Elections).",
-   "properties": {
-    "absenteeVotingInfoUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for information on absentee voting."
-    },
-    "ballotInfoUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body to give contest information to the voter."
-    },
-    "correspondenceAddress": {
-     "$ref": "SimpleAddressType",
-     "description": "The mailing address of this administrative body."
-    },
-    "electionInfoUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for looking up general election information."
-    },
-    "electionOfficials": {
-     "type": "array",
-     "description": "The election officials for this election administrative body.",
-     "items": {
-      "$ref": "ElectionOfficial"
-     }
-    },
-    "electionRegistrationConfirmationUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for confirming that the voter is registered to vote."
-    },
-    "electionRegistrationUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for looking up how to register to vote."
-    },
-    "electionRulesUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body describing election rules to the voter."
-    },
-    "hoursOfOperation": {
-     "type": "string",
-     "description": "A description of the hours of operation for this administrative body."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of this election administrative body."
-    },
-    "physicalAddress": {
-     "$ref": "SimpleAddressType",
-     "description": "The physical address of this administrative body."
-    },
-    "voter_services": {
-     "type": "array",
-     "description": "A description of the services this administrative body may provide.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "votingLocationFinderUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for looking up where to vote."
-    }
-   }
-  },
-  "Candidate": {
-   "id": "Candidate",
-   "type": "object",
-   "description": "Information about a candidate running for elected office.",
-   "properties": {
-    "candidateUrl": {
-     "type": "string",
-     "description": "The URL for the candidate's campaign web site."
-    },
-    "channels": {
-     "type": "array",
-     "description": "A list of known (social) media channels for this candidate.",
-     "items": {
-      "$ref": "Channel"
-     }
-    },
-    "email": {
-     "type": "string",
-     "description": "The email address for the candidate's campaign."
-    },
-    "name": {
-     "type": "string",
-     "description": "The candidate's name."
-    },
-    "orderOnBallot": {
-     "type": "string",
-     "description": "The order the candidate appears on the ballot for this contest.",
-     "format": "int64"
-    },
-    "party": {
-     "type": "string",
-     "description": "The full name of the party the candidate is a member of."
-    },
-    "phone": {
-     "type": "string",
-     "description": "The voice phone number for the candidate's campaign office."
-    },
-    "photoUrl": {
-     "type": "string",
-     "description": "A URL for a photo of the candidate."
-    }
-   }
-  },
-  "Channel": {
-   "id": "Channel",
-   "type": "object",
-   "description": "A social media or web channel for a candidate.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "The unique public identifier for the candidate's channel."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of channel. The following is a list of types of channels, but is not exhaustive. More channel types may be added at a later time. One of: GooglePlus, YouTube, Facebook, Twitter"
-    }
-   }
-  },
-  "Contest": {
-   "id": "Contest",
-   "type": "object",
-   "description": "Information about a contest that appears on a voter's ballot.",
-   "properties": {
-    "ballotPlacement": {
-     "type": "string",
-     "description": "A number specifying the position of this contest on the voter's ballot.",
-     "format": "int64"
-    },
-    "candidates": {
-     "type": "array",
-     "description": "The candidate choices for this contest.",
-     "items": {
-      "$ref": "Candidate"
-     }
-    },
-    "district": {
-     "$ref": "ElectoralDistrict",
-     "description": "Information about the electoral district that this contest is in."
-    },
-    "electorateSpecifications": {
-     "type": "string",
-     "description": "A description of any additional eligibility requirements for voting in this contest."
-    },
-    "id": {
-     "type": "string",
-     "description": "An ID for this object. IDs may change in future requests and should not be cached. Access to this field requires special access that can be requested from the Request more link on the Quotas page."
-    },
-    "level": {
-     "type": "string",
-     "description": "The level of office for this contest. One of: federal, state, county, city, other"
-    },
-    "numberElected": {
-     "type": "string",
-     "description": "The number of candidates that will be elected to office in this contest.",
-     "format": "int64"
-    },
-    "numberVotingFor": {
-     "type": "string",
-     "description": "The number of candidates that a voter may vote for in this contest.",
-     "format": "int64"
-    },
-    "office": {
-     "type": "string",
-     "description": "The name of the office for this contest."
-    },
-    "primaryParty": {
-     "type": "string",
-     "description": "If this is a partisan election, the name of the party it is for."
-    },
-    "referendumSubtitle": {
-     "type": "string",
-     "description": "A brief description of the referendum. This field is only populated for contests of type 'Referendum'."
-    },
-    "referendumTitle": {
-     "type": "string",
-     "description": "The title of the referendum (e.g. 'Proposition 42'). This field is only populated for contests of type 'Referendum'."
-    },
-    "referendumUrl": {
-     "type": "string",
-     "description": "A link to the referendum. This field is only populated for contests of type 'Referendum'."
-    },
-    "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"
-     }
-    },
-    "special": {
-     "type": "string",
-     "description": "\"Yes\" or \"No\" depending on whether this a contest being held outside the normal election cycle."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of contest. Usually this will be 'General', 'Primary', or 'Run-off' for contests with candidates. For referenda this will be 'Referendum'."
-    }
-   }
-  },
-  "DivisionSearchResponse": {
-   "id": "DivisionSearchResponse",
-   "type": "object",
-   "description": "The result of a division search query.",
-   "properties": {
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#divisionSearchResponse\".",
-     "default": "civicinfo#divisionSearchResponse"
-    },
-    "results": {
-     "type": "array",
-     "items": {
-      "$ref": "DivisionSearchResult"
-     }
-    },
-    "status": {
-     "type": "string",
-     "description": "The result of the request. One of: success, addressUnparseable, noAddressParameter, internalLookupFailure"
-    }
-   }
-  },
-  "DivisionSearchResult": {
-   "id": "DivisionSearchResult",
-   "type": "object",
-   "description": "Represents a political geographic division that matches the requested query.",
-   "properties": {
-    "aliases": {
-     "type": "array",
-     "description": "Other Open Civic Data identifiers that refer to the same division -- for example, those that refer to other political divisions whose boundaries are defined to be coterminous with this one. For example, ocd-division/country:us/state:wy will include an alias of ocd-division/country:us/state:wy/cd:1, since Wyoming has only one Congressional district.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the division."
-    },
-    "ocdId": {
-     "type": "string",
-     "description": "The unique Open Civic Data identifier for this division."
-    }
-   }
-  },
-  "Election": {
-   "id": "Election",
-   "type": "object",
-   "description": "Information about the election that was queried.",
-   "properties": {
-    "electionDay": {
-     "type": "string",
-     "description": "Day of the election in YYYY-MM-DD format."
-    },
-    "id": {
-     "type": "string",
-     "description": "The unique ID of this election.",
-     "format": "int64"
-    },
-    "name": {
-     "type": "string",
-     "description": "A displayable name for the election."
-    }
-   }
-  },
-  "ElectionOfficial": {
-   "id": "ElectionOfficial",
-   "type": "object",
-   "description": "Information about individual election officials.",
-   "properties": {
-    "emailAddress": {
-     "type": "string",
-     "description": "The email address of the election official."
-    },
-    "faxNumber": {
-     "type": "string",
-     "description": "The fax number of the election official."
-    },
-    "name": {
-     "type": "string",
-     "description": "The full name of the election official."
-    },
-    "officePhoneNumber": {
-     "type": "string",
-     "description": "The office phone number of the election official."
-    },
-    "title": {
-     "type": "string",
-     "description": "The title of the election official."
-    }
-   }
-  },
-  "ElectionsQueryResponse": {
-   "id": "ElectionsQueryResponse",
-   "type": "object",
-   "description": "The list of elections available for this version of the API.",
-   "properties": {
-    "elections": {
-     "type": "array",
-     "description": "A list of available elections",
-     "items": {
-      "$ref": "Election"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#electionsQueryResponse\".",
-     "default": "civicinfo#electionsQueryResponse"
-    }
-   }
-  },
-  "ElectoralDistrict": {
-   "id": "ElectoralDistrict",
-   "type": "object",
-   "description": "Describes the geographic scope of a contest.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "An identifier for this district, relative to its scope. For example, the 34th State Senate district would have id \"34\" and a scope of stateUpper."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the district."
-    },
-    "scope": {
-     "type": "string",
-     "description": "The geographic scope of this district. If unspecified the district's geography is not known. One of: national, statewide, congressional, stateUpper, stateLower, countywide, judicial, schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward, special"
-    }
-   }
-  },
-  "GeographicDivision": {
-   "id": "GeographicDivision",
-   "type": "object",
-   "description": "Describes a political geography.",
-   "properties": {
-    "alsoKnownAs": {
-     "type": "array",
-     "description": "Any other valid OCD IDs that refer to the same division.\n\nBecause OCD IDs are meant to be human-readable and at least somewhat predictable, there are occasionally several identifiers for a single division. These identifiers are defined to be equivalent to one another, and one is always indicated as the primary identifier. The primary identifier will be returned in ocd_id above, and any other equivalent valid identifiers will be returned in this list.\n\nFor example, if this division's OCD ID is ocd-division/country:us/district:dc, this will contain ocd-division/country:us/state:dc.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the division."
-    },
-    "officeIds": {
-     "type": "array",
-     "description": "List of keys in the offices object, one for each office elected from this division. Will only be present if includeOffices was true (or absent) in the request.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "scope": {
-     "type": "string",
-     "description": "The geographic scope of the division. If unspecified, the division's geography is not known. One of: national, statewide, congressional, stateUpper, stateLower, countywide, judicial, schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward, special"
-    }
-   }
-  },
-  "Office": {
-   "id": "Office",
-   "type": "object",
-   "description": "Information about an Office held by one or more Officials.",
-   "properties": {
-    "divisionId": {
-     "type": "string",
-     "description": "The OCD ID of the division with which this office is associated."
-    },
-    "level": {
-     "type": "string",
-     "description": "The level of this elected office. One of: federal, state, county, city, other"
-    },
-    "name": {
-     "type": "string",
-     "description": "The human-readable name of the office."
-    },
-    "officialIds": {
-     "type": "array",
-     "description": "List of keys in the officials object of people who presently hold this office.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "sources": {
-     "type": "array",
-     "description": "A list of sources for this office. 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 person 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"
-     }
-    },
-    "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",
-   "description": "A location where a voter can vote. This may be an early vote site, an election day voting location, or a drop off location for a completed ballot.",
-   "properties": {
-    "address": {
-     "$ref": "SimpleAddressType",
-     "description": "The address of the location."
-    },
-    "endDate": {
-     "type": "string",
-     "description": "The last date that this early vote site or drop off location may be used. This field is not populated for polling locations."
-    },
-    "id": {
-     "type": "string",
-     "description": "An ID for this object. IDs may change in future requests and should not be cached. Access to this field requires special access that can be requested from the Request more link on the Quotas page."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the early vote site or drop off location. This field is not populated for polling locations."
-    },
-    "notes": {
-     "type": "string",
-     "description": "Notes about this location (e.g. accessibility ramp or entrance to use)."
-    },
-    "pollingHours": {
-     "type": "string",
-     "description": "A description of when this location is open."
-    },
-    "sources": {
-     "type": "array",
-     "description": "A list of sources for this location. If multiple sources are listed the data has been aggregated from those sources.",
-     "items": {
-      "$ref": "Source"
-     }
-    },
-    "startDate": {
-     "type": "string",
-     "description": "The first date that this early vote site or drop off location may be used. This field is not populated for polling locations."
-    },
-    "voterServices": {
-     "type": "string",
-     "description": "The services provided by this early vote site or drop off location. This field is not populated for polling locations."
-    }
-   }
-  },
-  "RepresentativeInfoRequest": {
-   "id": "RepresentativeInfoRequest",
-   "type": "object",
-   "description": "A request for political geography and representative information for an address.",
-   "properties": {
-    "address": {
-     "type": "string",
-     "description": "The address to look up. May only be specified if the field ocdId is not given in the URL."
-    }
-   }
-  },
-  "RepresentativeInfoResponse": {
-   "id": "RepresentativeInfoResponse",
-   "type": "object",
-   "description": "The result of a representative info lookup query.",
-   "properties": {
-    "divisions": {
-     "type": "object",
-     "description": "Political geographic divisions that contain the requested address.",
-     "additionalProperties": {
-      "$ref": "GeographicDivision",
-      "description": "The unique Open Civic Data identifier for this division."
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#representativeInfoResponse\".",
-     "default": "civicinfo#representativeInfoResponse"
-    },
-    "normalizedInput": {
-     "$ref": "SimpleAddressType",
-     "description": "The normalized version of the requested address"
-    },
-    "offices": {
-     "type": "object",
-     "description": "Elected offices referenced by the divisions listed above. Will only be present if includeOffices was true in the request.",
-     "additionalProperties": {
-      "$ref": "Office",
-      "description": "A unique identifier for this office, within the context of this request. Identifiers are *not* long-lived: the same office may get different IDs on different requests."
-     }
-    },
-    "officials": {
-     "type": "object",
-     "description": "Officials holding the offices listed above. Will only be present if includeOffices was true in the request.",
-     "additionalProperties": {
-      "$ref": "Official",
-      "description": "A unique identifier for this official, within the context of this request. Identifiers are *not* long-lived: the same official may get different IDs on different requests."
-     }
-    },
-    "status": {
-     "type": "string",
-     "description": "The result of the request. One of: success, noStreetSegmentFound, addressUnparseable, noAddressParameter, multipleStreetSegmentsFound, electionOver, electionUnknown, internalLookupFailure, RequestedBothAddressAndOcdId"
-    }
-   }
-  },
-  "SimpleAddressType": {
-   "id": "SimpleAddressType",
-   "type": "object",
-   "description": "A simple representation of an address.",
-   "properties": {
-    "city": {
-     "type": "string",
-     "description": "The city or town for the address."
-    },
-    "line1": {
-     "type": "string",
-     "description": "The street name and number of this address."
-    },
-    "line2": {
-     "type": "string",
-     "description": "The second line the address, if needed."
-    },
-    "line3": {
-     "type": "string",
-     "description": "The third line of the address, if needed."
-    },
-    "locationName": {
-     "type": "string",
-     "description": "The name of the location."
-    },
-    "state": {
-     "type": "string",
-     "description": "The US two letter state abbreviation of the address."
-    },
-    "zip": {
-     "type": "string",
-     "description": "The US Postal Zip Code of the address."
-    }
-   }
-  },
-  "Source": {
-   "id": "Source",
-   "type": "object",
-   "description": "Contains information about the data source for the element containing it.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The name of the data source."
-    },
-    "official": {
-     "type": "boolean",
-     "description": "Whether this data comes from an official government source."
-    }
-   }
-  },
-  "VoterInfoRequest": {
-   "id": "VoterInfoRequest",
-   "type": "object",
-   "description": "A request for information about a voter.",
-   "properties": {
-    "address": {
-     "type": "string",
-     "description": "The registered address of the voter to look up."
-    }
-   }
-  },
-  "VoterInfoResponse": {
-   "id": "VoterInfoResponse",
-   "type": "object",
-   "description": "The result of a voter info lookup query.",
-   "properties": {
-    "contests": {
-     "type": "array",
-     "description": "Contests that will appear on the voter's ballot.",
-     "items": {
-      "$ref": "Contest"
-     }
-    },
-    "dropOffLocations": {
-     "type": "array",
-     "description": "Locations where a voter is eligible to drop off a completed ballot. The voter must have received and completed a ballot prior to arriving at the location. The location may not have ballots available on the premises. These locations could be open on or before election day as indicated in the pollingHours field.",
-     "items": {
-      "$ref": "PollingLocation"
-     }
-    },
-    "earlyVoteSites": {
-     "type": "array",
-     "description": "Locations where the voter is eligible to vote early, prior to election day.",
-     "items": {
-      "$ref": "PollingLocation"
-     }
-    },
-    "election": {
-     "$ref": "Election",
-     "description": "The election that was queried."
-    },
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#voterInfoResponse\".",
-     "default": "civicinfo#voterInfoResponse"
-    },
-    "normalizedInput": {
-     "$ref": "SimpleAddressType",
-     "description": "The normalized version of the requested address"
-    },
-    "pollingLocations": {
-     "type": "array",
-     "description": "Locations where the voter is eligible to vote on election day.",
-     "items": {
-      "$ref": "PollingLocation"
-     }
-    },
-    "precinctId": {
-     "type": "string"
-    },
-    "state": {
-     "type": "array",
-     "description": "Local Election Information for the state that the voter votes in. For the US, there will only be one element in this array.",
-     "items": {
-      "$ref": "AdministrationRegion"
-     }
-    },
-    "status": {
-     "type": "string",
-     "description": "The result of the request. One of: success, noStreetSegmentFound, addressUnparseable, noAddressParameter, multipleStreetSegmentsFound, electionOver, electionUnknown, internalLookupFailure"
-    }
-   }
-  }
- },
- "resources": {
-  "divisions": {
-   "methods": {
-    "search": {
-     "id": "civicinfo.divisions.search",
-     "path": "representatives/division_search",
-     "httpMethod": "GET",
-     "description": "Searches for political divisions by their natural name or OCD ID.",
-     "parameters": {
-      "query": {
-       "type": "string",
-       "description": "The search query. Queries can cover any parts of a OCD ID or a human readable division name. All words given in the query are treated as required patterns. In addition to that, most query operators of the Apache Lucene library are supported. See http://lucene.apache.org/core/2_9_4/queryparsersyntax.html",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "DivisionSearchResponse"
-     }
-    }
-   }
-  },
-  "elections": {
-   "methods": {
-    "electionQuery": {
-     "id": "civicinfo.elections.electionQuery",
-     "path": "elections",
-     "httpMethod": "GET",
-     "description": "List of available elections to query.",
-     "response": {
-      "$ref": "ElectionsQueryResponse"
-     }
-    },
-    "voterInfoQuery": {
-     "id": "civicinfo.elections.voterInfoQuery",
-     "path": "voterinfo/{electionId}/lookup",
-     "httpMethod": "POST",
-     "description": "Looks up information relevant to a voter based on the voter's registered address.",
-     "parameters": {
-      "electionId": {
-       "type": "string",
-       "description": "The unique ID of the election to look up. A list of election IDs can be obtained at https://www.googleapis.com/civicinfo/{version}/elections",
-       "required": true,
-       "format": "int64",
-       "location": "path"
-      },
-      "officialOnly": {
-       "type": "boolean",
-       "description": "If set to true, only data from official state sources will be returned.",
-       "default": "false",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "electionId"
-     ],
-     "request": {
-      "$ref": "VoterInfoRequest"
-     },
-     "response": {
-      "$ref": "VoterInfoResponse"
-     }
-    }
-   }
-  },
-  "representatives": {
-   "methods": {
-    "representativeInfoQuery": {
-     "id": "civicinfo.representatives.representativeInfoQuery",
-     "path": "representatives/lookup",
-     "httpMethod": "POST",
-     "description": "Looks up political geography and representative information based on an address or Open Civic Data division identifier.",
-     "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"
-      },
-      "ocdId": {
-       "type": "string",
-       "description": "The division to look up. May only be specified if the address field is not given in the request body.",
-       "location": "query"
-      },
-      "recursive": {
-       "type": "boolean",
-       "description": "When ocd_id is supplied, return all divisions which are hierarchically nested within the queried division. For example, if querying ocd-division/country:us/district:dc, this would also return all DC's wards and ANCs.",
-       "default": "false",
-       "location": "query"
-      }
-     },
-     "request": {
-      "$ref": "RepresentativeInfoRequest"
-     },
-     "response": {
-      "$ref": "RepresentativeInfoResponse"
-     }
-    }
-   }
-  }
- }
-}
diff --git a/civicinfo/us_v1/civicinfo-gen.go b/civicinfo/us_v1/civicinfo-gen.go
deleted file mode 100644
index c029d86..0000000
--- a/civicinfo/us_v1/civicinfo-gen.go
+++ /dev/null
@@ -1,946 +0,0 @@
-// Package civicinfo provides access to the Google Civic Information API.
-//
-// See https://developers.google.com/civic-information
-//
-// Usage example:
-//
-//   import "google.golang.org/api/civicinfo/us_v1"
-//   ...
-//   civicinfoService, err := civicinfo.New(oauthHttpClient)
-package civicinfo
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-	"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
-var _ = context.Background
-
-const apiId = "civicinfo:us_v1"
-const apiName = "civicinfo"
-const apiVersion = "us_v1"
-const basePath = "https://www.googleapis.com/civicinfo/us_v1/"
-
-func New(client *http.Client) (*Service, error) {
-	if client == nil {
-		return nil, errors.New("client is nil")
-	}
-	s := &Service{client: client, BasePath: basePath}
-	s.Divisions = NewDivisionsService(s)
-	s.Elections = NewElectionsService(s)
-	s.Representatives = NewRepresentativesService(s)
-	return s, nil
-}
-
-type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
-
-	Divisions *DivisionsService
-
-	Elections *ElectionsService
-
-	Representatives *RepresentativesService
-}
-
-func NewDivisionsService(s *Service) *DivisionsService {
-	rs := &DivisionsService{s: s}
-	return rs
-}
-
-type DivisionsService struct {
-	s *Service
-}
-
-func NewElectionsService(s *Service) *ElectionsService {
-	rs := &ElectionsService{s: s}
-	return rs
-}
-
-type ElectionsService struct {
-	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.
-	ElectionAdministrationBody *AdministrativeBody `json:"electionAdministrationBody,omitempty"`
-
-	// Id: An ID for this object. IDs may change in future requests and
-	// should not be cached. Access to this field requires special access
-	// that can be requested from the Request more link on the Quotas page.
-	Id string `json:"id,omitempty"`
-
-	// Local_jurisdiction: The city or county that provides election
-	// information for this voter. This object can have the same elements as
-	// state.
-	Local_jurisdiction *AdministrationRegion `json:"local_jurisdiction,omitempty"`
-
-	// Name: The name of the jurisdiction.
-	Name string `json:"name,omitempty"`
-
-	// Sources: A list of sources for this area. If multiple sources are
-	// listed the data has been aggregated from those sources.
-	Sources []*Source `json:"sources,omitempty"`
-}
-
-type AdministrativeBody struct {
-	// AbsenteeVotingInfoUrl: A URL provided by this administrative body for
-	// information on absentee voting.
-	AbsenteeVotingInfoUrl string `json:"absenteeVotingInfoUrl,omitempty"`
-
-	// BallotInfoUrl: A URL provided by this administrative body to give
-	// contest information to the voter.
-	BallotInfoUrl string `json:"ballotInfoUrl,omitempty"`
-
-	// CorrespondenceAddress: The mailing address of this administrative
-	// body.
-	CorrespondenceAddress *SimpleAddressType `json:"correspondenceAddress,omitempty"`
-
-	// ElectionInfoUrl: A URL provided by this administrative body for
-	// looking up general election information.
-	ElectionInfoUrl string `json:"electionInfoUrl,omitempty"`
-
-	// ElectionOfficials: The election officials for this election
-	// administrative body.
-	ElectionOfficials []*ElectionOfficial `json:"electionOfficials,omitempty"`
-
-	// ElectionRegistrationConfirmationUrl: A URL provided by this
-	// administrative body for confirming that the voter is registered to
-	// vote.
-	ElectionRegistrationConfirmationUrl string `json:"electionRegistrationConfirmationUrl,omitempty"`
-
-	// ElectionRegistrationUrl: A URL provided by this administrative body
-	// for looking up how to register to vote.
-	ElectionRegistrationUrl string `json:"electionRegistrationUrl,omitempty"`
-
-	// ElectionRulesUrl: A URL provided by this administrative body
-	// describing election rules to the voter.
-	ElectionRulesUrl string `json:"electionRulesUrl,omitempty"`
-
-	// HoursOfOperation: A description of the hours of operation for this
-	// administrative body.
-	HoursOfOperation string `json:"hoursOfOperation,omitempty"`
-
-	// Name: The name of this election administrative body.
-	Name string `json:"name,omitempty"`
-
-	// PhysicalAddress: The physical address of this administrative body.
-	PhysicalAddress *SimpleAddressType `json:"physicalAddress,omitempty"`
-
-	// Voter_services: A description of the services this administrative
-	// body may provide.
-	Voter_services []string `json:"voter_services,omitempty"`
-
-	// VotingLocationFinderUrl: A URL provided by this administrative body
-	// for looking up where to vote.
-	VotingLocationFinderUrl string `json:"votingLocationFinderUrl,omitempty"`
-}
-
-type Candidate struct {
-	// CandidateUrl: The URL for the candidate's campaign web site.
-	CandidateUrl string `json:"candidateUrl,omitempty"`
-
-	// Channels: A list of known (social) media channels for this candidate.
-	Channels []*Channel `json:"channels,omitempty"`
-
-	// Email: The email address for the candidate's campaign.
-	Email string `json:"email,omitempty"`
-
-	// Name: The candidate's name.
-	Name string `json:"name,omitempty"`
-
-	// OrderOnBallot: The order the candidate appears on the ballot for this
-	// contest.
-	OrderOnBallot int64 `json:"orderOnBallot,omitempty,string"`
-
-	// Party: The full name of the party the candidate is a member of.
-	Party string `json:"party,omitempty"`
-
-	// Phone: The voice phone number for the candidate's campaign office.
-	Phone string `json:"phone,omitempty"`
-
-	// PhotoUrl: A URL for a photo of the candidate.
-	PhotoUrl string `json:"photoUrl,omitempty"`
-}
-
-type Channel struct {
-	// Id: The unique public identifier for the candidate's channel.
-	Id string `json:"id,omitempty"`
-
-	// Type: The type of channel. The following is a list of types of
-	// channels, but is not exhaustive. More channel types may be added at a
-	// later time. One of: GooglePlus, YouTube, Facebook, Twitter
-	Type string `json:"type,omitempty"`
-}
-
-type Contest struct {
-	// BallotPlacement: A number specifying the position of this contest on
-	// the voter's ballot.
-	BallotPlacement int64 `json:"ballotPlacement,omitempty,string"`
-
-	// Candidates: The candidate choices for this contest.
-	Candidates []*Candidate `json:"candidates,omitempty"`
-
-	// District: Information about the electoral district that this contest
-	// is in.
-	District *ElectoralDistrict `json:"district,omitempty"`
-
-	// ElectorateSpecifications: A description of any additional eligibility
-	// requirements for voting in this contest.
-	ElectorateSpecifications string `json:"electorateSpecifications,omitempty"`
-
-	// Id: An ID for this object. IDs may change in future requests and
-	// should not be cached. Access to this field requires special access
-	// that can be requested from the Request more link on the Quotas page.
-	Id string `json:"id,omitempty"`
-
-	// Level: The level of office for this contest. One of: federal, state,
-	// county, city, other
-	Level string `json:"level,omitempty"`
-
-	// NumberElected: The number of candidates that will be elected to
-	// office in this contest.
-	NumberElected int64 `json:"numberElected,omitempty,string"`
-
-	// NumberVotingFor: The number of candidates that a voter may vote for
-	// in this contest.
-	NumberVotingFor int64 `json:"numberVotingFor,omitempty,string"`
-
-	// Office: The name of the office for this contest.
-	Office string `json:"office,omitempty"`
-
-	// PrimaryParty: If this is a partisan election, the name of the party
-	// it is for.
-	PrimaryParty string `json:"primaryParty,omitempty"`
-
-	// ReferendumSubtitle: A brief description of the referendum. This field
-	// is only populated for contests of type 'Referendum'.
-	ReferendumSubtitle string `json:"referendumSubtitle,omitempty"`
-
-	// ReferendumTitle: The title of the referendum (e.g. 'Proposition 42').
-	// This field is only populated for contests of type 'Referendum'.
-	ReferendumTitle string `json:"referendumTitle,omitempty"`
-
-	// ReferendumUrl: A link to the referendum. This field is only populated
-	// for contests of type 'Referendum'.
-	ReferendumUrl string `json:"referendumUrl,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"`
-
-	// Special: "Yes" or "No" depending on whether this a contest being held
-	// outside the normal election cycle.
-	Special string `json:"special,omitempty"`
-
-	// Type: The type of contest. Usually this will be 'General', 'Primary',
-	// or 'Run-off' for contests with candidates. For referenda this will be
-	// 'Referendum'.
-	Type string `json:"type,omitempty"`
-}
-
-type DivisionSearchResponse struct {
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "civicinfo#divisionSearchResponse".
-	Kind string `json:"kind,omitempty"`
-
-	Results []*DivisionSearchResult `json:"results,omitempty"`
-
-	// Status: The result of the request. One of: success,
-	// addressUnparseable, noAddressParameter, internalLookupFailure
-	Status string `json:"status,omitempty"`
-}
-
-type DivisionSearchResult struct {
-	// Aliases: Other Open Civic Data identifiers that refer to the same
-	// division -- for example, those that refer to other political
-	// divisions whose boundaries are defined to be coterminous with this
-	// one. For example, ocd-division/country:us/state:wy will include an
-	// alias of ocd-division/country:us/state:wy/cd:1, since Wyoming has
-	// only one Congressional district.
-	Aliases []string `json:"aliases,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"`
-}
-
-type Election struct {
-	// ElectionDay: Day of the election in YYYY-MM-DD format.
-	ElectionDay string `json:"electionDay,omitempty"`
-
-	// Id: The unique ID of this election.
-	Id int64 `json:"id,omitempty,string"`
-
-	// Name: A displayable name for the election.
-	Name string `json:"name,omitempty"`
-}
-
-type ElectionOfficial struct {
-	// EmailAddress: The email address of the election official.
-	EmailAddress string `json:"emailAddress,omitempty"`
-
-	// FaxNumber: The fax number of the election official.
-	FaxNumber string `json:"faxNumber,omitempty"`
-
-	// Name: The full name of the election official.
-	Name string `json:"name,omitempty"`
-
-	// OfficePhoneNumber: The office phone number of the election official.
-	OfficePhoneNumber string `json:"officePhoneNumber,omitempty"`
-
-	// Title: The title of the election official.
-	Title string `json:"title,omitempty"`
-}
-
-type ElectionsQueryResponse struct {
-	// Elections: A list of available elections
-	Elections []*Election `json:"elections,omitempty"`
-
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "civicinfo#electionsQueryResponse".
-	Kind string `json:"kind,omitempty"`
-}
-
-type ElectoralDistrict struct {
-	// Id: An identifier for this district, relative to its scope. For
-	// example, the 34th State Senate district would have id "34" and a
-	// scope of stateUpper.
-	Id string `json:"id,omitempty"`
-
-	// Name: The name of the district.
-	Name string `json:"name,omitempty"`
-
-	// Scope: The geographic scope of this district. If unspecified the
-	// district's geography is not known. One of: national, statewide,
-	// congressional, stateUpper, stateLower, countywide, judicial,
-	// schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward,
-	// special
-	Scope string `json:"scope,omitempty"`
-}
-
-type GeographicDivision struct {
-	// AlsoKnownAs: Any other valid OCD IDs that refer to the same
-	// division.
-	//
-	// Because OCD IDs are meant to be human-readable and at
-	// least somewhat predictable, there are occasionally several
-	// identifiers for a single division. These identifiers are defined to
-	// be equivalent to one another, and one is always indicated as the
-	// primary identifier. The primary identifier will be returned in ocd_id
-	// above, and any other equivalent valid identifiers will be returned in
-	// this list.
-	//
-	// For example, if this division's OCD ID is
-	// ocd-division/country:us/district:dc, this will contain
-	// ocd-division/country:us/state:dc.
-	AlsoKnownAs []string `json:"alsoKnownAs,omitempty"`
-
-	// Name: The name of the division.
-	Name string `json:"name,omitempty"`
-
-	// OfficeIds: List of keys in the offices object, one for each office
-	// elected from this division. Will only be present if includeOffices
-	// was true (or absent) in the request.
-	OfficeIds []string `json:"officeIds,omitempty"`
-
-	// Scope: The geographic scope of the division. If unspecified, the
-	// division's geography is not known. One of: national, statewide,
-	// congressional, stateUpper, stateLower, countywide, judicial,
-	// schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward,
-	// special
-	Scope string `json:"scope,omitempty"`
-}
-
-type Office struct {
-	// DivisionId: The OCD ID of the division with which this office is
-	// associated.
-	DivisionId string `json:"divisionId,omitempty"`
-
-	// Level: The level of this elected office. One of: federal, state,
-	// county, city, other
-	Level string `json:"level,omitempty"`
-
-	// Name: The human-readable name of the office.
-	Name string `json:"name,omitempty"`
-
-	// OfficialIds: List of keys in the officials object of people who
-	// presently hold this office.
-	OfficialIds []string `json:"officialIds,omitempty"`
-
-	// Sources: A list of sources for this office. 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"`
-
-	// 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"`
-
-	// EndDate: The last date that this early vote site or drop off location
-	// may be used. This field is not populated for polling locations.
-	EndDate string `json:"endDate,omitempty"`
-
-	// Id: An ID for this object. IDs may change in future requests and
-	// should not be cached. Access to this field requires special access
-	// that can be requested from the Request more link on the Quotas page.
-	Id string `json:"id,omitempty"`
-
-	// Name: The name of the early vote site or drop off location. This
-	// field is not populated for polling locations.
-	Name string `json:"name,omitempty"`
-
-	// Notes: Notes about this location (e.g. accessibility ramp or entrance
-	// to use).
-	Notes string `json:"notes,omitempty"`
-
-	// PollingHours: A description of when this location is open.
-	PollingHours string `json:"pollingHours,omitempty"`
-
-	// Sources: A list of sources for this location. If multiple sources are
-	// listed the data has been aggregated from those sources.
-	Sources []*Source `json:"sources,omitempty"`
-
-	// StartDate: The first date that this early vote site or drop off
-	// location may be used. This field is not populated for polling
-	// locations.
-	StartDate string `json:"startDate,omitempty"`
-
-	// VoterServices: The services provided by this early vote site or drop
-	// off location. This field is not populated for polling locations.
-	VoterServices string `json:"voterServices,omitempty"`
-}
-
-type RepresentativeInfoRequest struct {
-	// Address: The address to look up. May only be specified if the field
-	// ocdId is not given in the URL.
-	Address string `json:"address,omitempty"`
-}
-
-type RepresentativeInfoResponse struct {
-	// Divisions: Political geographic divisions that contain the requested
-	// address.
-	Divisions map[string]GeographicDivision `json:"divisions,omitempty"`
-
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "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 includeOffices was true in the request.
-	Offices map[string]Office `json:"offices,omitempty"`
-
-	// Officials: Officials holding the offices listed above. Will only be
-	// present if includeOffices was true in the request.
-	Officials map[string]Official `json:"officials,omitempty"`
-
-	// Status: The result of the request. One of: success,
-	// noStreetSegmentFound, addressUnparseable, noAddressParameter,
-	// multipleStreetSegmentsFound, electionOver, electionUnknown,
-	// internalLookupFailure, RequestedBothAddressAndOcdId
-	Status string `json:"status,omitempty"`
-}
-
-type SimpleAddressType struct {
-	// City: The city or town for the address.
-	City string `json:"city,omitempty"`
-
-	// Line1: The street name and number of this address.
-	Line1 string `json:"line1,omitempty"`
-
-	// Line2: The second line the address, if needed.
-	Line2 string `json:"line2,omitempty"`
-
-	// Line3: The third line of the address, if needed.
-	Line3 string `json:"line3,omitempty"`
-
-	// LocationName: The name of the location.
-	LocationName string `json:"locationName,omitempty"`
-
-	// State: The US two letter state abbreviation of the address.
-	State string `json:"state,omitempty"`
-
-	// Zip: The US Postal Zip Code of the address.
-	Zip string `json:"zip,omitempty"`
-}
-
-type Source struct {
-	// Name: The name of the data source.
-	Name string `json:"name,omitempty"`
-
-	// Official: Whether this data comes from an official government source.
-	Official bool `json:"official,omitempty"`
-}
-
-type VoterInfoRequest struct {
-	// Address: The registered address of the voter to look up.
-	Address string `json:"address,omitempty"`
-}
-
-type VoterInfoResponse struct {
-	// Contests: Contests that will appear on the voter's ballot.
-	Contests []*Contest `json:"contests,omitempty"`
-
-	// DropOffLocations: Locations where a voter is eligible to drop off a
-	// completed ballot. The voter must have received and completed a ballot
-	// prior to arriving at the location. The location may not have ballots
-	// available on the premises. These locations could be open on or before
-	// election day as indicated in the pollingHours field.
-	DropOffLocations []*PollingLocation `json:"dropOffLocations,omitempty"`
-
-	// EarlyVoteSites: Locations where the voter is eligible to vote early,
-	// prior to election day.
-	EarlyVoteSites []*PollingLocation `json:"earlyVoteSites,omitempty"`
-
-	// Election: The election that was queried.
-	Election *Election `json:"election,omitempty"`
-
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "civicinfo#voterInfoResponse".
-	Kind string `json:"kind,omitempty"`
-
-	// NormalizedInput: The normalized version of the requested address
-	NormalizedInput *SimpleAddressType `json:"normalizedInput,omitempty"`
-
-	// PollingLocations: Locations where the voter is eligible to vote on
-	// election day.
-	PollingLocations []*PollingLocation `json:"pollingLocations,omitempty"`
-
-	PrecinctId string `json:"precinctId,omitempty"`
-
-	// State: Local Election Information for the state that the voter votes
-	// in. For the US, there will only be one element in this array.
-	State []*AdministrationRegion `json:"state,omitempty"`
-
-	// Status: The result of the request. One of: success,
-	// noStreetSegmentFound, addressUnparseable, noAddressParameter,
-	// multipleStreetSegmentsFound, electionOver, electionUnknown,
-	// internalLookupFailure
-	Status string `json:"status,omitempty"`
-}
-
-// method id "civicinfo.divisions.search":
-
-type DivisionsSearchCall struct {
-	s    *Service
-	opt_ map[string]interface{}
-}
-
-// Search: Searches for political divisions by their natural name or OCD
-// ID.
-func (r *DivisionsService) Search() *DivisionsSearchCall {
-	c := &DivisionsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	return c
-}
-
-// Query sets the optional parameter "query": The search query. Queries
-// can cover any parts of a OCD ID or a human readable division name.
-// All words given in the query are treated as required patterns. In
-// addition to that, most query operators of the Apache Lucene library
-// are supported. See
-// http://lucene.apache.org/core/2_9_4/queryparsersyntax.html
-func (c *DivisionsSearchCall) Query(query string) *DivisionsSearchCall {
-	c.opt_["query"] = query
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DivisionsSearchCall) Fields(s ...googleapi.Field) *DivisionsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DivisionsSearchCall) Do() (*DivisionSearchResponse, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["query"]; ok {
-		params.Set("query", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "representatives/division_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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *DivisionSearchResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Searches for political divisions by their natural name or OCD ID.",
-	//   "httpMethod": "GET",
-	//   "id": "civicinfo.divisions.search",
-	//   "parameters": {
-	//     "query": {
-	//       "description": "The search query. Queries can cover any parts of a OCD ID or a human readable division name. All words given in the query are treated as required patterns. In addition to that, most query operators of the Apache Lucene library are supported. See http://lucene.apache.org/core/2_9_4/queryparsersyntax.html",
-	//       "location": "query",
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "representatives/division_search",
-	//   "response": {
-	//     "$ref": "DivisionSearchResponse"
-	//   }
-	// }
-
-}
-
-// method id "civicinfo.elections.electionQuery":
-
-type ElectionsElectionQueryCall struct {
-	s    *Service
-	opt_ map[string]interface{}
-}
-
-// ElectionQuery: List of available elections to query.
-func (r *ElectionsService) ElectionQuery() *ElectionsElectionQueryCall {
-	c := &ElectionsElectionQueryCall{s: r.s, opt_: make(map[string]interface{})}
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ElectionsElectionQueryCall) Fields(s ...googleapi.Field) *ElectionsElectionQueryCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ElectionsElectionQueryCall) Do() (*ElectionsQueryResponse, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ElectionsQueryResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "List of available elections to query.",
-	//   "httpMethod": "GET",
-	//   "id": "civicinfo.elections.electionQuery",
-	//   "path": "elections",
-	//   "response": {
-	//     "$ref": "ElectionsQueryResponse"
-	//   }
-	// }
-
-}
-
-// method id "civicinfo.elections.voterInfoQuery":
-
-type ElectionsVoterInfoQueryCall struct {
-	s                *Service
-	electionId       int64
-	voterinforequest *VoterInfoRequest
-	opt_             map[string]interface{}
-}
-
-// VoterInfoQuery: Looks up information relevant to a voter based on the
-// voter's registered address.
-func (r *ElectionsService) VoterInfoQuery(electionId int64, voterinforequest *VoterInfoRequest) *ElectionsVoterInfoQueryCall {
-	c := &ElectionsVoterInfoQueryCall{s: r.s, opt_: make(map[string]interface{})}
-	c.electionId = electionId
-	c.voterinforequest = voterinforequest
-	return c
-}
-
-// OfficialOnly sets the optional parameter "officialOnly": If set to
-// true, only data from official state sources will be returned.
-func (c *ElectionsVoterInfoQueryCall) OfficialOnly(officialOnly bool) *ElectionsVoterInfoQueryCall {
-	c.opt_["officialOnly"] = officialOnly
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ElectionsVoterInfoQueryCall) Fields(s ...googleapi.Field) *ElectionsVoterInfoQueryCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ElectionsVoterInfoQueryCall) Do() (*VoterInfoResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.voterinforequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["officialOnly"]; ok {
-		params.Set("officialOnly", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "voterinfo/{electionId}/lookup")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"electionId": strconv.FormatInt(c.electionId, 10),
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *VoterInfoResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Looks up information relevant to a voter based on the voter's registered address.",
-	//   "httpMethod": "POST",
-	//   "id": "civicinfo.elections.voterInfoQuery",
-	//   "parameterOrder": [
-	//     "electionId"
-	//   ],
-	//   "parameters": {
-	//     "electionId": {
-	//       "description": "The unique ID of the election to look up. A list of election IDs can be obtained at https://www.googleapis.com/civicinfo/{version}/elections",
-	//       "format": "int64",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "officialOnly": {
-	//       "default": "false",
-	//       "description": "If set to true, only data from official state sources will be returned.",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     }
-	//   },
-	//   "path": "voterinfo/{electionId}/lookup",
-	//   "request": {
-	//     "$ref": "VoterInfoRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "VoterInfoResponse"
-	//   }
-	// }
-
-}
-
-// method id "civicinfo.representatives.representativeInfoQuery":
-
-type RepresentativesRepresentativeInfoQueryCall struct {
-	s                         *Service
-	representativeinforequest *RepresentativeInfoRequest
-	opt_                      map[string]interface{}
-}
-
-// RepresentativeInfoQuery: Looks up political geography and
-// representative information based on an address or Open Civic Data
-// division identifier.
-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
-}
-
-// OcdId sets the optional parameter "ocdId": The division to look up.
-// May only be specified if the address field is not given in the
-// request body.
-func (c *RepresentativesRepresentativeInfoQueryCall) OcdId(ocdId string) *RepresentativesRepresentativeInfoQueryCall {
-	c.opt_["ocdId"] = ocdId
-	return c
-}
-
-// Recursive sets the optional parameter "recursive": When ocd_id is
-// supplied, return all divisions which are hierarchically nested within
-// the queried division. For example, if querying
-// ocd-division/country:us/district:dc, this would also return all DC's
-// wards and ANCs.
-func (c *RepresentativesRepresentativeInfoQueryCall) Recursive(recursive bool) *RepresentativesRepresentativeInfoQueryCall {
-	c.opt_["recursive"] = recursive
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *RepresentativesRepresentativeInfoQueryCall) Fields(s ...googleapi.Field) *RepresentativesRepresentativeInfoQueryCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	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))
-	}
-	if v, ok := c.opt_["ocdId"]; ok {
-		params.Set("ocdId", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["recursive"]; ok {
-		params.Set("recursive", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *RepresentativeInfoResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Looks up political geography and representative information based on an address or Open Civic Data division identifier.",
-	//   "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"
-	//     },
-	//     "ocdId": {
-	//       "description": "The division to look up. May only be specified if the address field is not given in the request body.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "recursive": {
-	//       "default": "false",
-	//       "description": "When ocd_id is supplied, return all divisions which are hierarchically nested within the queried division. For example, if querying ocd-division/country:us/district:dc, this would also return all DC's wards and ANCs.",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     }
-	//   },
-	//   "path": "representatives/lookup",
-	//   "request": {
-	//     "$ref": "RepresentativeInfoRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "RepresentativeInfoResponse"
-	//   }
-	// }
-
-}
diff --git a/civicinfo/v1/civicinfo-api.json b/civicinfo/v1/civicinfo-api.json
deleted file mode 100644
index 078ecfc..0000000
--- a/civicinfo/v1/civicinfo-api.json
+++ /dev/null
@@ -1,874 +0,0 @@
-{
- "kind": "discovery#restDescription",
- "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/m-jfWpr9P6EusWc0QHxRJ5ZUj0Y\"",
- "discoveryVersion": "v1",
- "id": "civicinfo:v1",
- "name": "civicinfo",
- "canonicalName": "Civic Info",
- "version": "v1",
- "revision": "20141023",
- "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"
- },
- "documentationLink": "https://developers.google.com/civic-information",
- "protocol": "rest",
- "baseUrl": "https://www.googleapis.com/civicinfo/v1/",
- "basePath": "/civicinfo/v1/",
- "rootUrl": "https://www.googleapis.com/",
- "servicePath": "civicinfo/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"
-  }
- },
- "schemas": {
-  "AdministrationRegion": {
-   "id": "AdministrationRegion",
-   "type": "object",
-   "description": "Describes information about a regional election administrative area.",
-   "properties": {
-    "electionAdministrationBody": {
-     "$ref": "AdministrativeBody",
-     "description": "The election administration body for this area."
-    },
-    "id": {
-     "type": "string",
-     "description": "An ID for this object. IDs may change in future requests and should not be cached. Access to this field requires special access that can be requested from the Request more link on the Quotas page."
-    },
-    "local_jurisdiction": {
-     "$ref": "AdministrationRegion",
-     "description": "The city or county that provides election information for this voter. This object can have the same elements as state."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the jurisdiction."
-    },
-    "sources": {
-     "type": "array",
-     "description": "A list of sources for this area. If multiple sources are listed the data has been aggregated from those sources.",
-     "items": {
-      "$ref": "Source"
-     }
-    }
-   }
-  },
-  "AdministrativeBody": {
-   "id": "AdministrativeBody",
-   "type": "object",
-   "description": "Information about an election administrative body (e.g. County Board of Elections).",
-   "properties": {
-    "absenteeVotingInfoUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for information on absentee voting."
-    },
-    "ballotInfoUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body to give contest information to the voter."
-    },
-    "correspondenceAddress": {
-     "$ref": "SimpleAddressType",
-     "description": "The mailing address of this administrative body."
-    },
-    "electionInfoUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for looking up general election information."
-    },
-    "electionOfficials": {
-     "type": "array",
-     "description": "The election officials for this election administrative body.",
-     "items": {
-      "$ref": "ElectionOfficial"
-     }
-    },
-    "electionRegistrationConfirmationUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for confirming that the voter is registered to vote."
-    },
-    "electionRegistrationUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for looking up how to register to vote."
-    },
-    "electionRulesUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body describing election rules to the voter."
-    },
-    "hoursOfOperation": {
-     "type": "string",
-     "description": "A description of the hours of operation for this administrative body."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of this election administrative body."
-    },
-    "physicalAddress": {
-     "$ref": "SimpleAddressType",
-     "description": "The physical address of this administrative body."
-    },
-    "voter_services": {
-     "type": "array",
-     "description": "A description of the services this administrative body may provide.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "votingLocationFinderUrl": {
-     "type": "string",
-     "description": "A URL provided by this administrative body for looking up where to vote."
-    }
-   }
-  },
-  "Candidate": {
-   "id": "Candidate",
-   "type": "object",
-   "description": "Information about a candidate running for elected office.",
-   "properties": {
-    "candidateUrl": {
-     "type": "string",
-     "description": "The URL for the candidate's campaign web site."
-    },
-    "channels": {
-     "type": "array",
-     "description": "A list of known (social) media channels for this candidate.",
-     "items": {
-      "$ref": "Channel"
-     }
-    },
-    "email": {
-     "type": "string",
-     "description": "The email address for the candidate's campaign."
-    },
-    "name": {
-     "type": "string",
-     "description": "The candidate's name."
-    },
-    "orderOnBallot": {
-     "type": "string",
-     "description": "The order the candidate appears on the ballot for this contest.",
-     "format": "int64"
-    },
-    "party": {
-     "type": "string",
-     "description": "The full name of the party the candidate is a member of."
-    },
-    "phone": {
-     "type": "string",
-     "description": "The voice phone number for the candidate's campaign office."
-    },
-    "photoUrl": {
-     "type": "string",
-     "description": "A URL for a photo of the candidate."
-    }
-   }
-  },
-  "Channel": {
-   "id": "Channel",
-   "type": "object",
-   "description": "A social media or web channel for a candidate.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "The unique public identifier for the candidate's channel."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of channel. The following is a list of types of channels, but is not exhaustive. More channel types may be added at a later time. One of: GooglePlus, YouTube, Facebook, Twitter"
-    }
-   }
-  },
-  "Contest": {
-   "id": "Contest",
-   "type": "object",
-   "description": "Information about a contest that appears on a voter's ballot.",
-   "properties": {
-    "ballotPlacement": {
-     "type": "string",
-     "description": "A number specifying the position of this contest on the voter's ballot.",
-     "format": "int64"
-    },
-    "candidates": {
-     "type": "array",
-     "description": "The candidate choices for this contest.",
-     "items": {
-      "$ref": "Candidate"
-     }
-    },
-    "district": {
-     "$ref": "ElectoralDistrict",
-     "description": "Information about the electoral district that this contest is in."
-    },
-    "electorateSpecifications": {
-     "type": "string",
-     "description": "A description of any additional eligibility requirements for voting in this contest."
-    },
-    "id": {
-     "type": "string",
-     "description": "An ID for this object. IDs may change in future requests and should not be cached. Access to this field requires special access that can be requested from the Request more link on the Quotas page."
-    },
-    "level": {
-     "type": "string",
-     "description": "The level of office for this contest. One of: federal, state, county, city, other"
-    },
-    "numberElected": {
-     "type": "string",
-     "description": "The number of candidates that will be elected to office in this contest.",
-     "format": "int64"
-    },
-    "numberVotingFor": {
-     "type": "string",
-     "description": "The number of candidates that a voter may vote for in this contest.",
-     "format": "int64"
-    },
-    "office": {
-     "type": "string",
-     "description": "The name of the office for this contest."
-    },
-    "primaryParty": {
-     "type": "string",
-     "description": "If this is a partisan election, the name of the party it is for."
-    },
-    "referendumSubtitle": {
-     "type": "string",
-     "description": "A brief description of the referendum. This field is only populated for contests of type 'Referendum'."
-    },
-    "referendumTitle": {
-     "type": "string",
-     "description": "The title of the referendum (e.g. 'Proposition 42'). This field is only populated for contests of type 'Referendum'."
-    },
-    "referendumUrl": {
-     "type": "string",
-     "description": "A link to the referendum. This field is only populated for contests of type 'Referendum'."
-    },
-    "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"
-     }
-    },
-    "special": {
-     "type": "string",
-     "description": "\"Yes\" or \"No\" depending on whether this a contest being held outside the normal election cycle."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of contest. Usually this will be 'General', 'Primary', or 'Run-off' for contests with candidates. For referenda this will be 'Referendum'."
-    }
-   }
-  },
-  "DivisionSearchResponse": {
-   "id": "DivisionSearchResponse",
-   "type": "object",
-   "description": "The result of a division search query.",
-   "properties": {
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#divisionSearchResponse\".",
-     "default": "civicinfo#divisionSearchResponse"
-    },
-    "results": {
-     "type": "array",
-     "items": {
-      "$ref": "DivisionSearchResult"
-     }
-    },
-    "status": {
-     "type": "string",
-     "description": "The result of the request. One of: success, addressUnparseable, noAddressParameter, internalLookupFailure"
-    }
-   }
-  },
-  "DivisionSearchResult": {
-   "id": "DivisionSearchResult",
-   "type": "object",
-   "description": "Represents a political geographic division that matches the requested query.",
-   "properties": {
-    "aliases": {
-     "type": "array",
-     "description": "Other Open Civic Data identifiers that refer to the same division -- for example, those that refer to other political divisions whose boundaries are defined to be coterminous with this one. For example, ocd-division/country:us/state:wy will include an alias of ocd-division/country:us/state:wy/cd:1, since Wyoming has only one Congressional district.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the division."
-    },
-    "ocdId": {
-     "type": "string",
-     "description": "The unique Open Civic Data identifier for this division."
-    }
-   }
-  },
-  "Election": {
-   "id": "Election",
-   "type": "object",
-   "description": "Information about the election that was queried.",
-   "properties": {
-    "electionDay": {
-     "type": "string",
-     "description": "Day of the election in YYYY-MM-DD format."
-    },
-    "id": {
-     "type": "string",
-     "description": "The unique ID of this election.",
-     "format": "int64"
-    },
-    "name": {
-     "type": "string",
-     "description": "A displayable name for the election."
-    }
-   }
-  },
-  "ElectionOfficial": {
-   "id": "ElectionOfficial",
-   "type": "object",
-   "description": "Information about individual election officials.",
-   "properties": {
-    "emailAddress": {
-     "type": "string",
-     "description": "The email address of the election official."
-    },
-    "faxNumber": {
-     "type": "string",
-     "description": "The fax number of the election official."
-    },
-    "name": {
-     "type": "string",
-     "description": "The full name of the election official."
-    },
-    "officePhoneNumber": {
-     "type": "string",
-     "description": "The office phone number of the election official."
-    },
-    "title": {
-     "type": "string",
-     "description": "The title of the election official."
-    }
-   }
-  },
-  "ElectionsQueryResponse": {
-   "id": "ElectionsQueryResponse",
-   "type": "object",
-   "description": "The list of elections available for this version of the API.",
-   "properties": {
-    "elections": {
-     "type": "array",
-     "description": "A list of available elections",
-     "items": {
-      "$ref": "Election"
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#electionsQueryResponse\".",
-     "default": "civicinfo#electionsQueryResponse"
-    }
-   }
-  },
-  "ElectoralDistrict": {
-   "id": "ElectoralDistrict",
-   "type": "object",
-   "description": "Describes the geographic scope of a contest.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "An identifier for this district, relative to its scope. For example, the 34th State Senate district would have id \"34\" and a scope of stateUpper."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the district."
-    },
-    "scope": {
-     "type": "string",
-     "description": "The geographic scope of this district. If unspecified the district's geography is not known. One of: national, statewide, congressional, stateUpper, stateLower, countywide, judicial, schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward, special"
-    }
-   }
-  },
-  "GeographicDivision": {
-   "id": "GeographicDivision",
-   "type": "object",
-   "description": "Describes a political geography.",
-   "properties": {
-    "alsoKnownAs": {
-     "type": "array",
-     "description": "Any other valid OCD IDs that refer to the same division.\n\nBecause OCD IDs are meant to be human-readable and at least somewhat predictable, there are occasionally several identifiers for a single division. These identifiers are defined to be equivalent to one another, and one is always indicated as the primary identifier. The primary identifier will be returned in ocd_id above, and any other equivalent valid identifiers will be returned in this list.\n\nFor example, if this division's OCD ID is ocd-division/country:us/district:dc, this will contain ocd-division/country:us/state:dc.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the division."
-    },
-    "officeIds": {
-     "type": "array",
-     "description": "List of keys in the offices object, one for each office elected from this division. Will only be present if includeOffices was true (or absent) in the request.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "scope": {
-     "type": "string",
-     "description": "The geographic scope of the division. If unspecified, the division's geography is not known. One of: national, statewide, congressional, stateUpper, stateLower, countywide, judicial, schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward, special"
-    }
-   }
-  },
-  "Office": {
-   "id": "Office",
-   "type": "object",
-   "description": "Information about an Office held by one or more Officials.",
-   "properties": {
-    "divisionId": {
-     "type": "string",
-     "description": "The OCD ID of the division with which this office is associated."
-    },
-    "level": {
-     "type": "string",
-     "description": "The level of this elected office. One of: federal, state, county, city, other"
-    },
-    "name": {
-     "type": "string",
-     "description": "The human-readable name of the office."
-    },
-    "officialIds": {
-     "type": "array",
-     "description": "List of keys in the officials object of people who presently hold this office.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "sources": {
-     "type": "array",
-     "description": "A list of sources for this office. 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 person 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"
-     }
-    },
-    "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",
-   "description": "A location where a voter can vote. This may be an early vote site, an election day voting location, or a drop off location for a completed ballot.",
-   "properties": {
-    "address": {
-     "$ref": "SimpleAddressType",
-     "description": "The address of the location."
-    },
-    "endDate": {
-     "type": "string",
-     "description": "The last date that this early vote site or drop off location may be used. This field is not populated for polling locations."
-    },
-    "id": {
-     "type": "string",
-     "description": "An ID for this object. IDs may change in future requests and should not be cached. Access to this field requires special access that can be requested from the Request more link on the Quotas page."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the early vote site or drop off location. This field is not populated for polling locations."
-    },
-    "notes": {
-     "type": "string",
-     "description": "Notes about this location (e.g. accessibility ramp or entrance to use)."
-    },
-    "pollingHours": {
-     "type": "string",
-     "description": "A description of when this location is open."
-    },
-    "sources": {
-     "type": "array",
-     "description": "A list of sources for this location. If multiple sources are listed the data has been aggregated from those sources.",
-     "items": {
-      "$ref": "Source"
-     }
-    },
-    "startDate": {
-     "type": "string",
-     "description": "The first date that this early vote site or drop off location may be used. This field is not populated for polling locations."
-    },
-    "voterServices": {
-     "type": "string",
-     "description": "The services provided by this early vote site or drop off location. This field is not populated for polling locations."
-    }
-   }
-  },
-  "RepresentativeInfoRequest": {
-   "id": "RepresentativeInfoRequest",
-   "type": "object",
-   "description": "A request for political geography and representative information for an address.",
-   "properties": {
-    "address": {
-     "type": "string",
-     "description": "The address to look up. May only be specified if the field ocdId is not given in the URL."
-    }
-   }
-  },
-  "RepresentativeInfoResponse": {
-   "id": "RepresentativeInfoResponse",
-   "type": "object",
-   "description": "The result of a representative info lookup query.",
-   "properties": {
-    "divisions": {
-     "type": "object",
-     "description": "Political geographic divisions that contain the requested address.",
-     "additionalProperties": {
-      "$ref": "GeographicDivision",
-      "description": "The unique Open Civic Data identifier for this division."
-     }
-    },
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#representativeInfoResponse\".",
-     "default": "civicinfo#representativeInfoResponse"
-    },
-    "normalizedInput": {
-     "$ref": "SimpleAddressType",
-     "description": "The normalized version of the requested address"
-    },
-    "offices": {
-     "type": "object",
-     "description": "Elected offices referenced by the divisions listed above. Will only be present if includeOffices was true in the request.",
-     "additionalProperties": {
-      "$ref": "Office",
-      "description": "A unique identifier for this office, within the context of this request. Identifiers are *not* long-lived: the same office may get different IDs on different requests."
-     }
-    },
-    "officials": {
-     "type": "object",
-     "description": "Officials holding the offices listed above. Will only be present if includeOffices was true in the request.",
-     "additionalProperties": {
-      "$ref": "Official",
-      "description": "A unique identifier for this official, within the context of this request. Identifiers are *not* long-lived: the same official may get different IDs on different requests."
-     }
-    },
-    "status": {
-     "type": "string",
-     "description": "The result of the request. One of: success, noStreetSegmentFound, addressUnparseable, noAddressParameter, multipleStreetSegmentsFound, electionOver, electionUnknown, internalLookupFailure, RequestedBothAddressAndOcdId"
-    }
-   }
-  },
-  "SimpleAddressType": {
-   "id": "SimpleAddressType",
-   "type": "object",
-   "description": "A simple representation of an address.",
-   "properties": {
-    "city": {
-     "type": "string",
-     "description": "The city or town for the address."
-    },
-    "line1": {
-     "type": "string",
-     "description": "The street name and number of this address."
-    },
-    "line2": {
-     "type": "string",
-     "description": "The second line the address, if needed."
-    },
-    "line3": {
-     "type": "string",
-     "description": "The third line of the address, if needed."
-    },
-    "locationName": {
-     "type": "string",
-     "description": "The name of the location."
-    },
-    "state": {
-     "type": "string",
-     "description": "The US two letter state abbreviation of the address."
-    },
-    "zip": {
-     "type": "string",
-     "description": "The US Postal Zip Code of the address."
-    }
-   }
-  },
-  "Source": {
-   "id": "Source",
-   "type": "object",
-   "description": "Contains information about the data source for the element containing it.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The name of the data source."
-    },
-    "official": {
-     "type": "boolean",
-     "description": "Whether this data comes from an official government source."
-    }
-   }
-  },
-  "VoterInfoRequest": {
-   "id": "VoterInfoRequest",
-   "type": "object",
-   "description": "A request for information about a voter.",
-   "properties": {
-    "address": {
-     "type": "string",
-     "description": "The registered address of the voter to look up."
-    }
-   }
-  },
-  "VoterInfoResponse": {
-   "id": "VoterInfoResponse",
-   "type": "object",
-   "description": "The result of a voter info lookup query.",
-   "properties": {
-    "contests": {
-     "type": "array",
-     "description": "Contests that will appear on the voter's ballot.",
-     "items": {
-      "$ref": "Contest"
-     }
-    },
-    "dropOffLocations": {
-     "type": "array",
-     "description": "Locations where a voter is eligible to drop off a completed ballot. The voter must have received and completed a ballot prior to arriving at the location. The location may not have ballots available on the premises. These locations could be open on or before election day as indicated in the pollingHours field.",
-     "items": {
-      "$ref": "PollingLocation"
-     }
-    },
-    "earlyVoteSites": {
-     "type": "array",
-     "description": "Locations where the voter is eligible to vote early, prior to election day.",
-     "items": {
-      "$ref": "PollingLocation"
-     }
-    },
-    "election": {
-     "$ref": "Election",
-     "description": "The election that was queried."
-    },
-    "kind": {
-     "type": "string",
-     "description": "Identifies what kind of resource this is. Value: the fixed string \"civicinfo#voterInfoResponse\".",
-     "default": "civicinfo#voterInfoResponse"
-    },
-    "normalizedInput": {
-     "$ref": "SimpleAddressType",
-     "description": "The normalized version of the requested address"
-    },
-    "pollingLocations": {
-     "type": "array",
-     "description": "Locations where the voter is eligible to vote on election day.",
-     "items": {
-      "$ref": "PollingLocation"
-     }
-    },
-    "precinctId": {
-     "type": "string"
-    },
-    "state": {
-     "type": "array",
-     "description": "Local Election Information for the state that the voter votes in. For the US, there will only be one element in this array.",
-     "items": {
-      "$ref": "AdministrationRegion"
-     }
-    },
-    "status": {
-     "type": "string",
-     "description": "The result of the request. One of: success, noStreetSegmentFound, addressUnparseable, noAddressParameter, multipleStreetSegmentsFound, electionOver, electionUnknown, internalLookupFailure"
-    }
-   }
-  }
- },
- "resources": {
-  "divisions": {
-   "methods": {
-    "search": {
-     "id": "civicinfo.divisions.search",
-     "path": "representatives/division_search",
-     "httpMethod": "GET",
-     "description": "Searches for political divisions by their natural name or OCD ID.",
-     "parameters": {
-      "query": {
-       "type": "string",
-       "description": "The search query. Queries can cover any parts of a OCD ID or a human readable division name. All words given in the query are treated as required patterns. In addition to that, most query operators of the Apache Lucene library are supported. See http://lucene.apache.org/core/2_9_4/queryparsersyntax.html",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "DivisionSearchResponse"
-     }
-    }
-   }
-  },
-  "elections": {
-   "methods": {
-    "electionQuery": {
-     "id": "civicinfo.elections.electionQuery",
-     "path": "elections",
-     "httpMethod": "GET",
-     "description": "List of available elections to query.",
-     "response": {
-      "$ref": "ElectionsQueryResponse"
-     }
-    },
-    "voterInfoQuery": {
-     "id": "civicinfo.elections.voterInfoQuery",
-     "path": "voterinfo/{electionId}/lookup",
-     "httpMethod": "POST",
-     "description": "Looks up information relevant to a voter based on the voter's registered address.",
-     "parameters": {
-      "electionId": {
-       "type": "string",
-       "description": "The unique ID of the election to look up. A list of election IDs can be obtained at https://www.googleapis.com/civicinfo/{version}/elections",
-       "required": true,
-       "format": "int64",
-       "location": "path"
-      },
-      "officialOnly": {
-       "type": "boolean",
-       "description": "If set to true, only data from official state sources will be returned.",
-       "default": "false",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "electionId"
-     ],
-     "request": {
-      "$ref": "VoterInfoRequest"
-     },
-     "response": {
-      "$ref": "VoterInfoResponse"
-     }
-    }
-   }
-  },
-  "representatives": {
-   "methods": {
-    "representativeInfoQuery": {
-     "id": "civicinfo.representatives.representativeInfoQuery",
-     "path": "representatives/lookup",
-     "httpMethod": "POST",
-     "description": "Looks up political geography and representative information based on an address or Open Civic Data division identifier.",
-     "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"
-      },
-      "ocdId": {
-       "type": "string",
-       "description": "The division to look up. May only be specified if the address field is not given in the request body.",
-       "location": "query"
-      },
-      "recursive": {
-       "type": "boolean",
-       "description": "When ocd_id is supplied, return all divisions which are hierarchically nested within the queried division. For example, if querying ocd-division/country:us/district:dc, this would also return all DC's wards and ANCs.",
-       "default": "false",
-       "location": "query"
-      }
-     },
-     "request": {
-      "$ref": "RepresentativeInfoRequest"
-     },
-     "response": {
-      "$ref": "RepresentativeInfoResponse"
-     }
-    }
-   }
-  }
- }
-}
diff --git a/civicinfo/v1/civicinfo-gen.go b/civicinfo/v1/civicinfo-gen.go
deleted file mode 100644
index b9a3f27..0000000
--- a/civicinfo/v1/civicinfo-gen.go
+++ /dev/null
@@ -1,946 +0,0 @@
-// Package civicinfo provides access to the Google Civic Information API.
-//
-// See https://developers.google.com/civic-information
-//
-// Usage example:
-//
-//   import "google.golang.org/api/civicinfo/v1"
-//   ...
-//   civicinfoService, err := civicinfo.New(oauthHttpClient)
-package civicinfo
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-	"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
-var _ = context.Background
-
-const apiId = "civicinfo:v1"
-const apiName = "civicinfo"
-const apiVersion = "v1"
-const basePath = "https://www.googleapis.com/civicinfo/v1/"
-
-func New(client *http.Client) (*Service, error) {
-	if client == nil {
-		return nil, errors.New("client is nil")
-	}
-	s := &Service{client: client, BasePath: basePath}
-	s.Divisions = NewDivisionsService(s)
-	s.Elections = NewElectionsService(s)
-	s.Representatives = NewRepresentativesService(s)
-	return s, nil
-}
-
-type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
-
-	Divisions *DivisionsService
-
-	Elections *ElectionsService
-
-	Representatives *RepresentativesService
-}
-
-func NewDivisionsService(s *Service) *DivisionsService {
-	rs := &DivisionsService{s: s}
-	return rs
-}
-
-type DivisionsService struct {
-	s *Service
-}
-
-func NewElectionsService(s *Service) *ElectionsService {
-	rs := &ElectionsService{s: s}
-	return rs
-}
-
-type ElectionsService struct {
-	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.
-	ElectionAdministrationBody *AdministrativeBody `json:"electionAdministrationBody,omitempty"`
-
-	// Id: An ID for this object. IDs may change in future requests and
-	// should not be cached. Access to this field requires special access
-	// that can be requested from the Request more link on the Quotas page.
-	Id string `json:"id,omitempty"`
-
-	// Local_jurisdiction: The city or county that provides election
-	// information for this voter. This object can have the same elements as
-	// state.
-	Local_jurisdiction *AdministrationRegion `json:"local_jurisdiction,omitempty"`
-
-	// Name: The name of the jurisdiction.
-	Name string `json:"name,omitempty"`
-
-	// Sources: A list of sources for this area. If multiple sources are
-	// listed the data has been aggregated from those sources.
-	Sources []*Source `json:"sources,omitempty"`
-}
-
-type AdministrativeBody struct {
-	// AbsenteeVotingInfoUrl: A URL provided by this administrative body for
-	// information on absentee voting.
-	AbsenteeVotingInfoUrl string `json:"absenteeVotingInfoUrl,omitempty"`
-
-	// BallotInfoUrl: A URL provided by this administrative body to give
-	// contest information to the voter.
-	BallotInfoUrl string `json:"ballotInfoUrl,omitempty"`
-
-	// CorrespondenceAddress: The mailing address of this administrative
-	// body.
-	CorrespondenceAddress *SimpleAddressType `json:"correspondenceAddress,omitempty"`
-
-	// ElectionInfoUrl: A URL provided by this administrative body for
-	// looking up general election information.
-	ElectionInfoUrl string `json:"electionInfoUrl,omitempty"`
-
-	// ElectionOfficials: The election officials for this election
-	// administrative body.
-	ElectionOfficials []*ElectionOfficial `json:"electionOfficials,omitempty"`
-
-	// ElectionRegistrationConfirmationUrl: A URL provided by this
-	// administrative body for confirming that the voter is registered to
-	// vote.
-	ElectionRegistrationConfirmationUrl string `json:"electionRegistrationConfirmationUrl,omitempty"`
-
-	// ElectionRegistrationUrl: A URL provided by this administrative body
-	// for looking up how to register to vote.
-	ElectionRegistrationUrl string `json:"electionRegistrationUrl,omitempty"`
-
-	// ElectionRulesUrl: A URL provided by this administrative body
-	// describing election rules to the voter.
-	ElectionRulesUrl string `json:"electionRulesUrl,omitempty"`
-
-	// HoursOfOperation: A description of the hours of operation for this
-	// administrative body.
-	HoursOfOperation string `json:"hoursOfOperation,omitempty"`
-
-	// Name: The name of this election administrative body.
-	Name string `json:"name,omitempty"`
-
-	// PhysicalAddress: The physical address of this administrative body.
-	PhysicalAddress *SimpleAddressType `json:"physicalAddress,omitempty"`
-
-	// Voter_services: A description of the services this administrative
-	// body may provide.
-	Voter_services []string `json:"voter_services,omitempty"`
-
-	// VotingLocationFinderUrl: A URL provided by this administrative body
-	// for looking up where to vote.
-	VotingLocationFinderUrl string `json:"votingLocationFinderUrl,omitempty"`
-}
-
-type Candidate struct {
-	// CandidateUrl: The URL for the candidate's campaign web site.
-	CandidateUrl string `json:"candidateUrl,omitempty"`
-
-	// Channels: A list of known (social) media channels for this candidate.
-	Channels []*Channel `json:"channels,omitempty"`
-
-	// Email: The email address for the candidate's campaign.
-	Email string `json:"email,omitempty"`
-
-	// Name: The candidate's name.
-	Name string `json:"name,omitempty"`
-
-	// OrderOnBallot: The order the candidate appears on the ballot for this
-	// contest.
-	OrderOnBallot int64 `json:"orderOnBallot,omitempty,string"`
-
-	// Party: The full name of the party the candidate is a member of.
-	Party string `json:"party,omitempty"`
-
-	// Phone: The voice phone number for the candidate's campaign office.
-	Phone string `json:"phone,omitempty"`
-
-	// PhotoUrl: A URL for a photo of the candidate.
-	PhotoUrl string `json:"photoUrl,omitempty"`
-}
-
-type Channel struct {
-	// Id: The unique public identifier for the candidate's channel.
-	Id string `json:"id,omitempty"`
-
-	// Type: The type of channel. The following is a list of types of
-	// channels, but is not exhaustive. More channel types may be added at a
-	// later time. One of: GooglePlus, YouTube, Facebook, Twitter
-	Type string `json:"type,omitempty"`
-}
-
-type Contest struct {
-	// BallotPlacement: A number specifying the position of this contest on
-	// the voter's ballot.
-	BallotPlacement int64 `json:"ballotPlacement,omitempty,string"`
-
-	// Candidates: The candidate choices for this contest.
-	Candidates []*Candidate `json:"candidates,omitempty"`
-
-	// District: Information about the electoral district that this contest
-	// is in.
-	District *ElectoralDistrict `json:"district,omitempty"`
-
-	// ElectorateSpecifications: A description of any additional eligibility
-	// requirements for voting in this contest.
-	ElectorateSpecifications string `json:"electorateSpecifications,omitempty"`
-
-	// Id: An ID for this object. IDs may change in future requests and
-	// should not be cached. Access to this field requires special access
-	// that can be requested from the Request more link on the Quotas page.
-	Id string `json:"id,omitempty"`
-
-	// Level: The level of office for this contest. One of: federal, state,
-	// county, city, other
-	Level string `json:"level,omitempty"`
-
-	// NumberElected: The number of candidates that will be elected to
-	// office in this contest.
-	NumberElected int64 `json:"numberElected,omitempty,string"`
-
-	// NumberVotingFor: The number of candidates that a voter may vote for
-	// in this contest.
-	NumberVotingFor int64 `json:"numberVotingFor,omitempty,string"`
-
-	// Office: The name of the office for this contest.
-	Office string `json:"office,omitempty"`
-
-	// PrimaryParty: If this is a partisan election, the name of the party
-	// it is for.
-	PrimaryParty string `json:"primaryParty,omitempty"`
-
-	// ReferendumSubtitle: A brief description of the referendum. This field
-	// is only populated for contests of type 'Referendum'.
-	ReferendumSubtitle string `json:"referendumSubtitle,omitempty"`
-
-	// ReferendumTitle: The title of the referendum (e.g. 'Proposition 42').
-	// This field is only populated for contests of type 'Referendum'.
-	ReferendumTitle string `json:"referendumTitle,omitempty"`
-
-	// ReferendumUrl: A link to the referendum. This field is only populated
-	// for contests of type 'Referendum'.
-	ReferendumUrl string `json:"referendumUrl,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"`
-
-	// Special: "Yes" or "No" depending on whether this a contest being held
-	// outside the normal election cycle.
-	Special string `json:"special,omitempty"`
-
-	// Type: The type of contest. Usually this will be 'General', 'Primary',
-	// or 'Run-off' for contests with candidates. For referenda this will be
-	// 'Referendum'.
-	Type string `json:"type,omitempty"`
-}
-
-type DivisionSearchResponse struct {
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "civicinfo#divisionSearchResponse".
-	Kind string `json:"kind,omitempty"`
-
-	Results []*DivisionSearchResult `json:"results,omitempty"`
-
-	// Status: The result of the request. One of: success,
-	// addressUnparseable, noAddressParameter, internalLookupFailure
-	Status string `json:"status,omitempty"`
-}
-
-type DivisionSearchResult struct {
-	// Aliases: Other Open Civic Data identifiers that refer to the same
-	// division -- for example, those that refer to other political
-	// divisions whose boundaries are defined to be coterminous with this
-	// one. For example, ocd-division/country:us/state:wy will include an
-	// alias of ocd-division/country:us/state:wy/cd:1, since Wyoming has
-	// only one Congressional district.
-	Aliases []string `json:"aliases,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"`
-}
-
-type Election struct {
-	// ElectionDay: Day of the election in YYYY-MM-DD format.
-	ElectionDay string `json:"electionDay,omitempty"`
-
-	// Id: The unique ID of this election.
-	Id int64 `json:"id,omitempty,string"`
-
-	// Name: A displayable name for the election.
-	Name string `json:"name,omitempty"`
-}
-
-type ElectionOfficial struct {
-	// EmailAddress: The email address of the election official.
-	EmailAddress string `json:"emailAddress,omitempty"`
-
-	// FaxNumber: The fax number of the election official.
-	FaxNumber string `json:"faxNumber,omitempty"`
-
-	// Name: The full name of the election official.
-	Name string `json:"name,omitempty"`
-
-	// OfficePhoneNumber: The office phone number of the election official.
-	OfficePhoneNumber string `json:"officePhoneNumber,omitempty"`
-
-	// Title: The title of the election official.
-	Title string `json:"title,omitempty"`
-}
-
-type ElectionsQueryResponse struct {
-	// Elections: A list of available elections
-	Elections []*Election `json:"elections,omitempty"`
-
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "civicinfo#electionsQueryResponse".
-	Kind string `json:"kind,omitempty"`
-}
-
-type ElectoralDistrict struct {
-	// Id: An identifier for this district, relative to its scope. For
-	// example, the 34th State Senate district would have id "34" and a
-	// scope of stateUpper.
-	Id string `json:"id,omitempty"`
-
-	// Name: The name of the district.
-	Name string `json:"name,omitempty"`
-
-	// Scope: The geographic scope of this district. If unspecified the
-	// district's geography is not known. One of: national, statewide,
-	// congressional, stateUpper, stateLower, countywide, judicial,
-	// schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward,
-	// special
-	Scope string `json:"scope,omitempty"`
-}
-
-type GeographicDivision struct {
-	// AlsoKnownAs: Any other valid OCD IDs that refer to the same
-	// division.
-	//
-	// Because OCD IDs are meant to be human-readable and at
-	// least somewhat predictable, there are occasionally several
-	// identifiers for a single division. These identifiers are defined to
-	// be equivalent to one another, and one is always indicated as the
-	// primary identifier. The primary identifier will be returned in ocd_id
-	// above, and any other equivalent valid identifiers will be returned in
-	// this list.
-	//
-	// For example, if this division's OCD ID is
-	// ocd-division/country:us/district:dc, this will contain
-	// ocd-division/country:us/state:dc.
-	AlsoKnownAs []string `json:"alsoKnownAs,omitempty"`
-
-	// Name: The name of the division.
-	Name string `json:"name,omitempty"`
-
-	// OfficeIds: List of keys in the offices object, one for each office
-	// elected from this division. Will only be present if includeOffices
-	// was true (or absent) in the request.
-	OfficeIds []string `json:"officeIds,omitempty"`
-
-	// Scope: The geographic scope of the division. If unspecified, the
-	// division's geography is not known. One of: national, statewide,
-	// congressional, stateUpper, stateLower, countywide, judicial,
-	// schoolBoard, cityWide, township, countyCouncil, cityCouncil, ward,
-	// special
-	Scope string `json:"scope,omitempty"`
-}
-
-type Office struct {
-	// DivisionId: The OCD ID of the division with which this office is
-	// associated.
-	DivisionId string `json:"divisionId,omitempty"`
-
-	// Level: The level of this elected office. One of: federal, state,
-	// county, city, other
-	Level string `json:"level,omitempty"`
-
-	// Name: The human-readable name of the office.
-	Name string `json:"name,omitempty"`
-
-	// OfficialIds: List of keys in the officials object of people who
-	// presently hold this office.
-	OfficialIds []string `json:"officialIds,omitempty"`
-
-	// Sources: A list of sources for this office. 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"`
-
-	// 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"`
-
-	// EndDate: The last date that this early vote site or drop off location
-	// may be used. This field is not populated for polling locations.
-	EndDate string `json:"endDate,omitempty"`
-
-	// Id: An ID for this object. IDs may change in future requests and
-	// should not be cached. Access to this field requires special access
-	// that can be requested from the Request more link on the Quotas page.
-	Id string `json:"id,omitempty"`
-
-	// Name: The name of the early vote site or drop off location. This
-	// field is not populated for polling locations.
-	Name string `json:"name,omitempty"`
-
-	// Notes: Notes about this location (e.g. accessibility ramp or entrance
-	// to use).
-	Notes string `json:"notes,omitempty"`
-
-	// PollingHours: A description of when this location is open.
-	PollingHours string `json:"pollingHours,omitempty"`
-
-	// Sources: A list of sources for this location. If multiple sources are
-	// listed the data has been aggregated from those sources.
-	Sources []*Source `json:"sources,omitempty"`
-
-	// StartDate: The first date that this early vote site or drop off
-	// location may be used. This field is not populated for polling
-	// locations.
-	StartDate string `json:"startDate,omitempty"`
-
-	// VoterServices: The services provided by this early vote site or drop
-	// off location. This field is not populated for polling locations.
-	VoterServices string `json:"voterServices,omitempty"`
-}
-
-type RepresentativeInfoRequest struct {
-	// Address: The address to look up. May only be specified if the field
-	// ocdId is not given in the URL.
-	Address string `json:"address,omitempty"`
-}
-
-type RepresentativeInfoResponse struct {
-	// Divisions: Political geographic divisions that contain the requested
-	// address.
-	Divisions map[string]GeographicDivision `json:"divisions,omitempty"`
-
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "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 includeOffices was true in the request.
-	Offices map[string]Office `json:"offices,omitempty"`
-
-	// Officials: Officials holding the offices listed above. Will only be
-	// present if includeOffices was true in the request.
-	Officials map[string]Official `json:"officials,omitempty"`
-
-	// Status: The result of the request. One of: success,
-	// noStreetSegmentFound, addressUnparseable, noAddressParameter,
-	// multipleStreetSegmentsFound, electionOver, electionUnknown,
-	// internalLookupFailure, RequestedBothAddressAndOcdId
-	Status string `json:"status,omitempty"`
-}
-
-type SimpleAddressType struct {
-	// City: The city or town for the address.
-	City string `json:"city,omitempty"`
-
-	// Line1: The street name and number of this address.
-	Line1 string `json:"line1,omitempty"`
-
-	// Line2: The second line the address, if needed.
-	Line2 string `json:"line2,omitempty"`
-
-	// Line3: The third line of the address, if needed.
-	Line3 string `json:"line3,omitempty"`
-
-	// LocationName: The name of the location.
-	LocationName string `json:"locationName,omitempty"`
-
-	// State: The US two letter state abbreviation of the address.
-	State string `json:"state,omitempty"`
-
-	// Zip: The US Postal Zip Code of the address.
-	Zip string `json:"zip,omitempty"`
-}
-
-type Source struct {
-	// Name: The name of the data source.
-	Name string `json:"name,omitempty"`
-
-	// Official: Whether this data comes from an official government source.
-	Official bool `json:"official,omitempty"`
-}
-
-type VoterInfoRequest struct {
-	// Address: The registered address of the voter to look up.
-	Address string `json:"address,omitempty"`
-}
-
-type VoterInfoResponse struct {
-	// Contests: Contests that will appear on the voter's ballot.
-	Contests []*Contest `json:"contests,omitempty"`
-
-	// DropOffLocations: Locations where a voter is eligible to drop off a
-	// completed ballot. The voter must have received and completed a ballot
-	// prior to arriving at the location. The location may not have ballots
-	// available on the premises. These locations could be open on or before
-	// election day as indicated in the pollingHours field.
-	DropOffLocations []*PollingLocation `json:"dropOffLocations,omitempty"`
-
-	// EarlyVoteSites: Locations where the voter is eligible to vote early,
-	// prior to election day.
-	EarlyVoteSites []*PollingLocation `json:"earlyVoteSites,omitempty"`
-
-	// Election: The election that was queried.
-	Election *Election `json:"election,omitempty"`
-
-	// Kind: Identifies what kind of resource this is. Value: the fixed
-	// string "civicinfo#voterInfoResponse".
-	Kind string `json:"kind,omitempty"`
-
-	// NormalizedInput: The normalized version of the requested address
-	NormalizedInput *SimpleAddressType `json:"normalizedInput,omitempty"`
-
-	// PollingLocations: Locations where the voter is eligible to vote on
-	// election day.
-	PollingLocations []*PollingLocation `json:"pollingLocations,omitempty"`
-
-	PrecinctId string `json:"precinctId,omitempty"`
-
-	// State: Local Election Information for the state that the voter votes
-	// in. For the US, there will only be one element in this array.
-	State []*AdministrationRegion `json:"state,omitempty"`
-
-	// Status: The result of the request. One of: success,
-	// noStreetSegmentFound, addressUnparseable, noAddressParameter,
-	// multipleStreetSegmentsFound, electionOver, electionUnknown,
-	// internalLookupFailure
-	Status string `json:"status,omitempty"`
-}
-
-// method id "civicinfo.divisions.search":
-
-type DivisionsSearchCall struct {
-	s    *Service
-	opt_ map[string]interface{}
-}
-
-// Search: Searches for political divisions by their natural name or OCD
-// ID.
-func (r *DivisionsService) Search() *DivisionsSearchCall {
-	c := &DivisionsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	return c
-}
-
-// Query sets the optional parameter "query": The search query. Queries
-// can cover any parts of a OCD ID or a human readable division name.
-// All words given in the query are treated as required patterns. In
-// addition to that, most query operators of the Apache Lucene library
-// are supported. See
-// http://lucene.apache.org/core/2_9_4/queryparsersyntax.html
-func (c *DivisionsSearchCall) Query(query string) *DivisionsSearchCall {
-	c.opt_["query"] = query
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DivisionsSearchCall) Fields(s ...googleapi.Field) *DivisionsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DivisionsSearchCall) Do() (*DivisionSearchResponse, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["query"]; ok {
-		params.Set("query", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "representatives/division_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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *DivisionSearchResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Searches for political divisions by their natural name or OCD ID.",
-	//   "httpMethod": "GET",
-	//   "id": "civicinfo.divisions.search",
-	//   "parameters": {
-	//     "query": {
-	//       "description": "The search query. Queries can cover any parts of a OCD ID or a human readable division name. All words given in the query are treated as required patterns. In addition to that, most query operators of the Apache Lucene library are supported. See http://lucene.apache.org/core/2_9_4/queryparsersyntax.html",
-	//       "location": "query",
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "representatives/division_search",
-	//   "response": {
-	//     "$ref": "DivisionSearchResponse"
-	//   }
-	// }
-
-}
-
-// method id "civicinfo.elections.electionQuery":
-
-type ElectionsElectionQueryCall struct {
-	s    *Service
-	opt_ map[string]interface{}
-}
-
-// ElectionQuery: List of available elections to query.
-func (r *ElectionsService) ElectionQuery() *ElectionsElectionQueryCall {
-	c := &ElectionsElectionQueryCall{s: r.s, opt_: make(map[string]interface{})}
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ElectionsElectionQueryCall) Fields(s ...googleapi.Field) *ElectionsElectionQueryCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ElectionsElectionQueryCall) Do() (*ElectionsQueryResponse, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ElectionsQueryResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "List of available elections to query.",
-	//   "httpMethod": "GET",
-	//   "id": "civicinfo.elections.electionQuery",
-	//   "path": "elections",
-	//   "response": {
-	//     "$ref": "ElectionsQueryResponse"
-	//   }
-	// }
-
-}
-
-// method id "civicinfo.elections.voterInfoQuery":
-
-type ElectionsVoterInfoQueryCall struct {
-	s                *Service
-	electionId       int64
-	voterinforequest *VoterInfoRequest
-	opt_             map[string]interface{}
-}
-
-// VoterInfoQuery: Looks up information relevant to a voter based on the
-// voter's registered address.
-func (r *ElectionsService) VoterInfoQuery(electionId int64, voterinforequest *VoterInfoRequest) *ElectionsVoterInfoQueryCall {
-	c := &ElectionsVoterInfoQueryCall{s: r.s, opt_: make(map[string]interface{})}
-	c.electionId = electionId
-	c.voterinforequest = voterinforequest
-	return c
-}
-
-// OfficialOnly sets the optional parameter "officialOnly": If set to
-// true, only data from official state sources will be returned.
-func (c *ElectionsVoterInfoQueryCall) OfficialOnly(officialOnly bool) *ElectionsVoterInfoQueryCall {
-	c.opt_["officialOnly"] = officialOnly
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ElectionsVoterInfoQueryCall) Fields(s ...googleapi.Field) *ElectionsVoterInfoQueryCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ElectionsVoterInfoQueryCall) Do() (*VoterInfoResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.voterinforequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["officialOnly"]; ok {
-		params.Set("officialOnly", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "voterinfo/{electionId}/lookup")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"electionId": strconv.FormatInt(c.electionId, 10),
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *VoterInfoResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Looks up information relevant to a voter based on the voter's registered address.",
-	//   "httpMethod": "POST",
-	//   "id": "civicinfo.elections.voterInfoQuery",
-	//   "parameterOrder": [
-	//     "electionId"
-	//   ],
-	//   "parameters": {
-	//     "electionId": {
-	//       "description": "The unique ID of the election to look up. A list of election IDs can be obtained at https://www.googleapis.com/civicinfo/{version}/elections",
-	//       "format": "int64",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "officialOnly": {
-	//       "default": "false",
-	//       "description": "If set to true, only data from official state sources will be returned.",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     }
-	//   },
-	//   "path": "voterinfo/{electionId}/lookup",
-	//   "request": {
-	//     "$ref": "VoterInfoRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "VoterInfoResponse"
-	//   }
-	// }
-
-}
-
-// method id "civicinfo.representatives.representativeInfoQuery":
-
-type RepresentativesRepresentativeInfoQueryCall struct {
-	s                         *Service
-	representativeinforequest *RepresentativeInfoRequest
-	opt_                      map[string]interface{}
-}
-
-// RepresentativeInfoQuery: Looks up political geography and
-// representative information based on an address or Open Civic Data
-// division identifier.
-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
-}
-
-// OcdId sets the optional parameter "ocdId": The division to look up.
-// May only be specified if the address field is not given in the
-// request body.
-func (c *RepresentativesRepresentativeInfoQueryCall) OcdId(ocdId string) *RepresentativesRepresentativeInfoQueryCall {
-	c.opt_["ocdId"] = ocdId
-	return c
-}
-
-// Recursive sets the optional parameter "recursive": When ocd_id is
-// supplied, return all divisions which are hierarchically nested within
-// the queried division. For example, if querying
-// ocd-division/country:us/district:dc, this would also return all DC's
-// wards and ANCs.
-func (c *RepresentativesRepresentativeInfoQueryCall) Recursive(recursive bool) *RepresentativesRepresentativeInfoQueryCall {
-	c.opt_["recursive"] = recursive
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *RepresentativesRepresentativeInfoQueryCall) Fields(s ...googleapi.Field) *RepresentativesRepresentativeInfoQueryCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	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))
-	}
-	if v, ok := c.opt_["ocdId"]; ok {
-		params.Set("ocdId", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["recursive"]; ok {
-		params.Set("recursive", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *RepresentativeInfoResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Looks up political geography and representative information based on an address or Open Civic Data division identifier.",
-	//   "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"
-	//     },
-	//     "ocdId": {
-	//       "description": "The division to look up. May only be specified if the address field is not given in the request body.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "recursive": {
-	//       "default": "false",
-	//       "description": "When ocd_id is supplied, return all divisions which are hierarchically nested within the queried division. For example, if querying ocd-division/country:us/district:dc, this would also return all DC's wards and ANCs.",
-	//       "location": "query",
-	//       "type": "boolean"
-	//     }
-	//   },
-	//   "path": "representatives/lookup",
-	//   "request": {
-	//     "$ref": "RepresentativeInfoRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "RepresentativeInfoResponse"
-	//   }
-	// }
-
-}
diff --git a/civicinfo/v2/civicinfo-gen.go b/civicinfo/v2/civicinfo-gen.go
index 6950330..44eb0ff 100644
--- a/civicinfo/v2/civicinfo-gen.go
+++ b/civicinfo/v2/civicinfo-gen.go
@@ -53,8 +53,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Divisions *DivisionsService
 
@@ -63,6 +64,13 @@
 	Representatives *RepresentativesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDivisionsService(s *Service) *DivisionsService {
 	rs := &DivisionsService{s: s}
 	return rs
@@ -628,7 +636,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -693,7 +701,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -776,7 +784,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -904,7 +912,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1077,7 +1085,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"ocdId": c.ocdId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/cloudlatencytest/v2/cloudlatencytest-gen.go b/cloudlatencytest/v2/cloudlatencytest-gen.go
index 1cc84cb..982497c 100644
--- a/cloudlatencytest/v2/cloudlatencytest-gen.go
+++ b/cloudlatencytest/v2/cloudlatencytest-gen.go
@@ -55,12 +55,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Statscollection *StatscollectionService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewStatscollectionService(s *Service) *StatscollectionService {
 	rs := &StatscollectionService{s: s}
 	return rs
@@ -150,7 +158,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -222,7 +230,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/cloudmonitoring/v2beta2/cloudmonitoring-gen.go b/cloudmonitoring/v2beta2/cloudmonitoring-gen.go
index b912ffb..6e7111f 100644
--- a/cloudmonitoring/v2beta2/cloudmonitoring-gen.go
+++ b/cloudmonitoring/v2beta2/cloudmonitoring-gen.go
@@ -60,8 +60,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	MetricDescriptors *MetricDescriptorsService
 
@@ -70,6 +71,13 @@
 	TimeseriesDescriptors *TimeseriesDescriptorsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewMetricDescriptorsService(s *Service) *MetricDescriptorsService {
 	rs := &MetricDescriptorsService{s: s}
 	return rs
@@ -396,7 +404,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -478,7 +486,7 @@
 		"project": c.project,
 		"metric":  c.metric,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -604,7 +612,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -820,7 +828,7 @@
 		"project": c.project,
 		"metric":  c.metric,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -983,7 +991,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1181,7 +1189,7 @@
 		"project": c.project,
 		"metric":  c.metric,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/compute/v1/compute-api.json b/compute/v1/compute-api.json
index 33eb6a7..7f4d58e 100644
--- a/compute/v1/compute-api.json
+++ b/compute/v1/compute-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/WbG3AXMWFf0w_iF5R9bFvZ0uaXw\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/O_5j_7aKimaeibrW3NmYraO3Ajs\"",
  "discoveryVersion": "v1",
  "id": "compute:v1",
  "name": "compute",
  "version": "v1",
- "revision": "20150104",
+ "revision": "20150302",
  "title": "Compute Engine API",
  "description": "API for the Google Compute Engine service.",
  "ownerDomain": "google.com",
@@ -98,7 +98,7 @@
    "properties": {
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#accessConfig for access configs.",
      "default": "compute#accessConfig"
     },
     "name": {
@@ -107,11 +107,11 @@
     },
     "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."
+     "description": "An external IP address associated with this instance. Specify an unused static external IP address available to the project or leave this field undefined to use an IP from a shared ephemeral IP address pool. If you specify a static external IP address, it must live in the same region as the zone of the instance."
     },
     "type": {
      "type": "string",
-     "description": "Type of configuration. Must be set to \"ONE_TO_ONE_NAT\". This configures port-for-port NAT to the internet.",
+     "description": "The type of configuration. The default and only option is ONE_TO_ONE_NAT.",
      "default": "ONE_TO_ONE_NAT",
      "enum": [
       "ONE_TO_ONE_NAT"
@@ -129,11 +129,11 @@
    "properties": {
     "address": {
      "type": "string",
-     "description": "The IP address represented by this resource."
+     "description": "The static external IP address represented by this resource."
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "description": {
      "type": "string",
@@ -141,17 +141,17 @@
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#address for addresses.",
      "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.",
+     "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. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.",
      "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
      "annotations": {
       "required": [
@@ -161,15 +161,15 @@
     },
     "region": {
      "type": "string",
-     "description": "URL of the region where the regional address resides (output only). This field is not applicable to global addresses."
+     "description": "[Output Only] URL of the region where the regional address resides. This field is not applicable to global addresses."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     },
     "status": {
      "type": "string",
-     "description": "The status of the address (output only).",
+     "description": "[Output Only] The status of the address, which can be either IN_USE or RESERVED. An address that is RESERVED is currently reserved and available to use. An IN_USE address is currently being used by another resource and is not available.",
      "enum": [
       "IN_USE",
       "RESERVED"
@@ -181,7 +181,7 @@
     },
     "users": {
      "type": "array",
-     "description": "The resources that are using this address resource.",
+     "description": "[Output Only] The URLs of the resources that are using this address.",
      "items": {
       "type": "string"
      }
@@ -194,28 +194,28 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "object",
-     "description": "A map of scoped address lists.",
+     "description": "[Output Only] A map of scoped address lists.",
      "additionalProperties": {
       "$ref": "AddressesScopedList",
-      "description": "Name of the scope containing this set of addresses."
+      "description": "[Output Only] Name of the scope containing this set of addresses."
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#addressAggregatedList for aggregated lists of addresses.",
      "default": "compute#addressAggregatedList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
@@ -226,27 +226,27 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of Address resources.",
+     "description": "[Output Only] A list of Address resources.",
      "items": {
       "$ref": "Address"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#addressList for lists of addresses.",
      "default": "compute#addressList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     }
    }
   },
@@ -256,18 +256,18 @@
    "properties": {
     "addresses": {
      "type": "array",
-     "description": "List of addresses contained in this scope.",
+     "description": "[Output Only] 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.",
+     "description": "[Output Only] 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.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -280,6 +280,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -294,29 +295,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -329,24 +331,24 @@
    "properties": {
     "autoDelete": {
      "type": "boolean",
-     "description": "Whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance)."
+     "description": "Specifies whether the disk will be auto-deleted when the instance is deleted (but not when the disk is detached from the instance)."
     },
     "boot": {
      "type": "boolean",
-     "description": "Indicates that this is a boot disk. VM will use the first partition of the disk for its root filesystem."
+     "description": "Indicates that this is a boot disk. The virtual machine 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."
+     "description": "Specifies a unique device name of your choice that is reflected into the /dev/ tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance.\n\nIf not specified, the server chooses a default device name to apply to this disk, in the form persistent-disks-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks."
     },
     "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).",
+     "description": "Assigns a zero-based index to this disk, where 0 is reserved for the boot disk. For example, if you have many disks attached to an instance, each disk would have a unique index number. If not specified, the server will choose an appropriate value.",
      "format": "int32"
     },
     "initializeParams": {
      "$ref": "AttachedDiskInitializeParams",
-     "description": "Initialization parameters."
+     "description": "[Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance.\n\nThis property is mutually exclusive with the source property; you can only define one or the other, but not both."
     },
     "interface": {
      "type": "string",
@@ -361,19 +363,19 @@
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#attachedDisk for attached disks.",
      "default": "compute#attachedDisk"
     },
     "licenses": {
      "type": "array",
-     "description": "Public visible licenses.",
+     "description": "[Output Only] Any valid publicly visible licenses.",
      "items": {
       "type": "string"
      }
     },
     "mode": {
      "type": "string",
-     "description": "The mode in which to attach this disk, either \"READ_WRITE\" or \"READ_ONLY\".",
+     "description": "The mode in which to attach this disk, either READ_WRITE or READ_ONLY. If not specified, the default is to attach the disk in READ_WRITE mode.",
      "enum": [
       "READ_ONLY",
       "READ_WRITE"
@@ -385,11 +387,11 @@
     },
     "source": {
      "type": "string",
-     "description": "Persistent disk only; the URL of the persistent disk resource."
+     "description": "Specifies a valid partial or full URL to an existing Persistent Disk resource. This field is only applicable for persistent disks."
     },
     "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.",
+     "description": "Specifies the type of the disk, either SCRATCH or PERSISTENT. If not specified, the default is PERSISTENT.",
      "enum": [
       "PERSISTENT",
       "SCRATCH"
@@ -409,24 +411,24 @@
   "AttachedDiskInitializeParams": {
    "id": "AttachedDiskInitializeParams",
    "type": "object",
-   "description": "Initialization parameters for the new disk (input-only). Can only be specified on the boot disk or local SSDs. Mutually exclusive with 'source'.",
+   "description": "[Input Only] Specifies the parameters for a new disk that will be created alongside the new instance. Use initialization parameters to create boot disks or local SSDs attached to the new instance.\n\nThis property is mutually exclusive with the source property; you can only define one or the other, but not both.",
    "properties": {
     "diskName": {
      "type": "string",
-     "description": "Name of the disk (when not provided defaults to the name of the instance)."
+     "description": "Specifies the disk name. If not specified, the default is to use the name of the instance."
     },
     "diskSizeGb": {
      "type": "string",
-     "description": "Size of the disk in base-2 GB.",
+     "description": "Specifies the size of the disk in base-2 GB.",
      "format": "int64"
     },
     "diskType": {
      "type": "string",
-     "description": "URL of the disk type resource describing which disk type to use to create the disk; provided by the client when the disk is created."
+     "description": "Specifies the disk type to use to create the instance. If not specified, the default is pd-standard, specified using the full URL. For example:\n\nhttps://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/pd-standard \n\nOther values include pd-ssd and local-ssd. If you define this field, you can provide either the full or partial URL. For example, the following are valid values:  \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/diskType \n- projects/project/zones/zone/diskTypes/diskType \n- zones/zone/diskTypes/diskType"
     },
     "sourceImage": {
      "type": "string",
-     "description": "The source image used to create this disk."
+     "description": "A source image used to create the disk. You can provide a private (custom) image, and Compute Engine will use the corresponding image from your project. For example:\n\nglobal/images/my-private-image \n\nOr you can provide an image from a publicly-available project. For example, to use a Debian image from the debian-cloud project, make sure to include the project in the URL:\n\nprojects/debian-cloud/global/images/debian-7-wheezy-vYYYYMMDD \n\nwhere vYYYYMMDD is the image version. The fully-qualified URL will also work in both cases."
     }
    }
   },
@@ -620,11 +622,11 @@
     },
     "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."
+     "description": "The URL of the suggested replacement for a deprecated resource. The suggested replacement resource must be the same kind of resource as the deprecated resource."
     },
     "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.",
+     "description": "The deprecation state of this resource. This 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. Operations which use OBSOLETE or DELETED resources will be rejected and result in an error.",
      "enum": [
       "DELETED",
       "DEPRECATED",
@@ -641,11 +643,11 @@
   "Disk": {
    "id": "Disk",
    "type": "object",
-   "description": "A persistent disk resource.",
+   "description": "A Disk resource.",
    "properties": {
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "description": {
      "type": "string",
@@ -653,24 +655,24 @@
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#disk for disks.",
      "default": "compute#disk"
     },
     "licenses": {
      "type": "array",
-     "description": "Public visible licenses.",
+     "description": "Any applicable publicly visible licenses.",
      "items": {
       "type": "string"
      }
     },
     "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.",
+     "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. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.",
      "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
      "annotations": {
       "required": [
@@ -684,32 +686,32 @@
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server-defined fully-qualified URL for this resource."
     },
     "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.",
+     "description": "Size of the persistent disk, specified in GB. You can specify this field when creating a persistent disk using the sourceImage or sourceSnapshot parameter, or specify it alone to create an empty persistent disk.\n\nIf you specify this field along with sourceImage or sourceSnapshot, the value of sizeGb must not be less than the size of the sourceImage or the size of the snapshot.",
      "format": "int64"
     },
     "sourceImage": {
      "type": "string",
-     "description": "The source image used to create this disk."
+     "description": "The source image used to create this disk. If the source image is deleted from the system, this field will not be set, even if an image with the same name has been re-created.\n\nWhen creating a disk, you can provide a private (custom) image using the following input, and Compute Engine will use the corresponding image from your project. For example:\n\nglobal/images/my-private-image \n\nOr you can provide an image from a publicly-available project. For example, to use a Debian image from the debian-cloud project, make sure to include the project in the URL:\n\nprojects/debian-cloud/global/images/debian-7-wheezy-vYYYYMMDD \n\nwhere vYYYYMMDD is the image version. The fully-qualified URL will also work in both cases."
     },
     "sourceImageId": {
      "type": "string",
-     "description": "The 'id' value of the image 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 image."
+     "description": "The ID value of the image used to create this disk. This value identifies the exact image that was used to create this persistent disk. For example, if you created the persistent disk from an image that was later deleted and recreated under the same name, the source image ID would identify the exact version of the image that was used."
     },
     "sourceSnapshot": {
      "type": "string",
-     "description": "The source snapshot used to create this disk."
+     "description": "The source snapshot used to create this disk. You can provide this as a partial or full URL to the resource. For example, the following are valid values:  \n- https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot \n- projects/project/global/snapshots/snapshot \n- global/snapshots/snapshot"
     },
     "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."
+     "description": "[Output Only] The unique ID of the snapshot used to create this disk. This value identifies the exact snapshot that was used to create this persistent disk. For example, if you created the persistent disk from a snapshot that was later deleted and recreated under the same name, the source snapshot ID would identify the exact version of the snapshot that was used."
     },
     "status": {
      "type": "string",
-     "description": "The status of disk creation (output only).",
+     "description": "[Output Only] The status of disk creation. Applicable statuses includes: CREATING, FAILED, READY, RESTORING.",
      "enum": [
       "CREATING",
       "FAILED",
@@ -729,7 +731,7 @@
     },
     "zone": {
      "type": "string",
-     "description": "URL of the zone where the disk resides (output only)."
+     "description": "[Output Only] URL of the zone where the disk resides."
     }
    }
   },
@@ -739,59 +741,73 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "object",
-     "description": "A map of scoped disk lists.",
+     "description": "[Output Only] A map of scoped disk lists.",
      "additionalProperties": {
       "$ref": "DisksScopedList",
-      "description": "Name of the scope containing this set of disks."
+      "description": "[Output Only] Name of the scope containing this set of disks."
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#diskAggregatedList for aggregated lists of persistent disks.",
      "default": "compute#diskAggregatedList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
   "DiskList": {
    "id": "DiskList",
    "type": "object",
-   "description": "Contains a list of persistent disk resources.",
+   "description": "A list of Disk resources.",
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of Disk resources.",
+     "description": "[Output Only] A list of persistent disks.",
      "items": {
       "$ref": "Disk"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#diskList for lists of disks.",
      "default": "compute#diskList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
+    }
+   }
+  },
+  "DiskMoveRequest": {
+   "id": "DiskMoveRequest",
+   "type": "object",
+   "properties": {
+    "destinationZone": {
+     "type": "string",
+     "description": "The URL of the destination zone to move the disk to. This can be a full or partial URL. For example, the following are all valid URLs to a zone:  \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone \n- projects/project/zones/zone \n- zones/zone"
+    },
+    "targetDisk": {
+     "type": "string",
+     "description": "The URL of the target disk to move. This can be a full or partial URL. For example, the following are all valid URLs to a disk:  \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk \n- projects/project/zones/zone/disks/disk \n- zones/zone/disks/disk"
     }
    }
   },
@@ -802,47 +818,47 @@
    "properties": {
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "defaultDiskSizeGb": {
      "type": "string",
-     "description": "Server defined default disk size in gb (output only).",
+     "description": "[Output Only] Server defined default disk size in GB.",
      "format": "int64"
     },
     "deprecated": {
      "$ref": "DeprecationStatus",
-     "description": "The deprecation status associated with this disk type."
+     "description": "[Output Only] The deprecation status associated with this disk type."
     },
     "description": {
      "type": "string",
-     "description": "An optional textual description of the resource."
+     "description": "[Output Only] An optional textual description of the resource."
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#diskType for disk types.",
      "default": "compute#diskType"
     },
     "name": {
      "type": "string",
-     "description": "Name of the resource.",
+     "description": "[Output Only] 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)."
+     "description": "[Output Only] Server defined URL for the resource."
     },
     "validDiskSize": {
      "type": "string",
-     "description": "An optional textual descroption of the valid disk size, e.g., \"10GB-10TB\"."
+     "description": "[Output Only] An optional textual description of the valid disk size, such as \"10GB-10TB\"."
     },
     "zone": {
      "type": "string",
-     "description": "Url of the zone where the disk type resides (output only)."
+     "description": "[Output Only] URL of the zone where the disk type resides."
     }
    }
   },
@@ -852,28 +868,28 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "object",
-     "description": "A map of scoped disk type lists.",
+     "description": "[Output Only] A map of scoped disk type lists.",
      "additionalProperties": {
       "$ref": "DiskTypesScopedList",
-      "description": "Name of the scope containing this set of disk types."
+      "description": "[Output Only] Name of the scope containing this set of disk types."
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#diskTypeAggregatedList.",
      "default": "compute#diskTypeAggregatedList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
@@ -884,27 +900,27 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of DiskType resources.",
+     "description": "[Output Only] A list of Disk Type resources.",
      "items": {
       "$ref": "DiskType"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#diskTypeList for disk types.",
      "default": "compute#diskTypeList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
@@ -914,18 +930,18 @@
    "properties": {
     "diskTypes": {
      "type": "array",
-     "description": "List of disk types contained in this scope.",
+     "description": "[Output Only] List of disk types contained in this scope.",
      "items": {
       "$ref": "DiskType"
      }
     },
     "warning": {
      "type": "object",
-     "description": "Informational warning which replaces the list of disk types when the list is empty.",
+     "description": "[Output Only] Informational warning which replaces the list of disk types when the list is empty.",
      "properties": {
       "code": {
        "type": "string",
-       "description": "The warning type identifier for this warning.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -938,6 +954,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -952,29 +969,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -986,18 +1004,18 @@
    "properties": {
     "disks": {
      "type": "array",
-     "description": "List of disks contained in this scope.",
+     "description": "[Output Only] 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.",
+     "description": "[Output Only] 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.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -1010,6 +1028,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -1024,29 +1043,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -1055,7 +1075,7 @@
   "Firewall": {
    "id": "Firewall",
    "type": "object",
-   "description": "A firewall resource.",
+   "description": "A Firewall resource.",
    "properties": {
     "allowed": {
      "type": "array",
@@ -1065,11 +1085,11 @@
       "properties": {
        "IPProtocol": {
         "type": "string",
-        "description": "Required; this is the IP protocol that is allowed for this rule. This can either be one of the following well known protocol strings [\"tcp\", \"udp\", \"icmp\", \"esp\", \"ah\", \"sctp\"], or the IP protocol number."
+        "description": "The IP protocol that is allowed for this rule. The protocol type is required when creating a firewall. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), 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\"].",
+        "description": "An optional list of ports which are allowed. This field is only applicable for UDP or TCP protocol. 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"
         }
@@ -1079,7 +1099,7 @@
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339text format."
     },
     "description": {
      "type": "string",
@@ -1087,17 +1107,17 @@
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Ony] Type of the resource. Always compute#firewall for firewall rules.",
      "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.",
+     "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. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.",
      "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
      "annotations": {
       "required": [
@@ -1108,29 +1128,29 @@
     },
     "network": {
      "type": "string",
-     "description": "URL of the network to which this firewall is applied; provided by the client when the firewall is created."
+     "description": "URL of the network resource for this firewall rule. This field is required for creating an instance but optional when creating a firewall rule. If not specified when creating a firewall rule, the default network is used:\nglobal/networks/default\nIf you choose to specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/myproject/global/networks/my-network \n- projects/myproject/global/networks/my-network \n- global/networks/default"
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     },
     "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.",
+     "description": "The IP address blocks that this rule applies to, expressed in CIDR format. One or both of sourceRanges and sourceTags may be set.\n\nIf both properties are set, an inbound connection is allowed if the range or the tag of the source matches the sourceRanges OR matches the sourceTags property; the connection does not need to match both properties.",
      "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.",
+     "description": "A list of instance tags which this rule applies to. One or both of sourceRanges and sourceTags may be set.\n\nIf both properties are set, an inbound connection is allowed if the range or the tag of the source matches the sourceRanges OR matches the sourceTags property; the connection does not need to match both properties.",
      "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.",
+     "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"
      }
@@ -1140,31 +1160,31 @@
   "FirewallList": {
    "id": "FirewallList",
    "type": "object",
-   "description": "Contains a list of firewall resources.",
+   "description": "Contains a list of Firewall resources.",
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of Firewall resources.",
+     "description": "[Output Only] A list of Firewall resources.",
      "items": {
       "$ref": "Firewall"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#firewallList for lists of firewalls.",
      "default": "compute#firewallList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
@@ -1315,7 +1335,7 @@
      "properties": {
       "code": {
        "type": "string",
-       "description": "The warning type identifier for this warning.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -1328,6 +1348,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -1342,29 +1363,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -1532,7 +1554,7 @@
   "Image": {
    "id": "Image",
    "type": "object",
-   "description": "A disk image resource.",
+   "description": "An Image resource.",
    "properties": {
     "archiveSizeBytes": {
      "type": "string",
@@ -1541,7 +1563,7 @@
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "deprecated": {
      "$ref": "DeprecationStatus",
@@ -1553,29 +1575,29 @@
     },
     "diskSizeGb": {
      "type": "string",
-     "description": "Size of the image when restored onto a disk (in GiB).",
+     "description": "Size of the image when restored onto a persistent disk (in GB).",
      "format": "int64"
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#image for images.",
      "default": "compute#image"
     },
     "licenses": {
      "type": "array",
-     "description": "Public visible licenses.",
+     "description": "Any applicable publicly visible licenses.",
      "items": {
       "type": "string"
      }
     },
     "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.",
+     "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. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.",
      "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
      "annotations": {
       "required": [
@@ -1585,11 +1607,11 @@
     },
     "rawDisk": {
      "type": "object",
-     "description": "The raw disk image parameters.",
+     "description": "The parameters of the raw disk image.",
      "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.",
+       "description": "The format used to encode and transmit the block device, which 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.",
        "enum": [
         "TAR"
        ],
@@ -1604,7 +1626,7 @@
       },
       "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.",
+       "description": "The full Google Cloud Storage URL where the disk image is stored. You must provide either this property or the sourceDisk property but not both.",
        "annotations": {
         "required": [
          "compute.images.insert"
@@ -1615,19 +1637,19 @@
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     },
     "sourceDisk": {
      "type": "string",
-     "description": "The source disk used to create this image."
+     "description": "URL of the The source disk used to create this image. This can be a full or valid partial URL. You must provide either this property or the rawDisk.source property but not both to create an image. For example, the following are valid values:  \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone/disk/disk \n- projects/project/zones/zone/disk/disk \n- zones/zone/disks/disk"
     },
     "sourceDiskId": {
      "type": "string",
-     "description": "The 'id' value of the disk used to create this image. This value may be used to determine whether the image was taken from the current or a previous instance of a given disk name."
+     "description": "The ID value of the disk used to create this image. This value may be used to determine whether the image was taken from the current or a previous instance of a given disk name."
     },
     "sourceType": {
      "type": "string",
-     "description": "Must be \"RAW\"; provided by the client when the disk image is created.",
+     "description": "The type of the image used to create this disk. The default and only value is RAW",
      "default": "RAW",
      "enum": [
       "RAW"
@@ -1638,7 +1660,7 @@
     },
     "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.",
+     "description": "[Output Only] The status of the image. An image can be used to create other resources, such as instances, only after the image has been successfully created and the status is set to READY. Possible values are FAILED, PENDING, or READY.",
      "enum": [
       "FAILED",
       "PENDING",
@@ -1655,7 +1677,7 @@
   "ImageList": {
    "id": "ImageList",
    "type": "object",
-   "description": "Contains a list of disk image resources.",
+   "description": "Contains a list of Image resources.",
    "properties": {
     "id": {
      "type": "string",
@@ -1686,15 +1708,15 @@
   "Instance": {
    "id": "Instance",
    "type": "object",
-   "description": "An instance resource.",
+   "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."
+     "description": "Allows this instance to send and receive packets with non-matching destination or source IPs. This is required if you plan to use this instance to forward routes. For more information, see Enabling IP Forwarding."
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "description": {
      "type": "string",
@@ -1709,17 +1731,17 @@
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#instance for instances.",
      "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.",
+     "description": "Full or partial URL of the machine type resource to use for this instance. This is provided by the client when the instance is created. For example, the following is a valid partial url:\n\nzones/zone/machineTypes/machine-type",
      "annotations": {
       "required": [
        "compute.instances.insert"
@@ -1728,21 +1750,15 @@
     },
     "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."
+     "description": "The metadata key/value pairs assigned to this instance. This includes custom metadata and predefined keys."
     },
     "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"
-      ]
-     }
+     "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. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash."
     },
     "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.",
+     "description": "An 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.",
      "items": {
       "$ref": "NetworkInterface"
      }
@@ -1753,18 +1769,18 @@
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     },
     "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.",
+     "description": "A list of service accounts, with their specified scopes, authorized for this instance. Service accounts generate access tokens that can be accessed through the metadata server and used to authenticate applications on the instance. See Authenticating from Google Compute Engine for more information.",
      "items": {
       "$ref": "ServiceAccount"
      }
     },
     "status": {
      "type": "string",
-     "description": "Instance status. One of the following values: \"PROVISIONING\", \"STAGING\", \"RUNNING\", \"STOPPING\", \"STOPPED\", \"TERMINATED\" (output only).",
+     "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED, TERMINATED.",
      "enum": [
       "PROVISIONING",
       "RUNNING",
@@ -1784,15 +1800,15 @@
     },
     "statusMessage": {
      "type": "string",
-     "description": "An optional, human-readable explanation of the status (output only)."
+     "description": "[Output Only] An optional, human-readable explanation of the status."
     },
     "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."
+     "description": "A list of tags to appy to this instance. Tags are used to identify valid sources or targets for network firewalls and are specified by the client during 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)."
+     "description": "[Output Only] URL of the zone where the instance resides."
     }
    }
   },
@@ -1802,11 +1818,11 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "object",
-     "description": "A map of scoped instance lists.",
+     "description": "[Output Only] A map of scoped instance lists.",
      "additionalProperties": {
       "$ref": "InstancesScopedList",
       "description": "Name of the scope containing this set of instances."
@@ -1814,16 +1830,16 @@
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#instanceAggregatedList for aggregated lists of Instance resources.",
      "default": "compute#instanceAggregatedList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
@@ -1834,27 +1850,41 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of Instance resources.",
+     "description": "[Output Only] A list of Instance resources.",
      "items": {
       "$ref": "Instance"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#instanceList for lists of Instance resources.",
      "default": "compute#instanceList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
+    }
+   }
+  },
+  "InstanceMoveRequest": {
+   "id": "InstanceMoveRequest",
+   "type": "object",
+   "properties": {
+    "destinationZone": {
+     "type": "string",
+     "description": "The URL of the destination zone to move the instance to. This can be a full or partial URL. For example, the following are all valid URLs to a zone:  \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone \n- projects/project/zones/zone \n- zones/zone"
+    },
+    "targetInstance": {
+     "type": "string",
+     "description": "The URL of the target instance to move. This can be a full or partial URL. For example, the following are all valid URLs to an instance:  \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone/instances/instance \n- projects/project/zones/zone/instances/instance \n- zones/zone/instances/instance"
     }
    }
   },
@@ -2004,18 +2034,18 @@
    "properties": {
     "instances": {
      "type": "array",
-     "description": "List of instances contained in this scope.",
+     "description": "[Output Only] 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.",
+     "description": "[Output Only] 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.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -2028,6 +2058,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -2042,29 +2073,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -2081,12 +2113,12 @@
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#license for licenses.",
      "default": "compute#license"
     },
     "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.",
+     "description": "Name of the resource. The name must be 1-63 characters long, and comply with RCF1035.",
      "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
      "annotations": {
       "required": [
@@ -2096,14 +2128,14 @@
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     }
    }
   },
   "MachineType": {
    "id": "MachineType",
    "type": "object",
-   "description": "A machine type resource.",
+   "description": "A Machine Type resource.",
    "properties": {
     "creationTimestamp": {
      "type": "string",
@@ -2111,15 +2143,15 @@
     },
     "deprecated": {
      "$ref": "DeprecationStatus",
-     "description": "The deprecation status associated with this machine type."
+     "description": "[Output Only] The deprecation status associated with this machine type."
     },
     "description": {
      "type": "string",
-     "description": "An optional textual description of the resource."
+     "description": "[Output Only] An optional textual description of the resource."
     },
     "guestCpus": {
      "type": "integer",
-     "description": "Count of CPUs exposed to the instance.",
+     "description": "[Output Only] The tumber of CPUs exposed to the instance.",
      "format": "int32"
     },
     "id": {
@@ -2129,7 +2161,7 @@
     },
     "imageSpaceGb": {
      "type": "integer",
-     "description": "Space allotted for the image, defined in GB.",
+     "description": "[Deprecated] This property is deprecated and will never be populated with any relevant values.",
      "format": "int32"
     },
     "kind": {
@@ -2139,27 +2171,27 @@
     },
     "maximumPersistentDisks": {
      "type": "integer",
-     "description": "Maximum persistent disks allowed.",
+     "description": "[Output Only] Maximum persistent disks allowed.",
      "format": "int32"
     },
     "maximumPersistentDisksSizeGb": {
      "type": "string",
-     "description": "Maximum total persistent disks size (GB) allowed.",
+     "description": "[Output Only] Maximum total persistent disks size (GB) allowed.",
      "format": "int64"
     },
     "memoryMb": {
      "type": "integer",
-     "description": "Physical memory assigned to the instance, defined in MB.",
+     "description": "[Output Only] The amount of physical memory available to the instance, defined in MB.",
      "format": "int32"
     },
     "name": {
      "type": "string",
-     "description": "Name of the resource.",
+     "description": "[Output Only] 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.",
+     "description": "[Output Only] List of extended scratch disks assigned to the instance.",
      "items": {
       "type": "object",
       "properties": {
@@ -2191,15 +2223,15 @@
     },
     "items": {
      "type": "object",
-     "description": "A map of scoped machine type lists.",
+     "description": "[Output Only] A map of scoped machine type lists.",
      "additionalProperties": {
       "$ref": "MachineTypesScopedList",
-      "description": "Name of the scope containing this set of machine types."
+      "description": "[Output Only] Name of the scope containing this set of machine types."
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#machineTypeAggregatedList for aggregated lists of machine types.",
      "default": "compute#machineTypeAggregatedList"
     },
     "nextPageToken": {
@@ -2208,38 +2240,38 @@
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
   "MachineTypeList": {
    "id": "MachineTypeList",
    "type": "object",
-   "description": "Contains a list of machine type resources.",
+   "description": "Contains a list of Machine Type resources.",
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of MachineType resources.",
+     "description": "[Output Only] A list of Machine Type resources.",
      "items": {
       "$ref": "MachineType"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#machineTypeList for lists of machine types.",
      "default": "compute#machineTypeList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
@@ -2249,18 +2281,18 @@
    "properties": {
     "machineTypes": {
      "type": "array",
-     "description": "List of machine types contained in this scope.",
+     "description": "[Output Only] List of machine types contained in this scope.",
      "items": {
       "$ref": "MachineType"
      }
     },
     "warning": {
      "type": "object",
-     "description": "An informational warning that appears when the machine types list is empty.",
+     "description": "[Output Only] An informational warning that appears when the machine types list is empty.",
      "properties": {
       "code": {
        "type": "string",
-       "description": "The warning type identifier for this warning.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -2273,6 +2305,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -2287,29 +2320,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -2322,7 +2356,7 @@
    "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.",
+     "description": "Specifies a fingerprint for this request, which is essentially a hash of the metadata's contents and used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update metadata. You must always provide an up-to-date fingerprint hash in order to update or change metadata.",
      "format": "byte"
     },
     "items": {
@@ -2357,7 +2391,7 @@
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#metadata for metadata.",
      "default": "compute#metadata"
     }
    }
@@ -2369,7 +2403,7 @@
    "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.",
+     "description": "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": [
@@ -2379,7 +2413,7 @@
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "description": {
      "type": "string",
@@ -2387,22 +2421,22 @@
     },
     "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.",
+     "description": "A gateway address for default routing to other networks. This value is read only and is selected by the Google Compute Engine, typically as the first usable address in the 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).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#network for networks.",
      "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.",
+     "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. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.",
      "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
      "annotations": {
       "required": [
@@ -2412,7 +2446,7 @@
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     }
    }
   },
@@ -2423,18 +2457,18 @@
    "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.",
+     "description": "An array of configurations for this interface. Currently, \u003ccodeONE_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)."
+     "description": "[Output Only] The name of the network interface, generated by the server. For network devices, these are eth0, eth1, etc."
     },
     "network": {
      "type": "string",
-     "description": "URL of the network resource attached to this interface.",
+     "description": "URL of the network resource for this instance. This is required for creating an instance but optional when creating a firewall rule. If not specified when creating a firewall rule, the default network is used:\n\nglobal/networks/default \n\nIf you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/project/global/networks/network \n- projects/project/global/networks/network \n- global/networks/default",
      "annotations": {
       "required": [
        "compute.instances.insert"
@@ -2443,38 +2477,38 @@
     },
     "networkIP": {
      "type": "string",
-     "description": "An optional IPV4 internal network address assigned to the instance for this network interface (output only)."
+     "description": "[Output Only] An optional IPV4 internal network address assigned to the instance for this network interface."
     }
    }
   },
   "NetworkList": {
    "id": "NetworkList",
    "type": "object",
-   "description": "Contains a list of network resources.",
+   "description": "Contains a list of Network resources.",
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of Network resources.",
+     "description": "[Output Only] A list of Network resources.",
      "items": {
       "$ref": "Network"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#networkList for lists of networks.",
      "default": "compute#networkList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource ."
     }
    }
   },
@@ -2484,18 +2518,20 @@
    "description": "An operation resource, used to manage asynchronous API requests.",
    "properties": {
     "clientOperationId": {
-     "type": "string"
+     "type": "string",
+     "description": "[Output Only] An optional identifier specified by the client when the mutation was initiated. Must be unique for all operation resources in the project"
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "[Output Only] Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "endTime": {
-     "type": "string"
+     "type": "string",
+     "description": "[Output Only] The time that this operation was completed. This is in RFC3339 text format."
     },
     "error": {
      "type": "object",
-     "description": "[Output Only] If errors occurred during processing of this operation, this field will be populated.",
+     "description": "[Output Only] If errors are generated during processing of the operation, this field will be populated.",
      "properties": {
       "errors": {
        "type": "array",
@@ -2521,10 +2557,12 @@
      }
     },
     "httpErrorMessage": {
-     "type": "string"
+     "type": "string",
+     "description": "[Output Only] If the operation fails, this field contains the HTTP error message that was returned, such as NOT FOUND."
     },
     "httpErrorStatusCode": {
      "type": "integer",
+     "description": "[Output Only] If the operation fails, this field contains the HTTP error message that was returned, such as 404.",
      "format": "int32"
     },
     "id": {
@@ -2534,27 +2572,29 @@
     },
     "insertTime": {
      "type": "string",
-     "description": "[Output Only] The time that this operation was requested. This is in RFC 3339 format."
+     "description": "[Output Only] The time that this operation was requested. This is in RFC3339 text format."
     },
     "kind": {
      "type": "string",
-     "description": "[Output Only] Type of the resource. Always kind#operation for Operation resources.",
+     "description": "[Output Only] Type of the resource. Always compute#Operation for Operation resources.",
      "default": "compute#operation"
     },
     "name": {
      "type": "string",
-     "description": "[Output Only] Name of the resource (output only)."
+     "description": "[Output Only] Name of the resource."
     },
     "operationType": {
-     "type": "string"
+     "type": "string",
+     "description": "[Output Only] Type of the operation, such as insert, update, and delete."
     },
     "progress": {
      "type": "integer",
+     "description": "[Output Only] 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.",
      "format": "int32"
     },
     "region": {
      "type": "string",
-     "description": "[Output Only] URL of the region where the operation resides (output only)."
+     "description": "[Output Only] URL of the region where the operation resides. Only applicable for regional resources."
     },
     "selfLink": {
      "type": "string",
@@ -2562,11 +2602,11 @@
     },
     "startTime": {
      "type": "string",
-     "description": "[Output Only] The time that this operation was started by the server. This is in RFC 3339 format."
+     "description": "[Output Only] The time that this operation was started by the server. This is in RFC3339 text format."
     },
     "status": {
      "type": "string",
-     "description": "[Output Only] Status of the operation. Can be one of the following: \"PENDING\", \"RUNNING\", or \"DONE\".",
+     "description": "[Output Only] Status of the operation. Can be one of the following: PENDING, RUNNING, or DONE.",
      "enum": [
       "DONE",
       "PENDING",
@@ -2584,24 +2624,26 @@
     },
     "targetId": {
      "type": "string",
-     "description": "[Output Only] Unique target id which identifies a particular incarnation of the target.",
+     "description": "[Output Only] Unique target ID which identifies a particular incarnation of the target.",
      "format": "uint64"
     },
     "targetLink": {
      "type": "string",
-     "description": "[Output Only] URL of the resource the operation is mutating (output only)."
+     "description": "[Output Only] URL of the resource the operation is mutating."
     },
     "user": {
-     "type": "string"
+     "type": "string",
+     "description": "[Output Only] User who requested the operation, for example: user@example.com."
     },
     "warnings": {
      "type": "array",
+     "description": "[Output Only] If warning messages are generated during processing of the operation, this field will be populated.",
      "items": {
       "type": "object",
       "properties": {
        "code": {
         "type": "string",
-        "description": "The warning type identifier for this warning.",
+        "description": "[Output Only] The warning type identifier for this warning.",
         "enum": [
          "DEPRECATED_RESOURCE_USED",
          "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -2614,6 +2656,7 @@
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
          "RESOURCE_NOT_DELETED",
+         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
         ],
         "enumDescriptions": [
@@ -2628,36 +2671,37 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
        "data": {
         "type": "array",
-        "description": "Metadata for this warning in 'key: value' format.",
+        "description": "[Output Only] Metadata for this warning in key: value format.",
         "items": {
          "type": "object",
          "properties": {
           "key": {
            "type": "string",
-           "description": "A key for the warning data."
+           "description": "[Output Only] A key for the warning data."
           },
           "value": {
            "type": "string",
-           "description": "A warning data value corresponding to the key."
+           "description": "[Output Only] A warning data value corresponding to the key."
           }
          }
         }
        },
        "message": {
         "type": "string",
-        "description": "Optional human-readable details for this warning."
+        "description": "[Output Only] Optional human-readable details for this warning."
        }
       }
      }
     },
     "zone": {
      "type": "string",
-     "description": "[Output Only] URL of the zone where the operation resides (output only)."
+     "description": "[Output Only] URL of the zone where the operation resides."
     }
    }
   },
@@ -2679,7 +2723,7 @@
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#operationAggregatedList for aggregated lists of operations.",
      "default": "compute#operationAggregatedList"
     },
     "nextPageToken": {
@@ -2710,7 +2754,7 @@
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource. Always compute#operations for Operations resource.",
+     "description": "[Output Only] Type of resource. Always compute#operations for Operations resource.",
      "default": "compute#operationList"
     },
     "nextPageToken": {
@@ -2740,7 +2784,7 @@
      "properties": {
       "code": {
        "type": "string",
-       "description": "The warning type identifier for this warning.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -2753,6 +2797,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -2767,29 +2812,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -2841,15 +2887,15 @@
   "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.",
+   "description": "A Project resource. Projects can only be created in the Google Developers 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."
+     "description": "Metadata key/value pairs available to all instances contained in this project. See Custom metadata for more information."
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "description": {
      "type": "string",
@@ -2857,12 +2903,12 @@
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#project for projects.",
      "default": "compute#project"
     },
     "name": {
@@ -2871,14 +2917,14 @@
     },
     "quotas": {
      "type": "array",
-     "description": "Quotas assigned to this project.",
+     "description": "[Output Only] Quotas assigned to this project.",
      "items": {
       "$ref": "Quota"
      }
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     },
     "usageExportLocation": {
      "$ref": "UsageExportLocation",
@@ -2893,30 +2939,23 @@
    "properties": {
     "limit": {
      "type": "number",
-     "description": "Quota limit for this metric.",
+     "description": "[Output Only] Quota limit for this metric.",
      "format": "double"
     },
     "metric": {
      "type": "string",
-     "description": "Name of the quota metric.",
+     "description": "[Output Only] Name of the quota metric.",
      "enum": [
       "BACKEND_SERVICES",
       "CPUS",
-      "DISKS",
       "DISKS_TOTAL_GB",
-      "EPHEMERAL_ADDRESSES",
       "FIREWALLS",
       "FORWARDING_RULES",
       "HEALTH_CHECKS",
       "IMAGES",
-      "IMAGES_TOTAL_GB",
-      "INSTANCES",
       "IN_USE_ADDRESSES",
-      "KERNELS",
-      "KERNELS_TOTAL_GB",
       "LOCAL_SSD_TOTAL_GB",
       "NETWORKS",
-      "OPERATIONS",
       "ROUTES",
       "SNAPSHOTS",
       "SSD_TOTAL_GB",
@@ -2944,19 +2983,12 @@
       "",
       "",
       "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
       ""
      ]
     },
     "usage": {
      "type": "number",
-     "description": "Current usage of this metric.",
+     "description": "[Output Only] Current usage of this metric.",
      "format": "double"
     }
    }
@@ -2968,44 +3000,44 @@
    "properties": {
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "deprecated": {
      "$ref": "DeprecationStatus",
-     "description": "The deprecation status associated with this region."
+     "description": "[Output Only] The deprecation status associated with this region."
     },
     "description": {
      "type": "string",
-     "description": "Textual description of the resource."
+     "description": "[Output Only] Textual description of the resource."
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server .",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#region for regions.",
      "default": "compute#region"
     },
     "name": {
      "type": "string",
-     "description": "Name of the resource."
+     "description": "[Output Only] Name of the resource."
     },
     "quotas": {
      "type": "array",
-     "description": "Quotas assigned to this region.",
+     "description": "[Output Only] Quotas assigned to this region.",
      "items": {
       "$ref": "Quota"
      }
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     },
     "status": {
      "type": "string",
-     "description": "Status of the region, \"UP\" or \"DOWN\".",
+     "description": "[Output Only] Status of the region, either UP or DOWN.",
      "enum": [
       "DOWN",
       "UP"
@@ -3017,7 +3049,7 @@
     },
     "zones": {
      "type": "array",
-     "description": "A list of zones homed in this region, in the form of resource URLs.",
+     "description": "[Output Only] A list of zones available in this region, in the form of resource URLs.",
      "items": {
       "type": "string"
      }
@@ -3031,27 +3063,27 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of Region resources.",
+     "description": "[Output Only] A list of Region resources.",
      "items": {
       "$ref": "Region"
      }
     },
     "kind": {
      "type": "string",
-     "description": "Type of resource.",
+     "description": "[Output Only] Type of resource. Always compute#regionList for lists of regions.",
      "default": "compute#regionList"
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for this resource (output only)."
+     "description": "[Output Only] Server defined URL for this resource."
     }
    }
   },
@@ -3166,7 +3198,7 @@
       "properties": {
        "code": {
         "type": "string",
-        "description": "The warning type identifier for this warning.",
+        "description": "[Output Only] The warning type identifier for this warning.",
         "enum": [
          "DEPRECATED_RESOURCE_USED",
          "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -3179,6 +3211,7 @@
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
          "RESOURCE_NOT_DELETED",
+         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
         ],
         "enumDescriptions": [
@@ -3193,29 +3226,30 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
        "data": {
         "type": "array",
-        "description": "Metadata for this warning in 'key: value' format.",
+        "description": "[Output Only] Metadata for this warning in key: value format.",
         "items": {
          "type": "object",
          "properties": {
           "key": {
            "type": "string",
-           "description": "A key for the warning data."
+           "description": "[Output Only] A key for the warning data."
           },
           "value": {
            "type": "string",
-           "description": "A warning data value corresponding to the key."
+           "description": "[Output Only] A warning data value corresponding to the key."
           }
          }
         }
        },
        "message": {
         "type": "string",
-        "description": "Optional human-readable details for this warning."
+        "description": "[Output Only] Optional human-readable details for this warning."
        }
       }
      }
@@ -3256,15 +3290,15 @@
   "Scheduling": {
    "id": "Scheduling",
    "type": "object",
-   "description": "Scheduling options for an Instance.",
+   "description": "Sets the scheduling options for an Instance.",
    "properties": {
     "automaticRestart": {
      "type": "boolean",
-     "description": "Whether the Instance should be automatically restarted whenever it is terminated by Compute Engine (not terminated by user)."
+     "description": "Specifies whether the instance should be automatically restarted if it is terminated by Compute Engine (not terminated by a user)."
     },
     "onHostMaintenance": {
      "type": "string",
-     "description": "How the instance should behave when the host machine undergoes maintenance that may temporarily impact instance performance.",
+     "description": "Defines the maintenance behavior for this instance. The default behavior is MIGRATE. For more information, see Setting maintenance behavior.",
      "enum": [
       "MIGRATE",
       "TERMINATE"
@@ -3279,20 +3313,20 @@
   "SerialPortOutput": {
    "id": "SerialPortOutput",
    "type": "object",
-   "description": "An instance serial console output.",
+   "description": "An instance's serial console output.",
    "properties": {
     "contents": {
      "type": "string",
-     "description": "The contents of the console output."
+     "description": "[Output Only] The contents of the console output."
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always compute#serialPortOutput for serial port output.",
      "default": "compute#serialPortOutput"
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     }
    }
   },
@@ -3441,7 +3475,7 @@
    "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.",
+     "description": "Specifies a fingerprint for this request, which is essentially a hash of the metadata's contents and used for optimistic locking. The fingerprint is initially generated by Compute Engine and changes after every request to modify or update metadata. You must always provide an up-to-date fingerprint hash in order to update or change metadata.\n\nTo see the latest fingerprint, make get() request to the instance.",
      "format": "byte"
     },
     "items": {
@@ -3653,7 +3687,7 @@
      "properties": {
       "code": {
        "type": "string",
-       "description": "The warning type identifier for this warning.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -3666,6 +3700,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -3680,29 +3715,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -3931,7 +3967,7 @@
      "properties": {
       "code": {
        "type": "string",
-       "description": "The warning type identifier for this warning.",
+       "description": "[Output Only] The warning type identifier for this warning.",
        "enum": [
         "DEPRECATED_RESOURCE_USED",
         "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
@@ -3944,6 +3980,7 @@
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
         "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
        ],
        "enumDescriptions": [
@@ -3958,29 +3995,30 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
       "data": {
        "type": "array",
-       "description": "Metadata for this warning in 'key: value' format.",
+       "description": "[Output Only] Metadata for this warning in key: value format.",
        "items": {
         "type": "object",
         "properties": {
          "key": {
           "type": "string",
-          "description": "A key for the warning data."
+          "description": "[Output Only] A key for the warning data."
          },
          "value": {
           "type": "string",
-          "description": "A warning data value corresponding to the key."
+          "description": "[Output Only] A warning data value corresponding to the key."
          }
         }
        }
       },
       "message": {
        "type": "string",
-       "description": "Optional human-readable details for this warning."
+       "description": "[Output Only] Optional human-readable details for this warning."
       }
      }
     }
@@ -4193,81 +4231,81 @@
    "properties": {
     "bucketName": {
      "type": "string",
-     "description": "The name of an existing bucket in Cloud Storage where the usage report object is stored. The Google Service Account is granted write access to this bucket. This is simply the bucket name, with no \"gs://\" or \"https://storage.googleapis.com/\" in front of it."
+     "description": "The name of an existing bucket in Cloud Storage where the usage report object is stored. The Google Service Account is granted write access to this bucket. This is just the bucket name, with no gs:// or https://storage.googleapis.com/ in front of it."
     },
     "reportNamePrefix": {
      "type": "string",
-     "description": "An optional prefix for the name of the usage report object stored in bucket_name. If not supplied, defaults to \"usage_\". The report is stored as a CSV file named _gce_.csv. where  is the day of the usage according to Pacific Time. The prefix should conform to Cloud Storage object naming conventions."
+     "description": "An optional prefix for the name of the usage report object stored in bucketName. If not supplied, defaults to usage. The report is stored as a CSV file named report_name_prefix_gce_YYYYMMDD.csv where YYYYMMDD is the day of the usage according to Pacific Time. If you supply a prefix, it should conform to Cloud Storage object naming conventions."
     }
    }
   },
   "Zone": {
    "id": "Zone",
    "type": "object",
-   "description": "A zone resource.",
+   "description": "A Zone resource.",
    "properties": {
     "creationTimestamp": {
      "type": "string",
-     "description": "Creation timestamp in RFC3339 text format (output only)."
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
     },
     "deprecated": {
      "$ref": "DeprecationStatus",
-     "description": "The deprecation status associated with this zone."
+     "description": "[Output Only] The deprecation status associated with this zone."
     },
     "description": {
      "type": "string",
-     "description": "Textual description of the resource."
+     "description": "[Output Only] Textual description of the resource."
     },
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only).",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server.",
      "format": "uint64"
     },
     "kind": {
      "type": "string",
-     "description": "Type of the resource.",
+     "description": "[Output Only] Type of the resource. Always kind#zone for zones.",
      "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.",
+     "description": "[Output Only] Any scheduled maintenance windows for this zone. When the zone is in a maintenance window, all resources which reside in the zone will be unavailable. For more information, see Maintenance Windows",
      "items": {
       "type": "object",
       "properties": {
        "beginTime": {
         "type": "string",
-        "description": "Begin time of the maintenance window, in RFC 3339 format."
+        "description": "[Output Only] Starting time of the maintenance window, in RFC3339 format."
        },
        "description": {
         "type": "string",
-        "description": "Textual description of the maintenance window."
+        "description": "[Output Only] Textual description of the maintenance window."
        },
        "endTime": {
         "type": "string",
-        "description": "End time of the maintenance window, in RFC 3339 format."
+        "description": "[Output Only] Ending time of the maintenance window, in RFC3339 format."
        },
        "name": {
         "type": "string",
-        "description": "Name of the maintenance window."
+        "description": "[Output Only] Name of the maintenance window."
        }
       }
      }
     },
     "name": {
      "type": "string",
-     "description": "Name of the resource."
+     "description": "[Output Only] Name of the resource."
     },
     "region": {
      "type": "string",
-     "description": "Full URL reference to the region which hosts the zone (output only)."
+     "description": "[Output Only] Full URL reference to the region which hosts the zone."
     },
     "selfLink": {
      "type": "string",
-     "description": "Server defined URL for the resource (output only)."
+     "description": "[Output Only] Server defined URL for the resource."
     },
     "status": {
      "type": "string",
-     "description": "Status of the zone. \"UP\" or \"DOWN\".",
+     "description": "[Output Only] Status of the zone, either UP or DOWN.",
      "enum": [
       "DOWN",
       "UP"
@@ -4286,11 +4324,11 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "Unique identifier for the resource; defined by the server (output only)."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "A list of Zone resources.",
+     "description": "[Output Only] A list of Zone resources.",
      "items": {
       "$ref": "Zone"
      }
@@ -4302,7 +4340,7 @@
     },
     "nextPageToken": {
      "type": "string",
-     "description": "A token used to continue a truncated list request (output only)."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
@@ -4341,7 +4379,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -4374,14 +4412,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the region for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -4415,14 +4453,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the region for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -4450,14 +4488,14 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the region for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -4505,14 +4543,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the region for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -4814,7 +4852,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -4847,14 +4885,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -4901,14 +4939,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -4958,7 +4996,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -4980,24 +5018,25 @@
      "id": "compute.disks.createSnapshot",
      "path": "{project}/zones/{zone}/disks/{disk}/createSnapshot",
      "httpMethod": "POST",
+     "description": "Creates a snapshot of this disk.",
      "parameters": {
       "disk": {
        "type": "string",
-       "description": "Name of the persistent disk resource to snapshot.",
+       "description": "Name of the persistent disk to snapshot.",
        "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.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -5023,25 +5062,25 @@
      "id": "compute.disks.delete",
      "path": "{project}/zones/{zone}/disks/{disk}",
      "httpMethod": "DELETE",
-     "description": "Deletes the specified persistent disk resource.",
+     "description": "Deletes the specified persistent disk.",
      "parameters": {
       "disk": {
        "type": "string",
-       "description": "Name of the persistent disk resource to delete.",
+       "description": "Name of the persistent disk 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.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -5064,25 +5103,25 @@
      "id": "compute.disks.get",
      "path": "{project}/zones/{zone}/disks/{disk}",
      "httpMethod": "GET",
-     "description": "Returns the specified persistent disk resource.",
+     "description": "Returns a specified persistent disk.",
      "parameters": {
       "disk": {
        "type": "string",
-       "description": "Name of the persistent disk resource to return.",
+       "description": "Name of the persistent disk 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.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -5106,11 +5145,11 @@
      "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.",
+     "description": "Creates a persistent disk in the specified project using the data included in the request.",
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5122,7 +5161,7 @@
       },
       "zone": {
        "type": "string",
-       "description": "Name of the zone scoping this request.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -5147,7 +5186,7 @@
      "id": "compute.disks.list",
      "path": "{project}/zones/{zone}/disks",
      "httpMethod": "GET",
-     "description": "Retrieves the list of persistent disk resources contained within the specified zone.",
+     "description": "Retrieves the list of persistent disks contained within the specified zone.",
      "parameters": {
       "filter": {
        "type": "string",
@@ -5170,14 +5209,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -5215,7 +5254,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5248,7 +5287,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5275,7 +5314,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5322,7 +5361,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5355,7 +5394,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5391,7 +5430,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5696,7 +5735,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5729,7 +5768,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5756,7 +5795,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -5803,7 +5842,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6032,7 +6071,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6065,7 +6104,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6095,7 +6134,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6141,7 +6180,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6394,7 +6433,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6416,7 +6455,7 @@
      "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.",
+     "description": "Sets the deprecation status of an image.\n\nIf an empty request body is given, clears the deprecation status instead.",
      "parameters": {
       "image": {
        "type": "string",
@@ -6427,7 +6466,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6463,7 +6502,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6490,7 +6529,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6540,7 +6579,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6714,27 +6753,27 @@
      "parameters": {
       "instance": {
        "type": "string",
-       "description": "Instance name.",
+       "description": "The instance name for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
       },
       "networkInterface": {
        "type": "string",
-       "description": "Network interface name.",
+       "description": "The name of the network interface to add to this instance.",
        "required": true,
        "location": "query"
       },
       "project": {
        "type": "string",
-       "description": "Project name.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -6783,7 +6822,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -6805,7 +6844,7 @@
      "id": "compute.instances.attachDisk",
      "path": "{project}/zones/{zone}/instances/{instance}/attachDisk",
      "httpMethod": "POST",
-     "description": "Attaches a disk resource to an instance.",
+     "description": "Attaches a Disk resource to an instance.",
      "parameters": {
       "instance": {
        "type": "string",
@@ -6816,14 +6855,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Project name.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -6849,7 +6888,7 @@
      "id": "compute.instances.delete",
      "path": "{project}/zones/{zone}/instances/{instance}",
      "httpMethod": "DELETE",
-     "description": "Deletes the specified instance resource.",
+     "description": "Deletes the specified Instance resource. For more information, see Shutting down an instance.",
      "parameters": {
       "instance": {
        "type": "string",
@@ -6860,14 +6899,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -6894,33 +6933,33 @@
      "parameters": {
       "accessConfig": {
        "type": "string",
-       "description": "Access config name.",
+       "description": "The name of the access config to delete.",
        "required": true,
        "location": "query"
       },
       "instance": {
        "type": "string",
-       "description": "Instance name.",
+       "description": "The instance name for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
       },
       "networkInterface": {
        "type": "string",
-       "description": "Network interface name.",
+       "description": "The name of the network interface.",
        "required": true,
        "location": "query"
       },
       "project": {
        "type": "string",
-       "description": "Project name.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -6963,14 +7002,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Project name.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7005,14 +7044,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the The name of the zone for this request..",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7047,14 +7086,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7082,14 +7121,14 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7137,14 +7176,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7178,14 +7217,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7208,7 +7247,7 @@
      "id": "compute.instances.setDiskAutoDelete",
      "path": "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete",
      "httpMethod": "POST",
-     "description": "Sets the auto-delete flag for a disk attached to an instance",
+     "description": "Sets the auto-delete flag for a disk attached to an instance.",
      "parameters": {
       "autoDelete": {
        "type": "boolean",
@@ -7218,28 +7257,28 @@
       },
       "deviceName": {
        "type": "string",
-       "description": "Disk device name to modify.",
+       "description": "The device name of the disk to modify.",
        "required": true,
        "pattern": "\\w[\\w.-]{0,254}",
        "location": "query"
       },
       "instance": {
        "type": "string",
-       "description": "Instance name.",
+       "description": "The instance name.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
       },
       "project": {
        "type": "string",
-       "description": "Project name.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7275,14 +7314,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7319,14 +7358,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Project name.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7363,14 +7402,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7396,7 +7435,7 @@
      "id": "compute.instances.start",
      "path": "{project}/zones/{zone}/instances/{instance}/start",
      "httpMethod": "POST",
-     "description": "Starts an instance",
+     "description": "This method starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.",
      "parameters": {
       "instance": {
        "type": "string",
@@ -7407,14 +7446,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7437,7 +7476,7 @@
      "id": "compute.instances.stop",
      "path": "{project}/zones/{zone}/instances/{instance}/stop",
      "httpMethod": "POST",
-     "description": "Stops an instance",
+     "description": "This method stops a running instance, shutting it down cleanly, and allows you to restart the instance at a later time. Stopped instances do not incur per-minute, virtual machine usage charges while they are stopped, but any resources that the virtual machine is using, such as persistent disks and static IP addresses,will continue to be charged until they are deleted. For more information, see Stopping an instance.",
      "parameters": {
       "instance": {
        "type": "string",
@@ -7448,14 +7487,14 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7493,7 +7532,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7583,7 +7622,7 @@
       },
       "zone": {
        "type": "string",
-       "description": "Name of the zone scoping this request.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7637,7 +7676,7 @@
       },
       "zone": {
        "type": "string",
-       "description": "Name of the zone scoping this request.",
+       "description": "The name of the zone for this request.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -7675,7 +7714,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7708,7 +7747,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7735,7 +7774,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7782,7 +7821,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7812,7 +7851,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project resource to retrieve.",
+       "description": "Project ID for 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"
@@ -7830,6 +7869,62 @@
       "https://www.googleapis.com/auth/compute.readonly"
      ]
     },
+    "moveDisk": {
+     "id": "compute.projects.moveDisk",
+     "path": "{project}/moveDisk",
+     "httpMethod": "POST",
+     "description": "Moves a persistent disk from one zone to another.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID for 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": "DiskMoveRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
+    "moveInstance": {
+     "id": "compute.projects.moveInstance",
+     "path": "{project}/moveInstance",
+     "httpMethod": "POST",
+     "description": "Moves an instance and its attached persistent disks from one zone to another.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID for 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": "InstanceMoveRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "setCommonInstanceMetadata": {
      "id": "compute.projects.setCommonInstanceMetadata",
      "path": "{project}/setCommonInstanceMetadata",
@@ -7838,7 +7933,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7862,11 +7957,11 @@
      "id": "compute.projects.setUsageExportBucket",
      "path": "{project}/setUsageExportBucket",
      "httpMethod": "POST",
-     "description": "Sets usage export location",
+     "description": "Enables the usage export feature and sets the usage export bucket where reports are stored. If you provide an empty request body using this method, the usage export feature will be disabled.",
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7908,7 +8003,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -7946,7 +8041,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -8000,7 +8095,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -8038,7 +8133,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -8091,7 +8186,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -9528,7 +9623,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -9566,7 +9661,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -9620,7 +9715,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -9658,7 +9753,7 @@
      "parameters": {
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
@@ -9711,7 +9806,7 @@
       },
       "project": {
        "type": "string",
-       "description": "Name of the project scoping this request.",
+       "description": "Project ID for 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"
diff --git a/compute/v1/compute-gen.go b/compute/v1/compute-gen.go
index 4461872..25cae23 100644
--- a/compute/v1/compute-gen.go
+++ b/compute/v1/compute-gen.go
@@ -98,8 +98,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Addresses *AddressesService
 
@@ -156,6 +157,13 @@
 	Zones *ZonesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAddressesService(s *Service) *AddressesService {
 	rs := &AddressesService{s: s}
 	return rs
@@ -400,186 +408,247 @@
 }
 
 type AccessConfig struct {
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#accessConfig
+	// for access configs.
 	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.
+	// an unused static external IP address available to the project or
+	// leave this field undefined to use an IP from a shared ephemeral IP
+	// address pool. If you specify a static external IP address, it must
+	// live in the same region as the zone of the instance.
 	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: The type of configuration. The default and only option is
+	// ONE_TO_ONE_NAT.
 	Type string `json:"type,omitempty"`
 }
 
 type Address struct {
-	// Address: The IP address represented by this resource.
+	// Address: The static external IP address represented by this resource.
 	Address string `json:"address,omitempty"`
 
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#address for
+	// addresses.
 	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.
+	// RFC1035. Specifically, the name must be 1-63 characters long and
+	// match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means
+	// the first character must be a lowercase letter, and all following
+	// characters must be a dash, lowercase letter, or digit, except the
+	// last character, which cannot be a dash.
 	Name string `json:"name,omitempty"`
 
-	// Region: URL of the region where the regional address resides (output
-	// only). This field is not applicable to global addresses.
+	// Region: [Output Only] URL of the region where the regional address
+	// resides. This field is not applicable to global addresses.
 	Region string `json:"region,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
-	// Status: The status of the address (output only).
+	// Status: [Output Only] The status of the address, which can be either
+	// IN_USE or RESERVED. An address that is RESERVED is currently reserved
+	// and available to use. An IN_USE address is currently being used by
+	// another resource and is not available.
 	Status string `json:"status,omitempty"`
 
-	// Users: The resources that are using this address resource.
+	// Users: [Output Only] The URLs of the resources that are using this
+	// address.
 	Users []string `json:"users,omitempty"`
 }
 
 type AddressAggregatedList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A map of scoped address lists.
+	// Items: [Output Only] A map of scoped address lists.
 	Items map[string]AddressesScopedList `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always
+	// compute#addressAggregatedList for aggregated lists of addresses.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type AddressList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of Address resources.
+	// Items: [Output Only] A list of Address resources.
 	Items []*Address `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#addressList for
+	// lists of addresses.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type AddressesScopedList struct {
-	// Addresses: List of addresses contained in this scope.
+	// Addresses: [Output Only] 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: [Output Only] 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: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*AddressesScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type AddressesScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
 type AttachedDisk struct {
-	// AutoDelete: Whether the disk will be auto-deleted when the instance
-	// is deleted (but not when the disk is detached from the instance).
+	// AutoDelete: Specifies whether the disk will be auto-deleted when the
+	// instance is deleted (but not when the disk is detached from the
+	// instance).
 	AutoDelete bool `json:"autoDelete,omitempty"`
 
-	// Boot: Indicates that this is a boot disk. VM will use the first
-	// partition of the disk for its root filesystem.
+	// Boot: Indicates that this is a boot disk. The virtual machine 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
+	// DeviceName: Specifies a unique device name of your choice 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.
+	// within the instance. This name can be used to reference the device
+	// for mounting, resizing, and so on, from within the instance.
+	//
+	// If not
+	// specified, the server chooses a default device name to apply to this
+	// disk, in the form persistent-disks-x, where x is a number assigned by
+	// Google Compute Engine. This field is only applicable for persistent
+	// disks.
 	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: Assigns a zero-based index to this disk, where 0 is reserved
+	// for the boot disk. For example, if you have many disks attached to an
+	// instance, each disk would have a unique index number. If not
+	// specified, the server will choose an appropriate value.
 	Index int64 `json:"index,omitempty"`
 
-	// InitializeParams: Initialization parameters.
+	// InitializeParams: [Input Only] Specifies the parameters for a new
+	// disk that will be created alongside the new instance. Use
+	// initialization parameters to create boot disks or local SSDs attached
+	// to the new instance.
+	//
+	// This property is mutually exclusive with the
+	// source property; you can only define one or the other, but not both.
 	InitializeParams *AttachedDiskInitializeParams `json:"initializeParams,omitempty"`
 
 	Interface string `json:"interface,omitempty"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#attachedDisk
+	// for attached disks.
 	Kind string `json:"kind,omitempty"`
 
-	// Licenses: Public visible licenses.
+	// Licenses: [Output Only] Any valid publicly visible licenses.
 	Licenses []string `json:"licenses,omitempty"`
 
-	// Mode: The mode in which to attach this disk, either "READ_WRITE" or
-	// "READ_ONLY".
+	// Mode: The mode in which to attach this disk, either READ_WRITE or
+	// READ_ONLY. If not specified, the default is to attach the disk in
+	// READ_WRITE mode.
 	Mode string `json:"mode,omitempty"`
 
-	// Source: Persistent disk only; the URL of the persistent disk
-	// resource.
+	// Source: Specifies a valid partial or full URL to an existing
+	// Persistent Disk resource. This field is only applicable for
+	// persistent disks.
 	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: Specifies the type of the disk, either SCRATCH or PERSISTENT.
+	// If not specified, the default is PERSISTENT.
 	Type string `json:"type,omitempty"`
 }
 
 type AttachedDiskInitializeParams struct {
-	// DiskName: Name of the disk (when not provided defaults to the name of
-	// the instance).
+	// DiskName: Specifies the disk name. If not specified, the default is
+	// to use the name of the instance.
 	DiskName string `json:"diskName,omitempty"`
 
-	// DiskSizeGb: Size of the disk in base-2 GB.
+	// DiskSizeGb: Specifies the size of the disk in base-2 GB.
 	DiskSizeGb int64 `json:"diskSizeGb,omitempty,string"`
 
-	// DiskType: URL of the disk type resource describing which disk type to
-	// use to create the disk; provided by the client when the disk is
-	// created.
+	// DiskType: Specifies the disk type to use to create the instance. If
+	// not specified, the default is pd-standard, specified using the full
+	// URL. For
+	// example:
+	//
+	// https://www.googleapis.com/compute/v1/projects/project/zones
+	// /zone/diskTypes/pd-standard
+	//
+	// Other values include pd-ssd and
+	// local-ssd. If you define this field, you can provide either the full
+	// or partial URL. For example, the following are valid values:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/zones/zone/disk
+	// Types/diskType
+	// - projects/project/zones/zone/diskTypes/diskType
+	// -
+	// zones/zone/diskTypes/diskType
 	DiskType string `json:"diskType,omitempty"`
 
-	// SourceImage: The source image used to create this disk.
+	// SourceImage: A source image used to create the disk. You can provide
+	// a private (custom) image, and Compute Engine will use the
+	// corresponding image from your project. For
+	// example:
+	//
+	// global/images/my-private-image
+	//
+	// Or you can provide an
+	// image from a publicly-available project. For example, to use a Debian
+	// image from the debian-cloud project, make sure to include the project
+	// in the
+	// URL:
+	//
+	// projects/debian-cloud/global/images/debian-7-wheezy-vYYYYMMDD
+	//
+	//
+	// where vYYYYMMDD is the image version. The fully-qualified URL will
+	// also work in both cases.
 	SourceImage string `json:"sourceImage,omitempty"`
 }
 
@@ -714,248 +783,326 @@
 	// 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: The URL of the suggested replacement for a deprecated
+	// resource. The suggested replacement resource must be the same kind of
+	// resource as the deprecated resource.
 	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: The deprecation state of this resource. This 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. Operations which use OBSOLETE or DELETED resources
+	// will be rejected and result in an error.
 	State string `json:"state,omitempty"`
 }
 
 type Disk struct {
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#disk for
+	// disks.
 	Kind string `json:"kind,omitempty"`
 
-	// Licenses: Public visible licenses.
+	// Licenses: Any applicable publicly visible licenses.
 	Licenses []string `json:"licenses,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.
+	// RFC1035. Specifically, the name must be 1-63 characters long and
+	// match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means
+	// the first character must be a lowercase letter, and all following
+	// characters must be a dash, lowercase letter, or digit, except the
+	// last character, which cannot be a dash.
 	Name string `json:"name,omitempty"`
 
 	// Options: Internal use only.
 	Options string `json:"options,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server-defined fully-qualified URL for this
+	// resource.
 	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: Size of the persistent disk, specified in GB. You can specify
+	// this field when creating a persistent disk using the sourceImage or
+	// sourceSnapshot parameter, or specify it alone to create an empty
+	// persistent disk.
+	//
+	// If you specify this field along with sourceImage or
+	// sourceSnapshot, the value of sizeGb must not be less than the size of
+	// the sourceImage or the size of the snapshot.
 	SizeGb int64 `json:"sizeGb,omitempty,string"`
 
-	// SourceImage: The source image used to create this disk.
+	// SourceImage: The source image used to create this disk. If the source
+	// image is deleted from the system, this field will not be set, even if
+	// an image with the same name has been re-created.
+	//
+	// When creating a
+	// disk, you can provide a private (custom) image using the following
+	// input, and Compute Engine will use the corresponding image from your
+	// project. For example:
+	//
+	// global/images/my-private-image
+	//
+	// Or you can
+	// provide an image from a publicly-available project. For example, to
+	// use a Debian image from the debian-cloud project, make sure to
+	// include the project in the
+	// URL:
+	//
+	// projects/debian-cloud/global/images/debian-7-wheezy-vYYYYMMDD
+	//
+	//
+	// where vYYYYMMDD is the image version. The fully-qualified URL will
+	// also work in both cases.
 	SourceImage string `json:"sourceImage,omitempty"`
 
-	// SourceImageId: The 'id' value of the image 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 image.
+	// SourceImageId: The ID value of the image used to create this disk.
+	// This value identifies the exact image that was used to create this
+	// persistent disk. For example, if you created the persistent disk from
+	// an image that was later deleted and recreated under the same name,
+	// the source image ID would identify the exact version of the image
+	// that was used.
 	SourceImageId string `json:"sourceImageId,omitempty"`
 
-	// SourceSnapshot: The source snapshot used to create this disk.
+	// SourceSnapshot: The source snapshot used to create this disk. You can
+	// provide this as a partial or full URL to the resource. For example,
+	// the following are valid values:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/global/snapshot
+	// s/snapshot
+	// - projects/project/global/snapshots/snapshot
+	// -
+	// global/snapshots/snapshot
 	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: [Output Only] The unique ID of the snapshot used to
+	// create this disk. This value identifies the exact snapshot that was
+	// used to create this persistent disk. For example, if you created the
+	// persistent disk from a snapshot that was later deleted and recreated
+	// under the same name, the source snapshot ID would identify the exact
+	// version of the snapshot that was used.
 	SourceSnapshotId string `json:"sourceSnapshotId,omitempty"`
 
-	// Status: The status of disk creation (output only).
+	// Status: [Output Only] The status of disk creation. Applicable
+	// statuses includes: CREATING, FAILED, READY, RESTORING.
 	Status string `json:"status,omitempty"`
 
 	// Type: URL of the disk type resource describing which disk type to use
 	// to create the disk; provided by the client when the disk is created.
 	Type string `json:"type,omitempty"`
 
-	// Zone: URL of the zone where the disk resides (output only).
+	// Zone: [Output Only] URL of the zone where the disk resides.
 	Zone string `json:"zone,omitempty"`
 }
 
 type DiskAggregatedList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A map of scoped disk lists.
+	// Items: [Output Only] A map of scoped disk lists.
 	Items map[string]DisksScopedList `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always
+	// compute#diskAggregatedList for aggregated lists of persistent disks.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type DiskList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of Disk resources.
+	// Items: [Output Only] A list of persistent disks.
 	Items []*Disk `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#diskList for
+	// lists of disks.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
+type DiskMoveRequest struct {
+	// DestinationZone: The URL of the destination zone to move the disk to.
+	// This can be a full or partial URL. For example, the following are all
+	// valid URLs to a zone:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/zones/zone
+	// -
+	// projects/project/zones/zone
+	// - zones/zone
+	DestinationZone string `json:"destinationZone,omitempty"`
+
+	// TargetDisk: The URL of the target disk to move. This can be a full or
+	// partial URL. For example, the following are all valid URLs to a disk:
+	//
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/zones/zone/disk
+	// s/disk
+	// - projects/project/zones/zone/disks/disk
+	// -
+	// zones/zone/disks/disk
+	TargetDisk string `json:"targetDisk,omitempty"`
+}
+
 type DiskType struct {
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
-	// DefaultDiskSizeGb: Server defined default disk size in gb (output
-	// only).
+	// DefaultDiskSizeGb: [Output Only] Server defined default disk size in
+	// GB.
 	DefaultDiskSizeGb int64 `json:"defaultDiskSizeGb,omitempty,string"`
 
-	// Deprecated: The deprecation status associated with this disk type.
+	// Deprecated: [Output Only] The deprecation status associated with this
+	// disk type.
 	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
 
-	// Description: An optional textual description of the resource.
+	// Description: [Output Only] 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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#diskType for
+	// disk types.
 	Kind string `json:"kind,omitempty"`
 
-	// Name: Name of the resource.
+	// Name: [Output Only] Name of the resource.
 	Name string `json:"name,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
-	// ValidDiskSize: An optional textual descroption of the valid disk
-	// size, e.g., "10GB-10TB".
+	// ValidDiskSize: [Output Only] An optional textual description of the
+	// valid disk size, such as "10GB-10TB".
 	ValidDiskSize string `json:"validDiskSize,omitempty"`
 
-	// Zone: Url of the zone where the disk type resides (output only).
+	// Zone: [Output Only] URL of the zone where the disk type resides.
 	Zone string `json:"zone,omitempty"`
 }
 
 type DiskTypeAggregatedList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A map of scoped disk type lists.
+	// Items: [Output Only] A map of scoped disk type lists.
 	Items map[string]DiskTypesScopedList `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always
+	// compute#diskTypeAggregatedList.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type DiskTypeList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of DiskType resources.
+	// Items: [Output Only] A list of Disk Type resources.
 	Items []*DiskType `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#diskTypeList for
+	// disk types.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type DiskTypesScopedList struct {
-	// DiskTypes: List of disk types contained in this scope.
+	// DiskTypes: [Output Only] List of disk types contained in this scope.
 	DiskTypes []*DiskType `json:"diskTypes,omitempty"`
 
-	// Warning: Informational warning which replaces the list of disk types
-	// when the list is empty.
+	// Warning: [Output Only] Informational warning which replaces the list
+	// of disk types when the list is empty.
 	Warning *DiskTypesScopedListWarning `json:"warning,omitempty"`
 }
 
 type DiskTypesScopedListWarning struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*DiskTypesScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type DiskTypesScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
 type DisksScopedList struct {
-	// Disks: List of disks contained in this scope.
+	// Disks: [Output Only] 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: [Output Only] 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: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*DisksScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type DisksScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -965,85 +1112,111 @@
 	// connection.
 	Allowed []*FirewallAllowed `json:"allowed,omitempty"`
 
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339text
+	// format.
 	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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Ony] Type of the resource. Always compute#firewall for
+	// firewall rules.
 	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.
+	// RFC1035. Specifically, the name must be 1-63 characters long and
+	// match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means
+	// the first character must be a lowercase letter, and all following
+	// characters must be a dash, lowercase letter, or digit, except the
+	// last character, which cannot be a dash.
 	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: URL of the network resource for this firewall rule. This
+	// field is required for creating an instance but optional when creating
+	// a firewall rule. If not specified when creating a firewall rule, the
+	// default network is used:
+	// global/networks/default
+	// If you choose to
+	// specify this property, you can specify the network as a full or
+	// partial URL. For example, the following are all valid URLs:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/myproject/global/networ
+	// ks/my-network
+	// - projects/myproject/global/networks/my-network
+	// -
+	// global/networks/default
 	Network string `json:"network,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	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: The IP address blocks that this rule applies to,
+	// expressed in CIDR format. One or both of sourceRanges and sourceTags
+	// may be set.
+	//
+	// If both properties are set, an inbound connection is
+	// allowed if the range or the tag of the source matches the
+	// sourceRanges OR matches the sourceTags property; the connection does
+	// not need to match both properties.
 	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.
+	// or both of sourceRanges and sourceTags may be set.
+	//
+	// If both
+	// properties are set, an inbound connection is allowed if the range or
+	// the tag of the source matches the sourceRanges OR matches the
+	// sourceTags property; the connection does not need to match both
+	// properties.
 	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.
+	// 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 one of the following well known
-	// protocol strings ["tcp", "udp", "icmp", "esp", "ah", "sctp"], or the
-	// IP protocol number.
+	// IPProtocol: The IP protocol that is allowed for this rule. The
+	// protocol type is required when creating a firewall. This value can
+	// either be one of the following well known protocol strings (tcp, udp,
+	// icmp, esp, ah, sctp), 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.
+	// Ports: An optional list of ports which are allowed. This field is
+	// only applicable for UDP or TCP protocol. 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"].
+	// 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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of Firewall resources.
+	// Items: [Output Only] A list of Firewall resources.
 	Items []*Firewall `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#firewallList for
+	// lists of firewalls.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
@@ -1150,21 +1323,22 @@
 }
 
 type ForwardingRulesScopedListWarning struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*ForwardingRulesScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type ForwardingRulesScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -1279,8 +1453,8 @@
 	// Cloud Storage (in bytes).
 	ArchiveSizeBytes int64 `json:"archiveSizeBytes,omitempty,string"`
 
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
 	// Deprecated: The deprecation status associated with this image.
@@ -1290,56 +1464,69 @@
 	// client when the resource is created.
 	Description string `json:"description,omitempty"`
 
-	// DiskSizeGb: Size of the image when restored onto a disk (in GiB).
+	// DiskSizeGb: Size of the image when restored onto a persistent disk
+	// (in GB).
 	DiskSizeGb int64 `json:"diskSizeGb,omitempty,string"`
 
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#image for
+	// images.
 	Kind string `json:"kind,omitempty"`
 
-	// Licenses: Public visible licenses.
+	// Licenses: Any applicable publicly visible licenses.
 	Licenses []string `json:"licenses,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.
+	// RFC1035. Specifically, the name must be 1-63 characters long and
+	// match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means
+	// the first character must be a lowercase letter, and all following
+	// characters must be a dash, lowercase letter, or digit, except the
+	// last character, which cannot be a dash.
 	Name string `json:"name,omitempty"`
 
-	// RawDisk: The raw disk image parameters.
+	// RawDisk: The parameters of the raw disk image.
 	RawDisk *ImageRawDisk `json:"rawDisk,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
-	// SourceDisk: The source disk used to create this image.
+	// SourceDisk: URL of the The source disk used to create this image.
+	// This can be a full or valid partial URL. You must provide either this
+	// property or the rawDisk.source property but not both to create an
+	// image. For example, the following are valid values:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/zones/zone/disk
+	// /disk
+	// - projects/project/zones/zone/disk/disk
+	// -
+	// zones/zone/disks/disk
 	SourceDisk string `json:"sourceDisk,omitempty"`
 
-	// SourceDiskId: The 'id' value of the disk used to create this image.
+	// SourceDiskId: The ID value of the disk used to create this image.
 	// This value may be used to determine whether the image was taken from
 	// the current or a previous instance of a given disk name.
 	SourceDiskId string `json:"sourceDiskId,omitempty"`
 
-	// SourceType: Must be "RAW"; provided by the client when the disk image
-	// is created.
+	// SourceType: The type of the image used to create this disk. The
+	// default and only value is RAW
 	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: [Output Only] The status of the image. An image can be used
+	// to create other resources, such as instances, only after the image
+	// has been successfully created and the status is set to READY.
+	// Possible values are FAILED, PENDING, or 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.
+	// device, which 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
@@ -1347,7 +1534,8 @@
 	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.
+	// stored. You must provide either this property or the sourceDisk
+	// property but not both.
 	Source string `json:"source,omitempty"`
 }
 
@@ -1371,15 +1559,14 @@
 }
 
 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: Allows this instance to send and receive packets with
+	// non-matching destination or source IPs. This is required if you plan
+	// to use this instance to forward routes. For more information, see
+	// Enabling IP Forwarding.
 	CanIpForward bool `json:"canIpForward,omitempty"`
 
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
 	// Description: An optional textual description of the resource;
@@ -1390,104 +1577,137 @@
 	// 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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#instance for
+	// instances.
 	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: Full or partial URL of the machine type resource to use
+	// for this instance. This is provided by the client when the instance
+	// is created. For example, the following is a valid partial
+	// url:
+	//
+	// zones/zone/machineTypes/machine-type
 	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: The metadata key/value pairs assigned to this instance.
+	// This includes custom metadata and predefined keys.
 	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.
+	// RFC1035. Specifically, the name must be 1-63 characters long and
+	// match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means
+	// the first character must be a lowercase letter, and all following
+	// characters must be a dash, lowercase letter, or digit, except the
+	// last character, which cannot be a dash.
 	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: An 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.
 	NetworkInterfaces []*NetworkInterface `json:"networkInterfaces,omitempty"`
 
 	// Scheduling: Scheduling options for this instance.
 	Scheduling *Scheduling `json:"scheduling,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	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: A list of service accounts, with their specified
+	// scopes, authorized for this instance. Service accounts generate
+	// access tokens that can be accessed through the metadata server and
+	// used to authenticate applications on the instance. See Authenticating
+	// from Google Compute Engine for more information.
 	ServiceAccounts []*ServiceAccount `json:"serviceAccounts,omitempty"`
 
-	// Status: Instance status. One of the following values: "PROVISIONING",
-	// "STAGING", "RUNNING", "STOPPING", "STOPPED", "TERMINATED" (output
-	// only).
+	// Status: [Output Only] The status of the instance. One of the
+	// following values: PROVISIONING, STAGING, RUNNING, STOPPING, STOPPED,
+	// TERMINATED.
 	Status string `json:"status,omitempty"`
 
-	// StatusMessage: An optional, human-readable explanation of the status
-	// (output only).
+	// StatusMessage: [Output Only] An optional, human-readable explanation
+	// of the status.
 	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: A list of tags to appy to this instance. Tags are used to
+	// identify valid sources or targets for network firewalls and are
+	// specified by the client during 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: [Output Only] URL of the zone where the instance resides.
 	Zone string `json:"zone,omitempty"`
 }
 
 type InstanceAggregatedList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A map of scoped instance lists.
+	// Items: [Output Only] A map of scoped instance lists.
 	Items map[string]InstancesScopedList `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always
+	// compute#instanceAggregatedList for aggregated lists of Instance
+	// resources.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type InstanceList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of Instance resources.
+	// Items: [Output Only] A list of Instance resources.
 	Items []*Instance `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#instanceList for
+	// lists of Instance resources.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
+type InstanceMoveRequest struct {
+	// DestinationZone: The URL of the destination zone to move the instance
+	// to. This can be a full or partial URL. For example, the following are
+	// all valid URLs to a zone:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/zones/zone
+	// -
+	// projects/project/zones/zone
+	// - zones/zone
+	DestinationZone string `json:"destinationZone,omitempty"`
+
+	// TargetInstance: The URL of the target instance to move. This can be a
+	// full or partial URL. For example, the following are all valid URLs to
+	// an instance:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/zones/zone/inst
+	// ances/instance
+	// - projects/project/zones/zone/instances/instance
+	// -
+	// zones/zone/instances/instance
+	TargetInstance string `json:"targetInstance,omitempty"`
+}
+
 type InstanceProperties struct {
 	// CanIpForward: Allows instances created based on this template to send
 	// packets with source IP addresses other than their own and receive
@@ -1595,30 +1815,31 @@
 }
 
 type InstancesScopedList struct {
-	// Instances: List of instances contained in this scope.
+	// Instances: [Output Only] 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: [Output Only] 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: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*InstancesScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type InstancesScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -1627,15 +1848,15 @@
 	// running software that contains this license on an instance.
 	ChargesUseFee bool `json:"chargesUseFee,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#license for
+	// licenses.
 	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: Name of the resource. The name must be 1-63 characters long,
+	// and comply with RCF1035.
 	Name string `json:"name,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
@@ -1644,40 +1865,45 @@
 	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
-	// Deprecated: The deprecation status associated with this machine type.
+	// Deprecated: [Output Only] The deprecation status associated with this
+	// machine type.
 	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
 
-	// Description: An optional textual description of the resource.
+	// Description: [Output Only] An optional textual description of the
+	// resource.
 	Description string `json:"description,omitempty"`
 
-	// GuestCpus: Count of CPUs exposed to the instance.
+	// GuestCpus: [Output Only] The tumber of CPUs exposed to the instance.
 	GuestCpus int64 `json:"guestCpus,omitempty"`
 
 	// Id: [Output Only] Unique identifier for the resource; defined by the
 	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// ImageSpaceGb: Space allotted for the image, defined in GB.
+	// ImageSpaceGb: [Deprecated] This property is deprecated and will never
+	// be populated with any relevant values.
 	ImageSpaceGb int64 `json:"imageSpaceGb,omitempty"`
 
 	// Kind: Type of the resource.
 	Kind string `json:"kind,omitempty"`
 
-	// MaximumPersistentDisks: Maximum persistent disks allowed.
+	// MaximumPersistentDisks: [Output Only] Maximum persistent disks
+	// allowed.
 	MaximumPersistentDisks int64 `json:"maximumPersistentDisks,omitempty"`
 
-	// MaximumPersistentDisksSizeGb: Maximum total persistent disks size
-	// (GB) allowed.
+	// MaximumPersistentDisksSizeGb: [Output Only] Maximum total persistent
+	// disks size (GB) allowed.
 	MaximumPersistentDisksSizeGb int64 `json:"maximumPersistentDisksSizeGb,omitempty,string"`
 
-	// MemoryMb: Physical memory assigned to the instance, defined in MB.
+	// MemoryMb: [Output Only] The amount of physical memory available to
+	// the instance, defined in MB.
 	MemoryMb int64 `json:"memoryMb,omitempty"`
 
-	// Name: Name of the resource.
+	// Name: [Output Only] Name of the resource.
 	Name string `json:"name,omitempty"`
 
-	// ScratchDisks: List of extended scratch disks assigned to the
-	// instance.
+	// ScratchDisks: [Output Only] List of extended scratch disks assigned
+	// to the instance.
 	ScratchDisks []*MachineTypeScratchDisks `json:"scratchDisks,omitempty"`
 
 	// SelfLink: [Output Only] Server defined URL for the resource.
@@ -1698,78 +1924,87 @@
 	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A map of scoped machine type lists.
+	// Items: [Output Only] A map of scoped machine type lists.
 	Items map[string]MachineTypesScopedList `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always
+	// compute#machineTypeAggregatedList for aggregated lists of machine
+	// types.
 	Kind string `json:"kind,omitempty"`
 
 	// NextPageToken: [Output Only] A token used to continue a truncated
 	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type MachineTypeList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of MachineType resources.
+	// Items: [Output Only] A list of Machine Type resources.
 	Items []*MachineType `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#machineTypeList
+	// for lists of machine types.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type MachineTypesScopedList struct {
-	// MachineTypes: List of machine types contained in this scope.
+	// MachineTypes: [Output Only] List of machine types contained in this
+	// scope.
 	MachineTypes []*MachineType `json:"machineTypes,omitempty"`
 
-	// Warning: An informational warning that appears when the machine types
-	// list is empty.
+	// Warning: [Output Only] An informational warning that appears when the
+	// machine types list is empty.
 	Warning *MachineTypesScopedListWarning `json:"warning,omitempty"`
 }
 
 type MachineTypesScopedListWarning struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*MachineTypesScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type MachineTypesScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] 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: Specifies a fingerprint for this request, which is
+	// essentially a hash of the metadata's contents and used for optimistic
+	// locking. The fingerprint is initially generated by Compute Engine and
+	// changes after every request to modify or update metadata. You must
+	// always provide an up-to-date fingerprint hash in order to update or
+	// change 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: [Output Only] Type of the resource. Always compute#metadata for
+	// metadata.
 	Kind string `json:"kind,omitempty"`
 }
 
@@ -1789,97 +2024,123 @@
 }
 
 type Network struct {
-	// IPv4Range: Required; The range of internal addresses that are legal
-	// on this network. This range is a CIDR specification, for example:
+	// IPv4Range: 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: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	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: A gateway address for default routing to other networks.
+	// This value is read only and is selected by the Google Compute Engine,
+	// typically as the first usable address in the IPv4Range.
 	GatewayIPv4 string `json:"gatewayIPv4,omitempty"`
 
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#network for
+	// networks.
 	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.
+	// RFC1035. Specifically, the name must be 1-63 characters long and
+	// match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means
+	// the first character must be a lowercase letter, and all following
+	// characters must be a dash, lowercase letter, or digit, except the
+	// last character, which cannot be a dash.
 	Name string `json:"name,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	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: An array of configurations for this interface.
+	// Currently, <codeONE_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: [Output Only] The name of the network interface, generated by
+	// the server. For network devices, these are eth0, eth1, etc.
 	Name string `json:"name,omitempty"`
 
-	// Network: URL of the network resource attached to this interface.
+	// Network: URL of the network resource for this instance. This is
+	// required for creating an instance but optional when creating a
+	// firewall rule. If not specified when creating a firewall rule, the
+	// default network is used:
+	//
+	// global/networks/default
+	//
+	// If you specify
+	// this property, you can specify the network as a full or partial URL.
+	// For example, the following are all valid URLs:
+	// -
+	// https://www.googleapis.com/compute/v1/projects/project/global/networks
+	// /network
+	// - projects/project/global/networks/network
+	// -
+	// global/networks/default
 	Network string `json:"network,omitempty"`
 
-	// NetworkIP: An optional IPV4 internal network address assigned to the
-	// instance for this network interface (output only).
+	// NetworkIP: [Output Only] An optional IPV4 internal network address
+	// assigned to the instance for this network interface.
 	NetworkIP string `json:"networkIP,omitempty"`
 }
 
 type NetworkList struct {
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of Network resources.
+	// Items: [Output Only] A list of Network resources.
 	Items []*Network `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#networkList for
+	// lists of networks.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource .
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
 type Operation struct {
+	// ClientOperationId: [Output Only] An optional identifier specified by
+	// the client when the mutation was initiated. Must be unique for all
+	// operation resources in the project
 	ClientOperationId string `json:"clientOperationId,omitempty"`
 
 	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
-	// format (output only).
+	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
+	// EndTime: [Output Only] The time that this operation was completed.
+	// This is in RFC3339 text format.
 	EndTime string `json:"endTime,omitempty"`
 
-	// Error: [Output Only] If errors occurred during processing of this
+	// Error: [Output Only] If errors are generated during processing of the
 	// operation, this field will be populated.
 	Error *OperationError `json:"error,omitempty"`
 
+	// HttpErrorMessage: [Output Only] If the operation fails, this field
+	// contains the HTTP error message that was returned, such as NOT FOUND.
 	HttpErrorMessage string `json:"httpErrorMessage,omitempty"`
 
+	// HttpErrorStatusCode: [Output Only] If the operation fails, this field
+	// contains the HTTP error message that was returned, such as 404.
 	HttpErrorStatusCode int64 `json:"httpErrorStatusCode,omitempty"`
 
 	// Id: [Output Only] Unique identifier for the resource; defined by the
@@ -1887,53 +2148,63 @@
 	Id uint64 `json:"id,omitempty,string"`
 
 	// InsertTime: [Output Only] The time that this operation was requested.
-	// This is in RFC 3339 format.
+	// This is in RFC3339 text format.
 	InsertTime string `json:"insertTime,omitempty"`
 
-	// Kind: [Output Only] Type of the resource. Always kind#operation for
-	// Operation resources.
+	// Kind: [Output Only] Type of the resource. Always compute#Operation
+	// for Operation resources.
 	Kind string `json:"kind,omitempty"`
 
-	// Name: [Output Only] Name of the resource (output only).
+	// Name: [Output Only] Name of the resource.
 	Name string `json:"name,omitempty"`
 
+	// OperationType: [Output Only] Type of the operation, such as insert,
+	// update, and delete.
 	OperationType string `json:"operationType,omitempty"`
 
+	// Progress: [Output Only] 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.
 	Progress int64 `json:"progress,omitempty"`
 
-	// Region: [Output Only] URL of the region where the operation resides
-	// (output only).
+	// Region: [Output Only] URL of the region where the operation resides.
+	// Only applicable for regional resources.
 	Region string `json:"region,omitempty"`
 
 	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
 	// StartTime: [Output Only] The time that this operation was started by
-	// the server. This is in RFC 3339 format.
+	// the server. This is in RFC3339 text format.
 	StartTime string `json:"startTime,omitempty"`
 
 	// Status: [Output Only] Status of the operation. Can be one of the
-	// following: "PENDING", "RUNNING", or "DONE".
+	// following: PENDING, RUNNING, or DONE.
 	Status string `json:"status,omitempty"`
 
 	// StatusMessage: [Output Only] An optional textual description of the
 	// current status of the operation.
 	StatusMessage string `json:"statusMessage,omitempty"`
 
-	// TargetId: [Output Only] Unique target id which identifies a
+	// TargetId: [Output Only] Unique target ID which identifies a
 	// particular incarnation of the target.
 	TargetId uint64 `json:"targetId,omitempty,string"`
 
 	// TargetLink: [Output Only] URL of the resource the operation is
-	// mutating (output only).
+	// mutating.
 	TargetLink string `json:"targetLink,omitempty"`
 
+	// User: [Output Only] User who requested the operation, for example:
+	// user@example.com.
 	User string `json:"user,omitempty"`
 
+	// Warnings: [Output Only] If warning messages are generated during
+	// processing of the operation, this field will be populated.
 	Warnings []*OperationWarnings `json:"warnings,omitempty"`
 
-	// Zone: [Output Only] URL of the zone where the operation resides
-	// (output only).
+	// Zone: [Output Only] URL of the zone where the operation resides.
 	Zone string `json:"zone,omitempty"`
 }
 
@@ -1956,21 +2227,22 @@
 }
 
 type OperationWarnings struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*OperationWarningsData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type OperationWarningsData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -1982,7 +2254,8 @@
 	// Items: [Output Only] A map of scoped operation lists.
 	Items map[string]OperationsScopedList `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always
+	// compute#operationAggregatedList for aggregated lists of operations.
 	Kind string `json:"kind,omitempty"`
 
 	// NextPageToken: [Output Only] A token used to continue a truncated
@@ -2001,8 +2274,8 @@
 	// Items: [Output Only] The operation resources.
 	Items []*Operation `json:"items,omitempty"`
 
-	// Kind: Type of resource. Always compute#operations for Operations
-	// resource.
+	// Kind: [Output Only] Type of resource. Always compute#operations for
+	// Operations resource.
 	Kind string `json:"kind,omitempty"`
 
 	// NextPageToken: [Output Only] A token used to continue a truncate.
@@ -2022,21 +2295,22 @@
 }
 
 type OperationsScopedListWarning struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*OperationsScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type OperationsScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -2069,30 +2343,32 @@
 
 type Project struct {
 	// CommonInstanceMetadata: Metadata key/value pairs available to all
-	// instances contained in this project.
+	// instances contained in this project. See Custom metadata for more
+	// information.
 	CommonInstanceMetadata *Metadata `json:"commonInstanceMetadata,omitempty"`
 
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#project for
+	// projects.
 	Kind string `json:"kind,omitempty"`
 
 	// Name: Name of the resource.
 	Name string `json:"name,omitempty"`
 
-	// Quotas: Quotas assigned to this project.
+	// Quotas: [Output Only] Quotas assigned to this project.
 	Quotas []*Quota `json:"quotas,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
 	// UsageExportLocation: The location in Cloud Storage and naming method
@@ -2101,67 +2377,70 @@
 }
 
 type Quota struct {
-	// Limit: Quota limit for this metric.
+	// Limit: [Output Only] Quota limit for this metric.
 	Limit float64 `json:"limit,omitempty"`
 
-	// Metric: Name of the quota metric.
+	// Metric: [Output Only] Name of the quota metric.
 	Metric string `json:"metric,omitempty"`
 
-	// Usage: Current usage of this metric.
+	// Usage: [Output Only] Current usage of this metric.
 	Usage float64 `json:"usage,omitempty"`
 }
 
 type Region struct {
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
-	// Deprecated: The deprecation status associated with this region.
+	// Deprecated: [Output Only] The deprecation status associated with this
+	// region.
 	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
 
-	// Description: Textual description of the resource.
+	// Description: [Output Only] Textual description of the resource.
 	Description string `json:"description,omitempty"`
 
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server .
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always compute#region for
+	// regions.
 	Kind string `json:"kind,omitempty"`
 
-	// Name: Name of the resource.
+	// Name: [Output Only] Name of the resource.
 	Name string `json:"name,omitempty"`
 
-	// Quotas: Quotas assigned to this region.
+	// Quotas: [Output Only] Quotas assigned to this region.
 	Quotas []*Quota `json:"quotas,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
-	// Status: Status of the region, "UP" or "DOWN".
+	// Status: [Output Only] Status of the region, either UP or DOWN.
 	Status string `json:"status,omitempty"`
 
-	// Zones: A list of zones homed in this region, in the form of resource
-	// URLs.
+	// Zones: [Output Only] A list of zones available 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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of Region resources.
+	// Items: [Output Only] A list of Region resources.
 	Items []*Region `json:"items,omitempty"`
 
-	// Kind: Type of resource.
+	// Kind: [Output Only] Type of resource. Always compute#regionList for
+	// lists of regions.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: A token used to continue a truncated list request
-	// (output only).
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
-	// SelfLink: Server defined URL for this resource (output only).
+	// SelfLink: [Output Only] Server defined URL for this resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
@@ -2231,21 +2510,22 @@
 }
 
 type RouteWarnings struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*RouteWarningsData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type RouteWarningsData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -2269,25 +2549,26 @@
 }
 
 type Scheduling struct {
-	// AutomaticRestart: Whether the Instance should be automatically
-	// restarted whenever it is terminated by Compute Engine (not terminated
-	// by user).
+	// AutomaticRestart: Specifies whether the instance should be
+	// automatically restarted if it is terminated by Compute Engine (not
+	// terminated by a user).
 	AutomaticRestart bool `json:"automaticRestart,omitempty"`
 
-	// OnHostMaintenance: How the instance should behave when the host
-	// machine undergoes maintenance that may temporarily impact instance
-	// performance.
+	// OnHostMaintenance: Defines the maintenance behavior for this
+	// instance. The default behavior is MIGRATE. For more information, see
+	// Setting maintenance behavior.
 	OnHostMaintenance string `json:"onHostMaintenance,omitempty"`
 }
 
 type SerialPortOutput struct {
-	// Contents: The contents of the console output.
+	// Contents: [Output Only] The contents of the console output.
 	Contents string `json:"contents,omitempty"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always
+	// compute#serialPortOutput for serial port output.
 	Kind string `json:"kind,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 }
 
@@ -2374,9 +2655,15 @@
 }
 
 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: Specifies a fingerprint for this request, which is
+	// essentially a hash of the metadata's contents and used for optimistic
+	// locking. The fingerprint is initially generated by Compute Engine and
+	// changes after every request to modify or update metadata. You must
+	// always provide an up-to-date fingerprint hash in order to update or
+	// change metadata.
+	//
+	// To see the latest fingerprint, make get() request
+	// to the instance.
 	Fingerprint string `json:"fingerprint,omitempty"`
 
 	// Items: An array of tags. Each tag must be 1-63 characters long, and
@@ -2517,21 +2804,22 @@
 }
 
 type TargetInstancesScopedListWarning struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*TargetInstancesScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type TargetInstancesScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -2695,21 +2983,22 @@
 }
 
 type TargetPoolsScopedListWarning struct {
-	// Code: The warning type identifier for this warning.
+	// Code: [Output Only] The warning type identifier for this warning.
 	Code string `json:"code,omitempty"`
 
-	// Data: Metadata for this warning in 'key: value' format.
+	// Data: [Output Only] Metadata for this warning in key: value format.
 	Data []*TargetPoolsScopedListWarningData `json:"data,omitempty"`
 
-	// Message: Optional human-readable details for this warning.
+	// Message: [Output Only] Optional human-readable details for this
+	// warning.
 	Message string `json:"message,omitempty"`
 }
 
 type TargetPoolsScopedListWarningData struct {
-	// Key: A key for the warning data.
+	// Key: [Output Only] A key for the warning data.
 	Key string `json:"key,omitempty"`
 
-	// Value: A warning data value corresponding to the key.
+	// Value: [Output Only] A warning data value corresponding to the key.
 	Value string `json:"value,omitempty"`
 }
 
@@ -2837,82 +3126,88 @@
 type UsageExportLocation struct {
 	// BucketName: The name of an existing bucket in Cloud Storage where the
 	// usage report object is stored. The Google Service Account is granted
-	// write access to this bucket. This is simply the bucket name, with no
-	// "gs://" or "https://storage.googleapis.com/" in front of it.
+	// write access to this bucket. This is just the bucket name, with no
+	// gs:// or https://storage.googleapis.com/ in front of it.
 	BucketName string `json:"bucketName,omitempty"`
 
 	// ReportNamePrefix: An optional prefix for the name of the usage report
-	// object stored in bucket_name. If not supplied, defaults to "usage_".
-	// The report is stored as a CSV file named _gce_.csv. where  is the day
-	// of the usage according to Pacific Time. The prefix should conform to
-	// Cloud Storage object naming conventions.
+	// object stored in bucketName. If not supplied, defaults to usage. The
+	// report is stored as a CSV file named
+	// report_name_prefix_gce_YYYYMMDD.csv where YYYYMMDD is the day of the
+	// usage according to Pacific Time. If you supply a prefix, it should
+	// conform to Cloud Storage object naming conventions.
 	ReportNamePrefix string `json:"reportNamePrefix,omitempty"`
 }
 
 type Zone struct {
-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
-	// only).
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
-	// Deprecated: The deprecation status associated with this zone.
+	// Deprecated: [Output Only] The deprecation status associated with this
+	// zone.
 	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
 
-	// Description: Textual description of the resource.
+	// Description: [Output Only] Textual description of the resource.
 	Description string `json:"description,omitempty"`
 
-	// Id: Unique identifier for the resource; defined by the server (output
-	// only).
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id uint64 `json:"id,omitempty,string"`
 
-	// Kind: Type of the resource.
+	// Kind: [Output Only] Type of the resource. Always kind#zone for zones.
 	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: [Output Only] Any scheduled maintenance windows
+	// for this zone. When the zone is in a maintenance window, all
+	// resources which reside in the zone will be unavailable. For more
+	// information, see Maintenance Windows
 	MaintenanceWindows []*ZoneMaintenanceWindows `json:"maintenanceWindows,omitempty"`
 
-	// Name: Name of the resource.
+	// Name: [Output Only] Name of the resource.
 	Name string `json:"name,omitempty"`
 
-	// Region: Full URL reference to the region which hosts the zone (output
-	// only).
+	// Region: [Output Only] Full URL reference to the region which hosts
+	// the zone.
 	Region string `json:"region,omitempty"`
 
-	// SelfLink: Server defined URL for the resource (output only).
+	// SelfLink: [Output Only] Server defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
-	// Status: Status of the zone. "UP" or "DOWN".
+	// Status: [Output Only] Status of the zone, either UP or DOWN.
 	Status string `json:"status,omitempty"`
 }
 
 type ZoneMaintenanceWindows struct {
-	// BeginTime: Begin time of the maintenance window, in RFC 3339 format.
+	// BeginTime: [Output Only] Starting time of the maintenance window, in
+	// RFC3339 format.
 	BeginTime string `json:"beginTime,omitempty"`
 
-	// Description: Textual description of the maintenance window.
+	// Description: [Output Only] Textual description of the maintenance
+	// window.
 	Description string `json:"description,omitempty"`
 
-	// EndTime: End time of the maintenance window, in RFC 3339 format.
+	// EndTime: [Output Only] Ending time of the maintenance window, in
+	// RFC3339 format.
 	EndTime string `json:"endTime,omitempty"`
 
-	// Name: Name of the maintenance window.
+	// Name: [Output Only] 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: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: A list of Zone resources.
+	// Items: [Output Only] A list of 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: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// SelfLink: Server defined URL for this resource (output only).
@@ -2988,7 +3283,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3030,7 +3325,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -3093,7 +3388,7 @@
 		"region":  c.region,
 		"address": c.address,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3125,14 +3420,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the region for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -3194,7 +3489,7 @@
 		"region":  c.region,
 		"address": c.address,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3226,14 +3521,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the region for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -3302,7 +3597,7 @@
 		"region":  c.region,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3326,14 +3621,14 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the region for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -3428,7 +3723,7 @@
 		"project": c.project,
 		"region":  c.region,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3471,14 +3766,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the region for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -3538,7 +3833,7 @@
 		"project":        c.project,
 		"backendService": c.backendService,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3628,7 +3923,7 @@
 		"project":        c.project,
 		"backendService": c.backendService,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3728,7 +4023,7 @@
 		"backendService": c.backendService,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3827,7 +4122,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3942,7 +4237,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4053,7 +4348,7 @@
 		"backendService": c.backendService,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4154,7 +4449,7 @@
 		"backendService": c.backendService,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4277,7 +4572,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4319,7 +4614,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -4382,7 +4677,7 @@
 		"zone":     c.zone,
 		"diskType": c.diskType,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4414,14 +4709,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -4514,7 +4809,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4557,14 +4852,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -4653,7 +4948,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4695,7 +4990,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -4726,7 +5021,7 @@
 	opt_     map[string]interface{}
 }
 
-// CreateSnapshot:
+// CreateSnapshot: Creates a snapshot of this disk.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/disks/createSnapshot
 func (r *DisksService) CreateSnapshot(project string, zone string, disk string, snapshot *Snapshot) *DisksCreateSnapshotCall {
 	c := &DisksCreateSnapshotCall{s: r.s, opt_: make(map[string]interface{})}
@@ -4766,7 +5061,7 @@
 		"disk":    c.disk,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4781,6 +5076,7 @@
 	}
 	return ret, nil
 	// {
+	//   "description": "Creates a snapshot of this disk.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.disks.createSnapshot",
 	//   "parameterOrder": [
@@ -4790,21 +5086,21 @@
 	//   ],
 	//   "parameters": {
 	//     "disk": {
-	//       "description": "Name of the persistent disk resource to snapshot.",
+	//       "description": "Name of the persistent disk to snapshot.",
 	//       "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.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -4836,7 +5132,7 @@
 	opt_    map[string]interface{}
 }
 
-// Delete: Deletes the specified persistent disk resource.
+// Delete: Deletes the specified persistent disk.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/disks/delete
 func (r *DisksService) Delete(project string, zone string, disk string) *DisksDeleteCall {
 	c := &DisksDeleteCall{s: r.s, opt_: make(map[string]interface{})}
@@ -4869,7 +5165,7 @@
 		"zone":    c.zone,
 		"disk":    c.disk,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4884,7 +5180,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes the specified persistent disk resource.",
+	//   "description": "Deletes the specified persistent disk.",
 	//   "httpMethod": "DELETE",
 	//   "id": "compute.disks.delete",
 	//   "parameterOrder": [
@@ -4894,21 +5190,21 @@
 	//   ],
 	//   "parameters": {
 	//     "disk": {
-	//       "description": "Name of the persistent disk resource to delete.",
+	//       "description": "Name of the persistent disk 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.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -4937,7 +5233,7 @@
 	opt_    map[string]interface{}
 }
 
-// Get: Returns the specified persistent disk resource.
+// Get: Returns a specified persistent disk.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/disks/get
 func (r *DisksService) Get(project string, zone string, disk string) *DisksGetCall {
 	c := &DisksGetCall{s: r.s, opt_: make(map[string]interface{})}
@@ -4970,7 +5266,7 @@
 		"zone":    c.zone,
 		"disk":    c.disk,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4985,7 +5281,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Returns the specified persistent disk resource.",
+	//   "description": "Returns a specified persistent disk.",
 	//   "httpMethod": "GET",
 	//   "id": "compute.disks.get",
 	//   "parameterOrder": [
@@ -4995,21 +5291,21 @@
 	//   ],
 	//   "parameters": {
 	//     "disk": {
-	//       "description": "Name of the persistent disk resource to return.",
+	//       "description": "Name of the persistent disk 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.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -5039,8 +5335,8 @@
 	opt_    map[string]interface{}
 }
 
-// Insert: Creates a persistent disk resource in the specified project
-// using the data included in the request.
+// Insert: Creates a persistent disk in the specified project using the
+// data included in the request.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/disks/insert
 func (r *DisksService) Insert(project string, zone string, disk *Disk) *DisksInsertCall {
 	c := &DisksInsertCall{s: r.s, opt_: make(map[string]interface{})}
@@ -5088,7 +5384,7 @@
 		"zone":    c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5103,7 +5399,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Creates a persistent disk resource in the specified project using the data included in the request.",
+	//   "description": "Creates a persistent disk in the specified project using the data included in the request.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.disks.insert",
 	//   "parameterOrder": [
@@ -5112,7 +5408,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -5124,7 +5420,7 @@
 	//       "type": "string"
 	//     },
 	//     "zone": {
-	//       "description": "Name of the zone scoping this request.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -5155,8 +5451,8 @@
 	opt_    map[string]interface{}
 }
 
-// List: Retrieves the list of persistent disk resources contained
-// within the specified zone.
+// List: Retrieves the list of persistent disks contained within the
+// specified zone.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/disks/list
 func (r *DisksService) List(project string, zone string) *DisksListCall {
 	c := &DisksListCall{s: r.s, opt_: make(map[string]interface{})}
@@ -5219,7 +5515,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5234,7 +5530,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Retrieves the list of persistent disk resources contained within the specified zone.",
+	//   "description": "Retrieves the list of persistent disks contained within the specified zone.",
 	//   "httpMethod": "GET",
 	//   "id": "compute.disks.list",
 	//   "parameterOrder": [
@@ -5262,14 +5558,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -5329,7 +5625,7 @@
 		"project":  c.project,
 		"firewall": c.firewall,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5360,7 +5656,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -5419,7 +5715,7 @@
 		"project":  c.project,
 		"firewall": c.firewall,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5450,7 +5746,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -5516,7 +5812,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5539,7 +5835,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -5631,7 +5927,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5673,7 +5969,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -5742,7 +6038,7 @@
 		"firewall": c.firewall,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5773,7 +6069,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -5844,7 +6140,7 @@
 		"firewall": c.firewall,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5875,7 +6171,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -5967,7 +6263,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6072,7 +6368,7 @@
 		"region":         c.region,
 		"forwardingRule": c.forwardingRule,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6173,7 +6469,7 @@
 		"region":         c.region,
 		"forwardingRule": c.forwardingRule,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6281,7 +6577,7 @@
 		"region":  c.region,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6407,7 +6703,7 @@
 		"project": c.project,
 		"region":  c.region,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6528,7 +6824,7 @@
 		"forwardingRule": c.forwardingRule,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6629,7 +6925,7 @@
 		"project": c.project,
 		"address": c.address,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6660,7 +6956,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -6719,7 +7015,7 @@
 		"project": c.project,
 		"address": c.address,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6750,7 +7046,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -6816,7 +7112,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6839,7 +7135,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -6930,7 +7226,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6972,7 +7268,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -7032,7 +7328,7 @@
 		"project":        c.project,
 		"forwardingRule": c.forwardingRule,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7122,7 +7418,7 @@
 		"project":        c.project,
 		"forwardingRule": c.forwardingRule,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7219,7 +7515,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7334,7 +7630,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7444,7 +7740,7 @@
 		"forwardingRule": c.forwardingRule,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7567,7 +7863,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7609,7 +7905,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -7669,7 +7965,7 @@
 		"project":   c.project,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7696,7 +7992,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -7752,7 +8048,7 @@
 		"project":   c.project,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7783,7 +8079,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -7873,7 +8169,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7915,7 +8211,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -7975,7 +8271,7 @@
 		"project":         c.project,
 		"httpHealthCheck": c.httpHealthCheck,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8065,7 +8361,7 @@
 		"project":         c.project,
 		"httpHealthCheck": c.httpHealthCheck,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8162,7 +8458,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8277,7 +8573,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8389,7 +8685,7 @@
 		"httpHealthCheck": c.httpHealthCheck,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8491,7 +8787,7 @@
 		"httpHealthCheck": c.httpHealthCheck,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8584,7 +8880,7 @@
 		"project": c.project,
 		"image":   c.image,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8615,7 +8911,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -8644,8 +8940,10 @@
 	opt_              map[string]interface{}
 }
 
-// Deprecate: Sets the deprecation status of an image. If no message
-// body is given, clears the deprecation status instead.
+// Deprecate: Sets the deprecation status of an image.
+//
+// If an empty
+// request body is given, clears the deprecation status instead.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/images/deprecate
 func (r *ImagesService) Deprecate(project string, image string, deprecationstatus *DeprecationStatus) *ImagesDeprecateCall {
 	c := &ImagesDeprecateCall{s: r.s, opt_: make(map[string]interface{})}
@@ -8683,7 +8981,7 @@
 		"image":   c.image,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8698,7 +8996,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Sets the deprecation status of an image. If no message body is given, clears the deprecation status instead.",
+	//   "description": "Sets the deprecation status of an image.\n\nIf an empty request body is given, clears the deprecation status instead.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.images.deprecate",
 	//   "parameterOrder": [
@@ -8714,7 +9012,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -8776,7 +9074,7 @@
 		"project": c.project,
 		"image":   c.image,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8807,7 +9105,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -8873,7 +9171,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8896,7 +9194,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -8991,7 +9289,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9033,7 +9331,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -9093,7 +9391,7 @@
 		"project":          c.project,
 		"instanceTemplate": c.instanceTemplate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9183,7 +9481,7 @@
 		"project":          c.project,
 		"instanceTemplate": c.instanceTemplate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9280,7 +9578,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9395,7 +9693,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9512,7 +9810,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9538,27 +9836,27 @@
 	//   ],
 	//   "parameters": {
 	//     "instance": {
-	//       "description": "Instance name.",
+	//       "description": "The instance name for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "networkInterface": {
-	//       "description": "Network interface name.",
+	//       "description": "The name of the network interface to add to this instance.",
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Project name.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -9649,7 +9947,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9690,7 +9988,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -9721,7 +10019,7 @@
 	opt_         map[string]interface{}
 }
 
-// AttachDisk: Attaches a disk resource to an instance.
+// AttachDisk: Attaches a Disk resource to an instance.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/instances/attachDisk
 func (r *InstancesService) AttachDisk(project string, zone string, instance string, attacheddisk *AttachedDisk) *InstancesAttachDiskCall {
 	c := &InstancesAttachDiskCall{s: r.s, opt_: make(map[string]interface{})}
@@ -9761,7 +10059,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9776,7 +10074,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Attaches a disk resource to an instance.",
+	//   "description": "Attaches a Disk resource to an instance.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.instances.attachDisk",
 	//   "parameterOrder": [
@@ -9793,14 +10091,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Project name.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -9832,7 +10130,8 @@
 	opt_     map[string]interface{}
 }
 
-// Delete: Deletes the specified instance resource.
+// Delete: Deletes the specified Instance resource. For more
+// information, see Shutting down an instance.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/instances/delete
 func (r *InstancesService) Delete(project string, zone string, instance string) *InstancesDeleteCall {
 	c := &InstancesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
@@ -9865,7 +10164,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9880,7 +10179,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes the specified instance resource.",
+	//   "description": "Deletes the specified Instance resource. For more information, see Shutting down an instance.",
 	//   "httpMethod": "DELETE",
 	//   "id": "compute.instances.delete",
 	//   "parameterOrder": [
@@ -9897,14 +10196,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -9973,7 +10272,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10000,33 +10299,33 @@
 	//   ],
 	//   "parameters": {
 	//     "accessConfig": {
-	//       "description": "Access config name.",
+	//       "description": "The name of the access config to delete.",
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "instance": {
-	//       "description": "Instance name.",
+	//       "description": "The instance name for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "networkInterface": {
-	//       "description": "Network interface name.",
+	//       "description": "The name of the network interface.",
 	//       "location": "query",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Project name.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10091,7 +10390,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10131,14 +10430,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Project name.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10200,7 +10499,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10232,14 +10531,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the The name of the zone for this request..",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10303,7 +10602,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10335,14 +10634,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10411,7 +10710,7 @@
 		"zone":    c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10435,14 +10734,14 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10537,7 +10836,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10580,14 +10879,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10650,7 +10949,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10682,14 +10981,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10721,7 +11020,7 @@
 }
 
 // SetDiskAutoDelete: Sets the auto-delete flag for a disk attached to
-// an instance
+// an instance.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/instances/setDiskAutoDelete
 func (r *InstancesService) SetDiskAutoDelete(project string, zone string, instance string, autoDelete bool, deviceName string) *InstancesSetDiskAutoDeleteCall {
 	c := &InstancesSetDiskAutoDeleteCall{s: r.s, opt_: make(map[string]interface{})}
@@ -10758,7 +11057,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10773,7 +11072,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Sets the auto-delete flag for a disk attached to an instance",
+	//   "description": "Sets the auto-delete flag for a disk attached to an instance.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.instances.setDiskAutoDelete",
 	//   "parameterOrder": [
@@ -10791,28 +11090,28 @@
 	//       "type": "boolean"
 	//     },
 	//     "deviceName": {
-	//       "description": "Disk device name to modify.",
+	//       "description": "The device name of the disk to modify.",
 	//       "location": "query",
 	//       "pattern": "\\w[\\w.-]{0,254}",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "instance": {
-	//       "description": "Instance name.",
+	//       "description": "The instance name.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Project name.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10883,7 +11182,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10915,14 +11214,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -10995,7 +11294,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11027,14 +11326,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Project name.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -11108,7 +11407,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11140,14 +11439,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -11179,7 +11478,9 @@
 	opt_     map[string]interface{}
 }
 
-// Start: Starts an instance
+// Start: This method starts an instance that was stopped using the
+// using the instances().stop method. For more information, see Restart
+// an instance.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/instances/start
 func (r *InstancesService) Start(project string, zone string, instance string) *InstancesStartCall {
 	c := &InstancesStartCall{s: r.s, opt_: make(map[string]interface{})}
@@ -11212,7 +11513,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11227,7 +11528,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Starts an instance",
+	//   "description": "This method starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.instances.start",
 	//   "parameterOrder": [
@@ -11244,14 +11545,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -11280,7 +11581,13 @@
 	opt_     map[string]interface{}
 }
 
-// Stop: Stops an instance
+// Stop: This method stops a running instance, shutting it down cleanly,
+// and allows you to restart the instance at a later time. Stopped
+// instances do not incur per-minute, virtual machine usage charges
+// while they are stopped, but any resources that the virtual machine is
+// using, such as persistent disks and static IP addresses,will continue
+// to be charged until they are deleted. For more information, see
+// Stopping an instance.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/instances/stop
 func (r *InstancesService) Stop(project string, zone string, instance string) *InstancesStopCall {
 	c := &InstancesStopCall{s: r.s, opt_: make(map[string]interface{})}
@@ -11313,7 +11620,7 @@
 		"zone":     c.zone,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11328,7 +11635,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Stops an instance",
+	//   "description": "This method stops a running instance, shutting it down cleanly, and allows you to restart the instance at a later time. Stopped instances do not incur per-minute, virtual machine usage charges while they are stopped, but any resources that the virtual machine is using, such as persistent disks and static IP addresses,will continue to be charged until they are deleted. For more information, see Stopping an instance.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.instances.stop",
 	//   "parameterOrder": [
@@ -11345,14 +11652,14 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -11411,7 +11718,7 @@
 		"project": c.project,
 		"license": c.license,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11442,7 +11749,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -11532,7 +11839,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11637,7 +11944,7 @@
 		"zone":        c.zone,
 		"machineType": c.machineType,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11676,7 +11983,7 @@
 	//       "type": "string"
 	//     },
 	//     "zone": {
-	//       "description": "Name of the zone scoping this request.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -11769,7 +12076,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11819,7 +12126,7 @@
 	//       "type": "string"
 	//     },
 	//     "zone": {
-	//       "description": "Name of the zone scoping this request.",
+	//       "description": "The name of the zone for this request.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -11879,7 +12186,7 @@
 		"project": c.project,
 		"network": c.network,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11910,7 +12217,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -11969,7 +12276,7 @@
 		"project": c.project,
 		"network": c.network,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12000,7 +12307,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12066,7 +12373,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12089,7 +12396,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12181,7 +12488,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12223,7 +12530,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12280,7 +12587,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12303,7 +12610,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project resource to retrieve.",
+	//       "description": "Project ID for 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,
@@ -12323,6 +12630,185 @@
 
 }
 
+// method id "compute.projects.moveDisk":
+
+type ProjectsMoveDiskCall struct {
+	s               *Service
+	project         string
+	diskmoverequest *DiskMoveRequest
+	opt_            map[string]interface{}
+}
+
+// MoveDisk: Moves a persistent disk from one zone to another.
+func (r *ProjectsService) MoveDisk(project string, diskmoverequest *DiskMoveRequest) *ProjectsMoveDiskCall {
+	c := &ProjectsMoveDiskCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.diskmoverequest = diskmoverequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProjectsMoveDiskCall) Fields(s ...googleapi.Field) *ProjectsMoveDiskCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *ProjectsMoveDiskCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.diskmoverequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/moveDisk")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Operation
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Moves a persistent disk from one zone to another.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.projects.moveDisk",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID for 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}/moveDisk",
+	//   "request": {
+	//     "$ref": "DiskMoveRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
+// method id "compute.projects.moveInstance":
+
+type ProjectsMoveInstanceCall struct {
+	s                   *Service
+	project             string
+	instancemoverequest *InstanceMoveRequest
+	opt_                map[string]interface{}
+}
+
+// MoveInstance: Moves an instance and its attached persistent disks
+// from one zone to another.
+func (r *ProjectsService) MoveInstance(project string, instancemoverequest *InstanceMoveRequest) *ProjectsMoveInstanceCall {
+	c := &ProjectsMoveInstanceCall{s: r.s, opt_: make(map[string]interface{})}
+	c.project = project
+	c.instancemoverequest = instancemoverequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProjectsMoveInstanceCall) Fields(s ...googleapi.Field) *ProjectsMoveInstanceCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *ProjectsMoveInstanceCall) Do() (*Operation, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancemoverequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/moveInstance")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+	})
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *Operation
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Moves an instance and its attached persistent disks from one zone to another.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.projects.moveInstance",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID for 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}/moveInstance",
+	//   "request": {
+	//     "$ref": "InstanceMoveRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.projects.setCommonInstanceMetadata":
 
 type ProjectsSetCommonInstanceMetadataCall struct {
@@ -12369,7 +12855,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12392,7 +12878,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12423,7 +12909,10 @@
 	opt_                map[string]interface{}
 }
 
-// SetUsageExportBucket: Sets usage export location
+// SetUsageExportBucket: Enables the usage export feature and sets the
+// usage export bucket where reports are stored. If you provide an empty
+// request body using this method, the usage export feature will be
+// disabled.
 // For details, see https://cloud.google.com/compute/docs/reference/latest/projects/setUsageExportBucket
 func (r *ProjectsService) SetUsageExportBucket(project string, usageexportlocation *UsageExportLocation) *ProjectsSetUsageExportBucketCall {
 	c := &ProjectsSetUsageExportBucketCall{s: r.s, opt_: make(map[string]interface{})}
@@ -12459,7 +12948,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12474,7 +12963,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Sets usage export location",
+	//   "description": "Enables the usage export feature and sets the usage export bucket where reports are stored. If you provide an empty request body using this method, the usage export feature will be disabled.",
 	//   "httpMethod": "POST",
 	//   "id": "compute.projects.setUsageExportBucket",
 	//   "parameterOrder": [
@@ -12482,7 +12971,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12550,7 +13039,7 @@
 		"region":    c.region,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -12578,7 +13067,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12644,7 +13133,7 @@
 		"region":    c.region,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12676,7 +13165,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12776,7 +13265,7 @@
 		"project": c.project,
 		"region":  c.region,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12819,7 +13308,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -12886,7 +13375,7 @@
 		"project": c.project,
 		"region":  c.region,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12910,7 +13399,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -13007,7 +13496,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13049,7 +13538,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -13109,7 +13598,7 @@
 		"project": c.project,
 		"route":   c.route,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13199,7 +13688,7 @@
 		"project": c.project,
 		"route":   c.route,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13296,7 +13785,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13411,7 +13900,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13513,7 +14002,7 @@
 		"project":  c.project,
 		"snapshot": c.snapshot,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13603,7 +14092,7 @@
 		"project":  c.project,
 		"snapshot": c.snapshot,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13724,7 +14213,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13826,7 +14315,7 @@
 		"project":         c.project,
 		"targetHttpProxy": c.targetHttpProxy,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13916,7 +14405,7 @@
 		"project":         c.project,
 		"targetHttpProxy": c.targetHttpProxy,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14013,7 +14502,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14128,7 +14617,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14238,7 +14727,7 @@
 		"targetHttpProxy": c.targetHttpProxy,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14361,7 +14850,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14466,7 +14955,7 @@
 		"zone":           c.zone,
 		"targetInstance": c.targetInstance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14567,7 +15056,7 @@
 		"zone":           c.zone,
 		"targetInstance": c.targetInstance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14675,7 +15164,7 @@
 		"zone":    c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14801,7 +15290,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14922,7 +15411,7 @@
 		"targetPool": c.targetPool,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15033,7 +15522,7 @@
 		"targetPool": c.targetPool,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15162,7 +15651,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15267,7 +15756,7 @@
 		"region":     c.region,
 		"targetPool": c.targetPool,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15368,7 +15857,7 @@
 		"region":     c.region,
 		"targetPool": c.targetPool,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15479,7 +15968,7 @@
 		"targetPool": c.targetPool,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15589,7 +16078,7 @@
 		"region":  c.region,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15715,7 +16204,7 @@
 		"project": c.project,
 		"region":  c.region,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15836,7 +16325,7 @@
 		"targetPool": c.targetPool,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15947,7 +16436,7 @@
 		"targetPool": c.targetPool,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16068,7 +16557,7 @@
 		"targetPool": c.targetPool,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16175,7 +16664,7 @@
 		"project": c.project,
 		"urlMap":  c.urlMap,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16265,7 +16754,7 @@
 		"project": c.project,
 		"urlMap":  c.urlMap,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16362,7 +16851,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16477,7 +16966,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16588,7 +17077,7 @@
 		"urlMap":  c.urlMap,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16689,7 +17178,7 @@
 		"urlMap":  c.urlMap,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16792,7 +17281,7 @@
 		"urlMap":  c.urlMap,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16888,7 +17377,7 @@
 		"zone":      c.zone,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -16916,7 +17405,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -16982,7 +17471,7 @@
 		"zone":      c.zone,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17014,7 +17503,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -17114,7 +17603,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17157,7 +17646,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -17224,7 +17713,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17248,7 +17737,7 @@
 	//   ],
 	//   "parameters": {
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
@@ -17345,7 +17834,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17387,7 +17876,7 @@
 	//       "type": "string"
 	//     },
 	//     "project": {
-	//       "description": "Name of the project scoping this request.",
+	//       "description": "Project ID for 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,
diff --git a/container/v1beta1/container-gen.go b/container/v1beta1/container-gen.go
index 5d39a0d..3887484 100644
--- a/container/v1beta1/container-gen.go
+++ b/container/v1beta1/container-gen.go
@@ -57,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Projects *ProjectsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Clusters = NewProjectsClustersService(s)
@@ -355,7 +363,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -431,7 +439,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -532,7 +540,7 @@
 		"zoneId":    c.zoneId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -628,7 +636,7 @@
 		"zoneId":    c.zoneId,
 		"clusterId": c.clusterId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -724,7 +732,7 @@
 		"zoneId":    c.zoneId,
 		"clusterId": c.clusterId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -817,7 +825,7 @@
 		"projectId": c.projectId,
 		"zoneId":    c.zoneId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -906,7 +914,7 @@
 		"zoneId":      c.zoneId,
 		"operationId": c.operationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -999,7 +1007,7 @@
 		"projectId": c.projectId,
 		"zoneId":    c.zoneId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/content/v2/content-api.json b/content/v2/content-api.json
index 73226df..61b4f7c 100644
--- a/content/v2/content-api.json
+++ b/content/v2/content-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/C8XXsPv6OQ96WhF0iGLVjduwCpc\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/Jg5IFKTqCcIBJROG8QNmsXQ1iso\"",
  "discoveryVersion": "v1",
  "id": "content:v2",
  "name": "content",
  "canonicalName": "Shopping Content",
  "version": "v2",
- "revision": "20150218",
+ "revision": "20150317",
  "title": "Content API for Shopping",
  "description": "Manage product items, inventory, and Merchant Center accounts for Google Shopping.",
  "ownerDomain": "google.com",
@@ -154,6 +154,22 @@
     }
    }
   },
+  "AccountIdentifier": {
+   "id": "AccountIdentifier",
+   "type": "object",
+   "properties": {
+    "aggregatorId": {
+     "type": "string",
+     "description": "The aggregator ID, set for aggregators and subaccounts (in that case, it represents the aggregator of the subaccount).",
+     "format": "uint64"
+    },
+    "merchantId": {
+     "type": "string",
+     "description": "The merchant account ID, set for individual accounts and subaccounts.",
+     "format": "uint64"
+    }
+   }
+  },
   "AccountShipping": {
    "id": "AccountShipping",
    "type": "object",
@@ -676,6 +692,24 @@
     }
    }
   },
+  "AccountsAuthInfoResponse": {
+   "id": "AccountsAuthInfoResponse",
+   "type": "object",
+   "properties": {
+    "accountIdentifiers": {
+     "type": "array",
+     "description": "The account identifiers corresponding to the authenticated user.\n- For an individual account: only the merchant ID is defined\n- For an aggregator: only the aggregator ID is defined\n- For a subaccount of an MCA: both the merchant ID and the aggregator ID are defined.",
+     "items": {
+      "$ref": "AccountIdentifier"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"content#accountsAuthInfoResponse\".",
+     "default": "content#accountsAuthInfoResponse"
+    }
+   }
+  },
   "AccountsCustomBatchRequest": {
    "id": "AccountsCustomBatchRequest",
    "type": "object",
@@ -1788,6 +1822,13 @@
      "type": "string",
      "description": "Target age group of the item."
     },
+    "aspects": {
+     "type": "array",
+     "description": "Specifies the intended aspects for the product.",
+     "items": {
+      "$ref": "ProductAspect"
+     }
+    },
     "availability": {
      "type": "string",
      "description": "Availability status of the item."
@@ -2088,6 +2129,24 @@
     }
    }
   },
+  "ProductAspect": {
+   "id": "ProductAspect",
+   "type": "object",
+   "properties": {
+    "aspectName": {
+     "type": "string",
+     "description": "The name of the aspect."
+    },
+    "destinationName": {
+     "type": "string",
+     "description": "The name of the destination. Leave out to apply to all destinations."
+    },
+    "intention": {
+     "type": "string",
+     "description": "Whether the aspect is required, excluded or should be validated."
+    }
+   }
+  },
   "ProductCustomAttribute": {
    "id": "ProductCustomAttribute",
    "type": "object",
@@ -2623,6 +2682,18 @@
  "resources": {
   "accounts": {
    "methods": {
+    "authinfo": {
+     "id": "content.accounts.authinfo",
+     "path": "accounts/authinfo",
+     "httpMethod": "GET",
+     "description": "Returns information about the authenticated user.",
+     "response": {
+      "$ref": "AccountsAuthInfoResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/content"
+     ]
+    },
     "custombatch": {
      "id": "content.accounts.custombatch",
      "path": "accounts/batch",
diff --git a/content/v2/content-gen.go b/content/v2/content-gen.go
index 31eb501..0b5e01a 100644
--- a/content/v2/content-gen.go
+++ b/content/v2/content-gen.go
@@ -65,8 +65,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -87,6 +88,13 @@
 	Productstatuses *ProductstatusesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -210,6 +218,16 @@
 	Status string `json:"status,omitempty"`
 }
 
+type AccountIdentifier struct {
+	// AggregatorId: The aggregator ID, set for aggregators and subaccounts
+	// (in that case, it represents the aggregator of the subaccount).
+	AggregatorId uint64 `json:"aggregatorId,omitempty,string"`
+
+	// MerchantId: The merchant account ID, set for individual accounts and
+	// subaccounts.
+	MerchantId uint64 `json:"merchantId,omitempty,string"`
+}
+
 type AccountShipping struct {
 	// AccountId: The ID of the account to which these account shipping
 	// settings belong.
@@ -502,6 +520,22 @@
 	EmailAddress string `json:"emailAddress,omitempty"`
 }
 
+type AccountsAuthInfoResponse struct {
+	// AccountIdentifiers: The account identifiers corresponding to the
+	// authenticated user.
+	// - For an individual account: only the merchant ID
+	// is defined
+	// - For an aggregator: only the aggregator ID is defined
+	// -
+	// For a subaccount of an MCA: both the merchant ID and the aggregator
+	// ID are defined.
+	AccountIdentifiers []*AccountIdentifier `json:"accountIdentifiers,omitempty"`
+
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "content#accountsAuthInfoResponse".
+	Kind string `json:"kind,omitempty"`
+}
+
 type AccountsCustomBatchRequest struct {
 	// Entries: The request entries to be processed in the batch.
 	Entries []*AccountsCustomBatchRequestEntry `json:"entries,omitempty"`
@@ -1135,6 +1169,9 @@
 	// AgeGroup: Target age group of the item.
 	AgeGroup string `json:"ageGroup,omitempty"`
 
+	// Aspects: Specifies the intended aspects for the product.
+	Aspects []*ProductAspect `json:"aspects,omitempty"`
+
 	// Availability: Availability status of the item.
 	Availability string `json:"availability,omitempty"`
 
@@ -1355,6 +1392,19 @@
 	Warnings []*Error `json:"warnings,omitempty"`
 }
 
+type ProductAspect struct {
+	// AspectName: The name of the aspect.
+	AspectName string `json:"aspectName,omitempty"`
+
+	// DestinationName: The name of the destination. Leave out to apply to
+	// all destinations.
+	DestinationName string `json:"destinationName,omitempty"`
+
+	// Intention: Whether the aspect is required, excluded or should be
+	// validated.
+	Intention string `json:"intention,omitempty"`
+}
+
 type ProductCustomAttribute struct {
 	// Name: The name of the attribute. Underscores will be replaced by
 	// spaces upon insertion.
@@ -1687,6 +1737,67 @@
 	Value string `json:"value,omitempty"`
 }
 
+// method id "content.accounts.authinfo":
+
+type AccountsAuthinfoCall struct {
+	s    *Service
+	opt_ map[string]interface{}
+}
+
+// Authinfo: Returns information about the authenticated user.
+func (r *AccountsService) Authinfo() *AccountsAuthinfoCall {
+	c := &AccountsAuthinfoCall{s: r.s, opt_: make(map[string]interface{})}
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AccountsAuthinfoCall) Fields(s ...googleapi.Field) *AccountsAuthinfoCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *AccountsAuthinfoCall) Do() (*AccountsAuthInfoResponse, error) {
+	var body io.Reader = nil
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/authinfo")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *AccountsAuthInfoResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns information about the authenticated user.",
+	//   "httpMethod": "GET",
+	//   "id": "content.accounts.authinfo",
+	//   "path": "accounts/authinfo",
+	//   "response": {
+	//     "$ref": "AccountsAuthInfoResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/content"
+	//   ]
+	// }
+
+}
+
 // method id "content.accounts.custombatch":
 
 type AccountsCustombatchCall struct {
@@ -1728,7 +1839,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1799,7 +1910,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1880,7 +1991,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1973,7 +2084,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2073,7 +2184,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2173,7 +2284,7 @@
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2272,7 +2383,7 @@
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2365,7 +2476,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2436,7 +2547,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2543,7 +2654,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2643,7 +2754,7 @@
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2742,7 +2853,7 @@
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2834,7 +2945,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2904,7 +3015,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3011,7 +3122,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3104,7 +3215,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3175,7 +3286,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3281,7 +3392,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3381,7 +3492,7 @@
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3480,7 +3591,7 @@
 		"accountId":  strconv.FormatUint(c.accountId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3572,7 +3683,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3642,7 +3753,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"datafeedId": strconv.FormatUint(c.datafeedId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3721,7 +3832,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"datafeedId": strconv.FormatUint(c.datafeedId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3812,7 +3923,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3911,7 +4022,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4011,7 +4122,7 @@
 		"datafeedId": strconv.FormatUint(c.datafeedId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4108,7 +4219,7 @@
 		"datafeedId": strconv.FormatUint(c.datafeedId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4198,7 +4309,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4269,7 +4380,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"datafeedId": strconv.FormatUint(c.datafeedId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4373,7 +4484,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4466,7 +4577,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4549,7 +4660,7 @@
 		"productId":  c.productId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4658,7 +4769,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4746,7 +4857,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"productId":  c.productId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4831,7 +4942,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"productId":  c.productId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4933,7 +5044,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5038,7 +5149,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5131,7 +5242,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5202,7 +5313,7 @@
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 		"productId":  c.productId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5308,7 +5419,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"merchantId": strconv.FormatUint(c.merchantId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/coordinate/v1/coordinate-gen.go b/coordinate/v1/coordinate-gen.go
index df0f1cc..2aa34e4 100644
--- a/coordinate/v1/coordinate-gen.go
+++ b/coordinate/v1/coordinate-gen.go
@@ -65,8 +65,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	CustomFieldDef *CustomFieldDefService
 
@@ -81,6 +82,13 @@
 	Worker *WorkerService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewCustomFieldDefService(s *Service) *CustomFieldDefService {
 	rs := &CustomFieldDefService{s: s}
 	return rs
@@ -418,7 +426,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"teamId": c.teamId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -498,7 +506,7 @@
 		"teamId": c.teamId,
 		"jobId":  strconv.FormatUint(c.jobId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -659,7 +667,7 @@
 		"teamId": c.teamId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -824,7 +832,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"teamId": c.teamId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1033,7 +1041,7 @@
 		"jobId":  strconv.FormatUint(c.jobId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1302,7 +1310,7 @@
 		"jobId":  strconv.FormatUint(c.jobId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1481,7 +1489,7 @@
 		"teamId":      c.teamId,
 		"workerEmail": c.workerEmail,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1587,7 +1595,7 @@
 		"teamId": c.teamId,
 		"jobId":  strconv.FormatUint(c.jobId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1725,7 +1733,7 @@
 		"jobId":  strconv.FormatUint(c.jobId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1887,7 +1895,7 @@
 		"jobId":  strconv.FormatUint(c.jobId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2023,7 +2031,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2106,7 +2114,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"teamId": c.teamId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/customsearch/v1/customsearch-gen.go b/customsearch/v1/customsearch-gen.go
index 60c3ff5..93f4037 100644
--- a/customsearch/v1/customsearch-gen.go
+++ b/customsearch/v1/customsearch-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Cse *CseService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewCseService(s *Service) *CseService {
 	rs := &CseService{s: s}
 	return rs
@@ -640,7 +648,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/dataflow/v1b4/dataflow-gen.go b/dataflow/v1b4/dataflow-gen.go
index b13b29d..c109476 100644
--- a/dataflow/v1b4/dataflow-gen.go
+++ b/dataflow/v1b4/dataflow-gen.go
@@ -48,6 +48,14 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
diff --git a/dataflow/v1beta3/dataflow-gen.go b/dataflow/v1beta3/dataflow-gen.go
index 2a44a0d..f472adb 100644
--- a/dataflow/v1beta3/dataflow-gen.go
+++ b/dataflow/v1beta3/dataflow-gen.go
@@ -58,12 +58,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	V1b3 *V1b3Service
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewV1b3Service(s *Service) *V1b3Service {
 	rs := &V1b3Service{s: s}
 	rs.Projects = NewV1b3ProjectsService(s)
@@ -804,7 +812,7 @@
 		"projectId": c.projectId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -909,7 +917,7 @@
 		"projectId": c.projectId,
 		"jobId":     c.jobId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1017,7 +1025,7 @@
 		"projectId": c.projectId,
 		"jobId":     c.jobId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1130,7 +1138,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1241,7 +1249,7 @@
 		"jobId":     c.jobId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1337,7 +1345,7 @@
 		"jobId":     c.jobId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1470,7 +1478,7 @@
 		"projectId": c.projectId,
 		"jobId":     c.jobId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1598,7 +1606,7 @@
 		"jobId":     c.jobId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1695,7 +1703,7 @@
 		"jobId":     c.jobId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/datastore/v1beta1/datastore-gen.go b/datastore/v1beta1/datastore-gen.go
index 495f976..eb710d1 100644
--- a/datastore/v1beta1/datastore-gen.go
+++ b/datastore/v1beta1/datastore-gen.go
@@ -63,12 +63,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Datasets *DatasetsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDatasetsService(s *Service) *DatasetsService {
 	rs := &DatasetsService{s: s}
 	return rs
@@ -574,7 +582,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -663,7 +671,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -753,7 +761,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -843,7 +851,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -932,7 +940,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1021,7 +1029,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1110,7 +1118,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/datastore/v1beta2/datastore-gen.go b/datastore/v1beta2/datastore-gen.go
index c1a5850..028d1d5 100644
--- a/datastore/v1beta2/datastore-gen.go
+++ b/datastore/v1beta2/datastore-gen.go
@@ -63,12 +63,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Datasets *DatasetsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDatasetsService(s *Service) *DatasetsService {
 	rs := &DatasetsService{s: s}
 	return rs
@@ -602,7 +610,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -691,7 +699,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -781,7 +789,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -870,7 +878,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -959,7 +967,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1048,7 +1056,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/deploymentmanager/v2beta1/deploymentmanager-gen.go b/deploymentmanager/v2beta1/deploymentmanager-gen.go
index 89790ba..4409943 100644
--- a/deploymentmanager/v2beta1/deploymentmanager-gen.go
+++ b/deploymentmanager/v2beta1/deploymentmanager-gen.go
@@ -69,8 +69,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Deployments *DeploymentsService
 
@@ -83,6 +84,13 @@
 	Types *TypesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDeploymentsService(s *Service) *DeploymentsService {
 	rs := &DeploymentsService{s: s}
 	return rs
@@ -397,7 +405,7 @@
 		"project":    c.project,
 		"deployment": c.deployment,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -486,7 +494,7 @@
 		"project":    c.project,
 		"deployment": c.deployment,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -582,7 +590,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -686,7 +694,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -785,7 +793,7 @@
 		"deployment": c.deployment,
 		"manifest":   c.manifest,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -906,7 +914,7 @@
 		"project":    c.project,
 		"deployment": c.deployment,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1010,7 +1018,7 @@
 		"project":   c.project,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1119,7 +1127,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1218,7 +1226,7 @@
 		"deployment": c.deployment,
 		"resource":   c.resource,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1339,7 +1347,7 @@
 		"project":    c.project,
 		"deployment": c.deployment,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1463,7 +1471,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/dfareporting/v1.1/dfareporting-gen.go b/dfareporting/v1.1/dfareporting-gen.go
index adcc259..69b586a 100644
--- a/dfareporting/v1.1/dfareporting-gen.go
+++ b/dfareporting/v1.1/dfareporting-gen.go
@@ -60,8 +60,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	DimensionValues *DimensionValuesService
 
@@ -72,6 +73,13 @@
 	UserProfiles *UserProfilesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDimensionValuesService(s *Service) *DimensionValuesService {
 	rs := &DimensionValuesService{s: s}
 	return rs
@@ -848,7 +856,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -981,7 +989,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1102,7 +1110,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1183,7 +1191,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1276,7 +1284,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1396,7 +1404,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1527,7 +1535,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1628,7 +1636,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1729,7 +1737,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1823,7 +1831,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 		"fileId":    strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1959,7 +1967,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2085,7 +2093,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2158,7 +2166,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/dfareporting/v1.2/dfareporting-gen.go b/dfareporting/v1.2/dfareporting-gen.go
index 7edb783..206c22b 100644
--- a/dfareporting/v1.2/dfareporting-gen.go
+++ b/dfareporting/v1.2/dfareporting-gen.go
@@ -60,8 +60,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	DimensionValues *DimensionValuesService
 
@@ -72,6 +73,13 @@
 	UserProfiles *UserProfilesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDimensionValuesService(s *Service) *DimensionValuesService {
 	rs := &DimensionValuesService{s: s}
 	return rs
@@ -860,7 +868,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -956,7 +964,7 @@
 		"reportId": strconv.FormatInt(c.reportId, 10),
 		"fileId":   strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1092,7 +1100,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1229,7 +1237,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1310,7 +1318,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1403,7 +1411,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1533,7 +1541,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1678,7 +1686,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1779,7 +1787,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1880,7 +1888,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1974,7 +1982,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 		"fileId":    strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2111,7 +2119,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2237,7 +2245,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2310,7 +2318,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/dfareporting/v1.3/dfareporting-gen.go b/dfareporting/v1.3/dfareporting-gen.go
index 638d912..795acc7 100644
--- a/dfareporting/v1.3/dfareporting-gen.go
+++ b/dfareporting/v1.3/dfareporting-gen.go
@@ -60,8 +60,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	DimensionValues *DimensionValuesService
 
@@ -72,6 +73,13 @@
 	UserProfiles *UserProfilesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDimensionValuesService(s *Service) *DimensionValuesService {
 	rs := &DimensionValuesService{s: s}
 	return rs
@@ -1037,7 +1045,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1133,7 +1141,7 @@
 		"reportId": strconv.FormatInt(c.reportId, 10),
 		"fileId":   strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1269,7 +1277,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1406,7 +1414,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1487,7 +1495,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1580,7 +1588,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1710,7 +1718,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1855,7 +1863,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1956,7 +1964,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2057,7 +2065,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2155,7 +2163,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2241,7 +2249,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 		"fileId":    strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2378,7 +2386,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2504,7 +2512,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2577,7 +2585,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/dfareporting/v1/dfareporting-gen.go b/dfareporting/v1/dfareporting-gen.go
index 68084ed..ab217dc 100644
--- a/dfareporting/v1/dfareporting-gen.go
+++ b/dfareporting/v1/dfareporting-gen.go
@@ -60,8 +60,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	DimensionValues *DimensionValuesService
 
@@ -72,6 +73,13 @@
 	UserProfiles *UserProfilesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDimensionValuesService(s *Service) *DimensionValuesService {
 	rs := &DimensionValuesService{s: s}
 	return rs
@@ -565,7 +573,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -698,7 +706,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -819,7 +827,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -900,7 +908,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -993,7 +1001,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1113,7 +1121,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1244,7 +1252,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1345,7 +1353,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1446,7 +1454,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1540,7 +1548,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 		"fileId":    strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1676,7 +1684,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1802,7 +1810,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1875,7 +1883,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/dfareporting/v2.0/dfareporting-api.json b/dfareporting/v2.0/dfareporting-api.json
index 54d4c62..aafcd01 100644
--- a/dfareporting/v2.0/dfareporting-api.json
+++ b/dfareporting/v2.0/dfareporting-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/18wO3vJeoOcaxNlyUy0n8CNe-Lk\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/-Wf_jNw3Fg6ZZI2nhs026L5nO_I\"",
  "discoveryVersion": "v1",
  "id": "dfareporting:v2.0",
  "name": "dfareporting",
  "version": "v2.0",
- "revision": "20150108",
+ "revision": "20150223",
  "title": "DCM/DFA Reporting And Trafficking API",
  "description": "Manage your DoubleClick Campaign Manager ad campaigns and reports.",
  "ownerDomain": "google.com",
@@ -1528,7 +1528,7 @@
    "properties": {
     "accountId": {
      "type": "string",
-     "description": "Account ID of this content category.This is a read-only field that can be left blank.",
+     "description": "Account ID of this content category. This is a read-only field that can be left blank.",
      "format": "int64"
     },
     "description": {
@@ -1911,7 +1911,7 @@
     },
     "htmlCodeLocked": {
      "type": "boolean",
-     "description": "Whether HTML code is DCM generated or manually entered. Set to true to ignore changes to htmlCode. Applicable to the following creative types: FLASH_INPAGE and HTML5_BANNER."
+     "description": "Whether HTML code is DCM-generated or manually entered. Set to true to ignore changes to htmlCode. Applicable to the following creative types: FLASH_INPAGE and HTML5_BANNER."
     },
     "id": {
      "type": "string",
@@ -2388,7 +2388,7 @@
     },
     "horizontallyLocked": {
      "type": "boolean",
-     "description": "Wheter the asset is horizontally locked. This is a read-only field. Applicable to the following creative types: all RICH_MEDIA."
+     "description": "Whether the asset is horizontally locked. This is a read-only field. Applicable to the following creative types: all RICH_MEDIA."
     },
     "id": {
      "type": "string",
@@ -2919,7 +2919,7 @@
     },
     "popupWindowProperties": {
      "$ref": "PopupWindowProperties",
-     "description": "Properties for rich media pop-up windows. This field is used only for exit events."
+     "description": "Properties for rich media popup windows. This field is used only for exit events."
     },
     "targetType": {
      "type": "string",
@@ -4270,7 +4270,7 @@
    "properties": {
     "accountId": {
      "type": "string",
-     "description": "Account ID of this floodlight activity.This is a read-only field that can be left blank.",
+     "description": "Account ID of this floodlight activity. This is a read-only field that can be left blank.",
      "format": "int64"
     },
     "advertiserId": {
@@ -4374,7 +4374,7 @@
     },
     "idDimensionValue": {
      "$ref": "DimensionValue",
-     "description": "Dimension value for the ID of this floodlight activity.This is a read-only, auto-generated field."
+     "description": "Dimension value for the ID of this floodlight activity. This is a read-only, auto-generated field."
     },
     "imageTagEnabled": {
      "type": "boolean",
@@ -4414,7 +4414,7 @@
     },
     "subaccountId": {
      "type": "string",
-     "description": "Subaccount ID of this floodlight activity.This is a read-only field that can be left blank.",
+     "description": "Subaccount ID of this floodlight activity. This is a read-only field that can be left blank.",
      "format": "int64"
     },
     "tagFormat": {
@@ -4513,7 +4513,7 @@
    "properties": {
     "accountId": {
      "type": "string",
-     "description": "Account ID of this floodlight activity group.This is a read-only field that can be left blank.",
+     "description": "Account ID of this floodlight activity group. This is a read-only field that can be left blank.",
      "format": "int64"
     },
     "advertiserId": {
@@ -4563,7 +4563,7 @@
     },
     "type": {
      "type": "string",
-     "description": "The type of floodlight activity group. This is a required field that is read-only after insertion.",
+     "description": "Type of the floodlight activity group. This is a required field that is read-only after insertion.",
      "enum": [
       "COUNTER",
       "SALE"
@@ -4656,7 +4656,7 @@
     },
     "exposureToConversionEnabled": {
      "type": "boolean",
-     "description": "Whether the exposure to conversion report is enabled. This report shows detailed pathway information on up to 10 of the most recent ad exposures seen by a user before converting."
+     "description": "Whether the exposure-to-conversion report is enabled. This report shows detailed pathway information on up to 10 of the most recent ad exposures seen by a user before converting."
     },
     "firstDayOfWeek": {
      "type": "string",
@@ -7489,7 +7489,7 @@
     },
     "reportName": {
      "type": "string",
-     "description": "User-friendly name for the variable which will appear in reports. This is a required field, must be less than 65 characters long, and cannot contain the following characters: \"\"\"."
+     "description": "User-friendly name for the variable which will appear in reports. This is a required field, must be less than 64 characters long, and cannot contain the following characters: \"\"\u003c\u003e\"."
     },
     "variableType": {
      "type": "string",
diff --git a/dfareporting/v2.0/dfareporting-gen.go b/dfareporting/v2.0/dfareporting-gen.go
index 05e9bbf..3815c48 100644
--- a/dfareporting/v2.0/dfareporting-gen.go
+++ b/dfareporting/v2.0/dfareporting-gen.go
@@ -108,8 +108,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	AccountActiveAdSummaries *AccountActiveAdSummariesService
 
@@ -208,6 +209,13 @@
 	UserRoles *UserRolesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountActiveAdSummariesService(s *Service) *AccountActiveAdSummariesService {
 	rs := &AccountActiveAdSummariesService{s: s}
 	return rs
@@ -1733,7 +1741,7 @@
 }
 
 type ContentCategory struct {
-	// AccountId: Account ID of this content category.This is a read-only
+	// AccountId: Account ID of this content category. This is a read-only
 	// field that can be left blank.
 	AccountId int64 `json:"accountId,omitempty,string"`
 
@@ -1949,7 +1957,7 @@
 	// and HTML5_BANNER, and all RICH_MEDIA.
 	HtmlCode string `json:"htmlCode,omitempty"`
 
-	// HtmlCodeLocked: Whether HTML code is DCM generated or manually
+	// HtmlCodeLocked: Whether HTML code is DCM-generated or manually
 	// entered. Set to true to ignore changes to htmlCode. Applicable to the
 	// following creative types: FLASH_INPAGE and HTML5_BANNER.
 	HtmlCodeLocked bool `json:"htmlCodeLocked,omitempty"`
@@ -2193,7 +2201,7 @@
 	// asset. Applicable to the following creative types: all RICH_MEDIA.
 	HideSelectionBoxes bool `json:"hideSelectionBoxes,omitempty"`
 
-	// HorizontallyLocked: Wheter the asset is horizontally locked. This is
+	// HorizontallyLocked: Whether the asset is horizontally locked. This is
 	// a read-only field. Applicable to the following creative types: all
 	// RICH_MEDIA.
 	HorizontallyLocked bool `json:"horizontallyLocked,omitempty"`
@@ -2514,7 +2522,7 @@
 	// modified after insertion.
 	Id int64 `json:"id,omitempty,string"`
 
-	// PopupWindowProperties: Properties for rich media pop-up windows. This
+	// PopupWindowProperties: Properties for rich media popup windows. This
 	// field is used only for exit events.
 	PopupWindowProperties *PopupWindowProperties `json:"popupWindowProperties,omitempty"`
 
@@ -3324,8 +3332,8 @@
 }
 
 type FloodlightActivity struct {
-	// AccountId: Account ID of this floodlight activity.This is a read-only
-	// field that can be left blank.
+	// AccountId: Account ID of this floodlight activity. This is a
+	// read-only field that can be left blank.
 	AccountId int64 `json:"accountId,omitempty,string"`
 
 	// AdvertiserId: Advertiser ID of this floodlight activity. If this
@@ -3387,7 +3395,7 @@
 	Id int64 `json:"id,omitempty,string"`
 
 	// IdDimensionValue: Dimension value for the ID of this floodlight
-	// activity.This is a read-only, auto-generated field.
+	// activity. This is a read-only, auto-generated field.
 	IdDimensionValue *DimensionValue `json:"idDimensionValue,omitempty"`
 
 	// ImageTagEnabled: Whether the image tag is enabled for this activity.
@@ -3418,7 +3426,7 @@
 	// SslRequired: Whether this floodlight activity must be SSL-compliant.
 	SslRequired bool `json:"sslRequired,omitempty"`
 
-	// SubaccountId: Subaccount ID of this floodlight activity.This is a
+	// SubaccountId: Subaccount ID of this floodlight activity. This is a
 	// read-only field that can be left blank.
 	SubaccountId int64 `json:"subaccountId,omitempty,string"`
 
@@ -3478,7 +3486,7 @@
 }
 
 type FloodlightActivityGroup struct {
-	// AccountId: Account ID of this floodlight activity group.This is a
+	// AccountId: Account ID of this floodlight activity group. This is a
 	// read-only field that can be left blank.
 	AccountId int64 `json:"accountId,omitempty,string"`
 
@@ -3531,7 +3539,7 @@
 	// configuration. This field is read-only after insertion.
 	TagString string `json:"tagString,omitempty"`
 
-	// Type: The type of floodlight activity group. This is a required field
+	// Type: Type of the floodlight activity group. This is a required field
 	// that is read-only after insertion.
 	Type string `json:"type,omitempty"`
 }
@@ -3590,7 +3598,7 @@
 	// Google Analytics.
 	AnalyticsDataSharingEnabled bool `json:"analyticsDataSharingEnabled,omitempty"`
 
-	// ExposureToConversionEnabled: Whether the exposure to conversion
+	// ExposureToConversionEnabled: Whether the exposure-to-conversion
 	// report is enabled. This report shows detailed pathway information on
 	// up to 10 of the most recent ad exposures seen by a user before
 	// converting.
@@ -5363,8 +5371,8 @@
 	DataType string `json:"dataType,omitempty"`
 
 	// ReportName: User-friendly name for the variable which will appear in
-	// reports. This is a required field, must be less than 65 characters
-	// long, and cannot contain the following characters: """.
+	// reports. This is a required field, must be less than 64 characters
+	// long, and cannot contain the following characters: ""<>".
 	ReportName string `json:"reportName,omitempty"`
 
 	// VariableType: Variable name in the tag. This is a required field.
@@ -5550,7 +5558,7 @@
 		"profileId":        strconv.FormatInt(c.profileId, 10),
 		"summaryAccountId": strconv.FormatInt(c.summaryAccountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5638,7 +5646,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5723,7 +5731,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5803,7 +5811,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5888,7 +5896,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5968,7 +5976,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6149,7 +6157,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6304,7 +6312,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6400,7 +6408,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6483,7 +6491,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6645,7 +6653,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6788,7 +6796,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6884,7 +6892,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6967,7 +6975,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7060,7 +7068,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7395,7 +7403,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7717,7 +7725,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7813,7 +7821,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7896,7 +7904,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7977,7 +7985,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8070,7 +8078,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8217,7 +8225,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8355,7 +8363,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8451,7 +8459,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8534,7 +8542,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8627,7 +8635,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8835,7 +8843,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9016,7 +9024,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9112,7 +9120,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9192,7 +9200,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9282,7 +9290,7 @@
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9404,7 +9412,7 @@
 		"profileId":  strconv.FormatInt(c.profileId, 10),
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9516,7 +9524,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9615,7 +9623,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9849,7 +9857,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10030,7 +10038,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10126,7 +10134,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10209,7 +10217,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10407,7 +10415,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10693,7 +10701,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10796,7 +10804,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10876,7 +10884,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -10957,7 +10965,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11050,7 +11058,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11197,7 +11205,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11335,7 +11343,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11431,7 +11439,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11514,7 +11522,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"dartId":    strconv.FormatInt(c.dartId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11599,7 +11607,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11746,7 +11754,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -11759,6 +11767,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -11873,7 +11882,7 @@
 		"creativeFieldId": strconv.FormatInt(c.creativeFieldId, 10),
 		"id":              strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -11965,7 +11974,7 @@
 		"creativeFieldId": strconv.FormatInt(c.creativeFieldId, 10),
 		"id":              strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12069,7 +12078,7 @@
 		"creativeFieldId": strconv.FormatInt(c.creativeFieldId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12221,7 +12230,7 @@
 		"profileId":       strconv.FormatInt(c.profileId, 10),
 		"creativeFieldId": strconv.FormatInt(c.creativeFieldId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12370,7 +12379,7 @@
 		"creativeFieldId": strconv.FormatInt(c.creativeFieldId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12477,7 +12486,7 @@
 		"creativeFieldId": strconv.FormatInt(c.creativeFieldId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12568,7 +12577,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -12649,7 +12658,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12742,7 +12751,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -12899,7 +12908,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13044,7 +13053,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13140,7 +13149,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13223,7 +13232,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13316,7 +13325,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13483,7 +13492,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13634,7 +13643,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13730,7 +13739,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13813,7 +13822,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -13906,7 +13915,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14153,7 +14162,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14403,7 +14412,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14499,7 +14508,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14608,7 +14617,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14704,7 +14713,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -14868,7 +14877,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15004,7 +15013,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15230,7 +15239,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15396,7 +15405,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -15477,7 +15486,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15570,7 +15579,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15767,7 +15776,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -15938,7 +15947,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16034,7 +16043,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16117,7 +16126,7 @@
 		"reportId": strconv.FormatInt(c.reportId, 10),
 		"fileId":   strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16253,7 +16262,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16390,7 +16399,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -16479,7 +16488,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16565,7 +16574,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16658,7 +16667,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -16884,7 +16893,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17069,7 +17078,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17165,7 +17174,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17248,7 +17257,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -17329,7 +17338,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17422,7 +17431,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17607,7 +17616,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17770,7 +17779,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17866,7 +17875,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -17949,7 +17958,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18046,7 +18055,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18142,7 +18151,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18238,7 +18247,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18324,7 +18333,7 @@
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 		"id":         strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -18416,7 +18425,7 @@
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 		"id":         strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18520,7 +18529,7 @@
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18611,7 +18620,7 @@
 		"profileId":  strconv.FormatInt(c.profileId, 10),
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18711,7 +18720,7 @@
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18818,7 +18827,7 @@
 		"campaignId": strconv.FormatInt(c.campaignId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18906,7 +18915,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -18983,7 +18992,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19060,7 +19069,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19137,7 +19146,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19217,7 +19226,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19310,7 +19319,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19556,7 +19565,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19774,7 +19783,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19870,7 +19879,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -19953,7 +19962,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -20034,7 +20043,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -20127,7 +20136,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -20274,7 +20283,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -20412,7 +20421,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -20508,7 +20517,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -20618,7 +20627,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -20747,7 +20756,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -20840,7 +20849,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21115,7 +21124,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21367,7 +21376,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21463,7 +21472,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21543,7 +21552,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21620,7 +21629,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21697,7 +21706,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21777,7 +21786,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -21858,7 +21867,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -21951,7 +21960,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22081,7 +22090,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22226,7 +22235,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22327,7 +22336,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22428,7 +22437,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22526,7 +22535,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22612,7 +22621,7 @@
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 		"fileId":    strconv.FormatInt(c.fileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22749,7 +22758,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"reportId":  strconv.FormatInt(c.reportId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22878,7 +22887,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -22971,7 +22980,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23209,7 +23218,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23397,7 +23406,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23493,7 +23502,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23576,7 +23585,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23669,7 +23678,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23789,7 +23798,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23893,7 +23902,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -23986,7 +23995,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24132,7 +24141,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24270,7 +24279,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24366,7 +24375,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24446,7 +24455,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24520,7 +24529,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24589,7 +24598,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24674,7 +24683,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24754,7 +24763,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24849,7 +24858,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -24936,7 +24945,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -25017,7 +25026,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 		"id":        strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -25110,7 +25119,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -25277,7 +25286,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -25426,7 +25435,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -25522,7 +25531,7 @@
 		"profileId": strconv.FormatInt(c.profileId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/discovery/v1/discovery-gen.go b/discovery/v1/discovery-gen.go
index 1ff39cb..f8f3f6f 100644
--- a/discovery/v1/discovery-gen.go
+++ b/discovery/v1/discovery-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Apis *ApisService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewApisService(s *Service) *ApisService {
 	rs := &ApisService{s: s}
 	return rs
@@ -486,7 +494,7 @@
 		"api":     c.api,
 		"version": c.version,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -582,7 +590,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/dns/v1beta1/dns-api.json b/dns/v1beta1/dns-api.json
index d52e163..55b7785 100644
--- a/dns/v1beta1/dns-api.json
+++ b/dns/v1beta1/dns-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/_vgNPwHi8lDV9NY2AVX5qWWTYFo\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/wU8NjG2rANeT6LROBN3mCaSHZ_8\"",
  "discoveryVersion": "v1",
  "id": "dns:v1beta1",
  "name": "dns",
  "version": "v1beta1",
- "revision": "20141121",
+ "revision": "20150114",
  "title": "Google Cloud DNS API",
  "description": "The Google Cloud DNS API provides services for configuring and serving authoritative DNS records.",
  "ownerDomain": "google.com",
@@ -154,7 +154,7 @@
     },
     "description": {
      "type": "string",
-     "description": "A string to associate with this resource for the user's convenience. Has no effect on the managed zone's function."
+     "description": "A mutable string of at most 1024 characters associated with this resource for the user's convenience. Has no effect on the managed zone's function."
     },
     "dnsName": {
      "type": "string",
diff --git a/dns/v1beta1/dns-gen.go b/dns/v1beta1/dns-gen.go
index cf80a29..99da29c 100644
--- a/dns/v1beta1/dns-gen.go
+++ b/dns/v1beta1/dns-gen.go
@@ -66,8 +66,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Changes *ChangesService
 
@@ -78,6 +79,13 @@
 	ResourceRecordSets *ResourceRecordSetsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewChangesService(s *Service) *ChangesService {
 	rs := &ChangesService{s: s}
 	return rs
@@ -165,8 +173,9 @@
 	// This is in RFC3339 text format. Output only.
 	CreationTime string `json:"creationTime,omitempty"`
 
-	// Description: A string to associate with this resource for the user's
-	// convenience. Has no effect on the managed zone's function.
+	// Description: A mutable string of at most 1024 characters associated
+	// with this resource for the user's convenience. Has no effect on the
+	// managed zone's function.
 	Description string `json:"description,omitempty"`
 
 	// DnsName: The DNS name of this managed zone, for instance
@@ -353,7 +362,7 @@
 		"managedZone": c.managedZone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -446,7 +455,7 @@
 		"managedZone": c.managedZone,
 		"changeId":    c.changeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -583,7 +592,7 @@
 		"project":     c.project,
 		"managedZone": c.managedZone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -704,7 +713,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -787,7 +796,7 @@
 		"project":     c.project,
 		"managedZone": c.managedZone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -867,7 +876,7 @@
 		"project":     c.project,
 		"managedZone": c.managedZone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -975,7 +984,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1064,7 +1073,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1189,7 +1198,7 @@
 		"project":     c.project,
 		"managedZone": c.managedZone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go b/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go
index 2f312fb..38ed4f8 100644
--- a/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go
+++ b/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go
@@ -53,8 +53,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Lineitems *LineitemsService
 
@@ -63,6 +64,13 @@
 	Reports *ReportsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewLineitemsService(s *Service) *LineitemsService {
 	rs := &LineitemsService{s: s}
 	return rs
@@ -411,7 +419,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -480,7 +488,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -549,7 +557,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -615,7 +623,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"queryId": strconv.FormatInt(c.queryId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -682,7 +690,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"queryId": strconv.FormatInt(c.queryId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -752,7 +760,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -822,7 +830,7 @@
 		"queryId": strconv.FormatInt(c.queryId, 10),
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -892,7 +900,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"queryId": strconv.FormatInt(c.queryId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/doubleclicksearch/v2/doubleclicksearch-gen.go b/doubleclicksearch/v2/doubleclicksearch-gen.go
index d512dcc..1444401 100644
--- a/doubleclicksearch/v2/doubleclicksearch-gen.go
+++ b/doubleclicksearch/v2/doubleclicksearch-gen.go
@@ -59,8 +59,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Conversion *ConversionService
 
@@ -69,6 +70,13 @@
 	SavedColumns *SavedColumnsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewConversionService(s *Service) *ConversionService {
 	rs := &ConversionService{s: s}
 	return rs
@@ -601,7 +609,7 @@
 		"advertiserId":    strconv.FormatInt(c.advertiserId, 10),
 		"engineAccountId": strconv.FormatInt(c.engineAccountId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -760,7 +768,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -854,7 +862,7 @@
 	req, _ := http.NewRequest("PATCH", urls, body)
 	googleapi.SetOpaque(req.URL)
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -992,7 +1000,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1065,7 +1073,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1138,7 +1146,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1207,7 +1215,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"reportId": c.reportId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1286,7 +1294,7 @@
 		"reportId":       c.reportId,
 		"reportFragment": strconv.FormatInt(c.reportFragment, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1369,7 +1377,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1441,7 +1449,7 @@
 		"agencyId":     strconv.FormatInt(c.agencyId, 10),
 		"advertiserId": strconv.FormatInt(c.advertiserId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/drive/v1/drive-gen.go b/drive/v1/drive-gen.go
index d5c3f25..ac62c3f 100644
--- a/drive/v1/drive-gen.go
+++ b/drive/v1/drive-gen.go
@@ -58,12 +58,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Files *FilesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewFilesService(s *Service) *FilesService {
 	rs := &FilesService{s: s}
 	return rs
@@ -247,7 +255,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -406,7 +414,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -419,6 +427,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -553,7 +562,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -754,7 +763,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -767,6 +776,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
diff --git a/drive/v2/drive-api.json b/drive/v2/drive-api.json
index 55f9759..9462253 100644
--- a/drive/v2/drive-api.json
+++ b/drive/v2/drive-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/r3JYC00RrAy0V0PUgOxY3WtVFg8\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/ZgMjHnirW9jShGfpZfEVuQkjf2Y\"",
  "discoveryVersion": "v1",
  "id": "drive:v2",
  "name": "drive",
  "version": "v2",
- "revision": "20141112",
+ "revision": "20150108",
  "title": "Drive API",
  "description": "The API to interact with Drive.",
  "ownerDomain": "google.com",
@@ -1108,7 +1108,7 @@
       },
       "trashed": {
        "type": "boolean",
-       "description": "Whether this file has been trashed."
+       "description": "Whether this file has been trashed. This label applies to all users accessing the file; however, only owners are allowed to see and untrash files."
       },
       "viewed": {
        "type": "boolean",
@@ -1226,7 +1226,7 @@
      "properties": {
       "image": {
        "type": "string",
-       "description": "The URL-safe Base64 encoded bytes of the thumbnail image.",
+       "description": "The URL-safe Base64 encoded bytes of the thumbnail image. It should conform to RFC 4648 section 5.",
        "format": "byte"
       },
       "mimeType": {
@@ -1237,7 +1237,7 @@
     },
     "thumbnailLink": {
      "type": "string",
-     "description": "A link to the file's thumbnail."
+     "description": "A short-lived link to the file's thumbnail. Typically lasts on the order of hours."
     },
     "title": {
      "type": "string",
@@ -2415,7 +2415,7 @@
      "id": "drive.files.delete",
      "path": "files/{fileId}",
      "httpMethod": "DELETE",
-     "description": "Permanently deletes a file by ID. Skips the trash.",
+     "description": "Permanently deletes a file by ID. Skips the trash. The currently authenticated user must own the file.",
      "parameters": {
       "fileId": {
        "type": "string",
@@ -3297,7 +3297,7 @@
       },
       "transferOwnership": {
        "type": "boolean",
-       "description": "Whether changing a role to 'owner' should also downgrade the current owners to writers.",
+       "description": "Whether changing a role to 'owner' downgrades the current owners to writers. Does nothing if the specified role is not 'owner'.",
        "default": "false",
        "location": "query"
       }
@@ -3337,7 +3337,7 @@
       },
       "transferOwnership": {
        "type": "boolean",
-       "description": "Whether changing a role to 'owner' should also downgrade the current owners to writers.",
+       "description": "Whether changing a role to 'owner' downgrades the current owners to writers. Does nothing if the specified role is not 'owner'.",
        "default": "false",
        "location": "query"
       }
diff --git a/drive/v2/drive-gen.go b/drive/v2/drive-gen.go
index 69cfa57..377d8dd 100644
--- a/drive/v2/drive-gen.go
+++ b/drive/v2/drive-gen.go
@@ -88,8 +88,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	About *AboutService
 
@@ -118,6 +119,13 @@
 	Revisions *RevisionsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAboutService(s *Service) *AboutService {
 	rs := &AboutService{s: s}
 	return rs
@@ -934,7 +942,8 @@
 	// files that are not already thumbnailed by Google.
 	Thumbnail *FileThumbnail `json:"thumbnail,omitempty"`
 
-	// ThumbnailLink: A link to the file's thumbnail.
+	// ThumbnailLink: A short-lived link to the file's thumbnail. Typically
+	// lasts on the order of hours.
 	ThumbnailLink string `json:"thumbnailLink,omitempty"`
 
 	// Title: The title of this file.
@@ -1063,7 +1072,9 @@
 	// Starred: Whether this file is starred by the user.
 	Starred bool `json:"starred,omitempty"`
 
-	// Trashed: Whether this file has been trashed.
+	// Trashed: Whether this file has been trashed. This label applies to
+	// all users accessing the file; however, only owners are allowed to see
+	// and untrash files.
 	Trashed bool `json:"trashed,omitempty"`
 
 	// Viewed: Whether this file has been viewed by this user.
@@ -1071,7 +1082,8 @@
 }
 
 type FileThumbnail struct {
-	// Image: The URL-safe Base64 encoded bytes of the thumbnail image.
+	// Image: The URL-safe Base64 encoded bytes of the thumbnail image. It
+	// should conform to RFC 4648 section 5.
 	Image string `json:"image,omitempty"`
 
 	// MimeType: The MIME type of the thumbnail.
@@ -1439,7 +1451,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1529,7 +1541,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"appId": c.appId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1645,7 +1657,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1729,7 +1741,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"changeId": c.changeId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1858,7 +1870,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2018,7 +2030,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2130,7 +2142,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2200,7 +2212,7 @@
 		"folderId": c.folderId,
 		"childId":  c.childId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2280,7 +2292,7 @@
 		"folderId": c.folderId,
 		"childId":  c.childId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2375,7 +2387,7 @@
 		"folderId": c.folderId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2486,7 +2498,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"folderId": c.folderId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2587,7 +2599,7 @@
 		"fileId":    c.fileId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2679,7 +2691,7 @@
 		"fileId":    c.fileId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2778,7 +2790,7 @@
 		"fileId": c.fileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2902,7 +2914,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3017,7 +3029,7 @@
 		"commentId": c.commentId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3115,7 +3127,7 @@
 		"commentId": c.commentId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3282,7 +3294,7 @@
 		"fileId": c.fileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3383,7 +3395,8 @@
 	opt_   map[string]interface{}
 }
 
-// Delete: Permanently deletes a file by ID. Skips the trash.
+// Delete: Permanently deletes a file by ID. Skips the trash. The
+// currently authenticated user must own the file.
 func (r *FilesService) Delete(fileId string) *FilesDeleteCall {
 	c := &FilesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
 	c.fileId = fileId
@@ -3411,7 +3424,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3422,7 +3435,7 @@
 	}
 	return nil
 	// {
-	//   "description": "Permanently deletes a file by ID. Skips the trash.",
+	//   "description": "Permanently deletes a file by ID. Skips the trash. The currently authenticated user must own the file.",
 	//   "httpMethod": "DELETE",
 	//   "id": "drive.files.delete",
 	//   "parameterOrder": [
@@ -3478,7 +3491,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3568,7 +3581,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3821,7 +3834,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3834,6 +3847,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -4026,7 +4040,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4275,7 +4289,7 @@
 		"fileId": c.fileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4425,7 +4439,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4504,7 +4518,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4583,7 +4597,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4853,7 +4867,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4866,6 +4880,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -5076,7 +5091,7 @@
 		"fileId": c.fileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5191,7 +5206,7 @@
 		"fileId":   c.fileId,
 		"parentId": c.parentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5271,7 +5286,7 @@
 		"fileId":   c.fileId,
 		"parentId": c.parentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5366,7 +5381,7 @@
 		"fileId": c.fileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5447,7 +5462,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5530,7 +5545,7 @@
 		"fileId":       c.fileId,
 		"permissionId": c.permissionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5610,7 +5625,7 @@
 		"fileId":       c.fileId,
 		"permissionId": c.permissionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5696,7 +5711,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"email": c.email,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5807,7 +5822,7 @@
 		"fileId": c.fileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5898,7 +5913,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5961,8 +5976,8 @@
 }
 
 // TransferOwnership sets the optional parameter "transferOwnership":
-// Whether changing a role to 'owner' should also downgrade the current
-// owners to writers.
+// Whether changing a role to 'owner' downgrades the current owners to
+// writers. Does nothing if the specified role is not 'owner'.
 func (c *PermissionsPatchCall) TransferOwnership(transferOwnership bool) *PermissionsPatchCall {
 	c.opt_["transferOwnership"] = transferOwnership
 	return c
@@ -5999,7 +6014,7 @@
 		"permissionId": c.permissionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6036,7 +6051,7 @@
 	//     },
 	//     "transferOwnership": {
 	//       "default": "false",
-	//       "description": "Whether changing a role to 'owner' should also downgrade the current owners to writers.",
+	//       "description": "Whether changing a role to 'owner' downgrades the current owners to writers. Does nothing if the specified role is not 'owner'.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     }
@@ -6076,8 +6091,8 @@
 }
 
 // TransferOwnership sets the optional parameter "transferOwnership":
-// Whether changing a role to 'owner' should also downgrade the current
-// owners to writers.
+// Whether changing a role to 'owner' downgrades the current owners to
+// writers. Does nothing if the specified role is not 'owner'.
 func (c *PermissionsUpdateCall) TransferOwnership(transferOwnership bool) *PermissionsUpdateCall {
 	c.opt_["transferOwnership"] = transferOwnership
 	return c
@@ -6114,7 +6129,7 @@
 		"permissionId": c.permissionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6151,7 +6166,7 @@
 	//     },
 	//     "transferOwnership": {
 	//       "default": "false",
-	//       "description": "Whether changing a role to 'owner' should also downgrade the current owners to writers.",
+	//       "description": "Whether changing a role to 'owner' downgrades the current owners to writers. Does nothing if the specified role is not 'owner'.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     }
@@ -6220,7 +6235,7 @@
 		"fileId":      c.fileId,
 		"propertyKey": c.propertyKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6317,7 +6332,7 @@
 		"fileId":      c.fileId,
 		"propertyKey": c.propertyKey,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6418,7 +6433,7 @@
 		"fileId": c.fileId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6499,7 +6514,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6600,7 +6615,7 @@
 		"propertyKey": c.propertyKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6715,7 +6730,7 @@
 		"propertyKey": c.propertyKey,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6822,7 +6837,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6978,7 +6993,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6991,6 +7006,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -7092,7 +7108,7 @@
 		"commentId": c.commentId,
 		"replyId":   c.replyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7192,7 +7208,7 @@
 		"commentId": c.commentId,
 		"replyId":   c.replyId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7301,7 +7317,7 @@
 		"commentId": c.commentId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7424,7 +7440,7 @@
 		"fileId":    c.fileId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7544,7 +7560,7 @@
 		"replyId":   c.replyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7652,7 +7668,7 @@
 		"replyId":   c.replyId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7749,7 +7765,7 @@
 		"fileId":     c.fileId,
 		"revisionId": c.revisionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7830,7 +7846,7 @@
 		"fileId":     c.fileId,
 		"revisionId": c.revisionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7917,7 +7933,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"fileId": c.fileId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8008,7 +8024,7 @@
 		"revisionId": c.revisionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8107,7 +8123,7 @@
 		"revisionId": c.revisionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/fitness/v1/fitness-gen.go b/fitness/v1/fitness-gen.go
index 0bd589f..a45be94 100644
--- a/fitness/v1/fitness-gen.go
+++ b/fitness/v1/fitness-gen.go
@@ -72,12 +72,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Users *UsersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewUsersService(s *Service) *UsersService {
 	rs := &UsersService{s: s}
 	rs.DataSources = NewUsersDataSourcesService(s)
@@ -442,7 +450,7 @@
 		"userId": c.userId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -526,7 +534,7 @@
 		"userId":       c.userId,
 		"dataSourceId": c.dataSourceId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -628,7 +636,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -733,7 +741,7 @@
 		"dataSourceId": c.dataSourceId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -838,7 +846,7 @@
 		"dataSourceId": c.dataSourceId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -958,7 +966,7 @@
 		"dataSourceId": c.dataSourceId,
 		"datasetId":    c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1091,7 +1099,7 @@
 		"dataSourceId": c.dataSourceId,
 		"datasetId":    c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1227,7 +1235,7 @@
 		"datasetId":    c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1341,7 +1349,7 @@
 		"userId":    c.userId,
 		"sessionId": c.sessionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1469,7 +1477,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1591,7 +1599,7 @@
 		"sessionId": c.sessionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/freebase/v1-sandbox/freebase-gen.go b/freebase/v1-sandbox/freebase-gen.go
index 37a5ec0..7f11f86 100644
--- a/freebase/v1-sandbox/freebase-gen.go
+++ b/freebase/v1-sandbox/freebase-gen.go
@@ -50,8 +50,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type ReconcileCandidate struct {
@@ -214,7 +222,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -543,7 +551,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/freebase/v1/freebase-gen.go b/freebase/v1/freebase-gen.go
index 5dc866b..05d48b7 100644
--- a/freebase/v1/freebase-gen.go
+++ b/freebase/v1/freebase-gen.go
@@ -50,8 +50,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type ReconcileCandidate struct {
@@ -214,7 +222,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -543,7 +551,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/freebase/v1sandbox/freebase-gen.go b/freebase/v1sandbox/freebase-gen.go
index ed1a783..0ab3ca9 100644
--- a/freebase/v1sandbox/freebase-gen.go
+++ b/freebase/v1sandbox/freebase-gen.go
@@ -50,8 +50,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type ReconcileCandidate struct {
@@ -214,7 +222,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -543,7 +551,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/games/v1/games-gen.go b/games/v1/games-gen.go
index 88a1fea..fb51568 100644
--- a/games/v1/games-gen.go
+++ b/games/v1/games-gen.go
@@ -78,8 +78,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	AchievementDefinitions *AchievementDefinitionsService
 
@@ -112,6 +113,13 @@
 	TurnBasedMatches *TurnBasedMatchesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAchievementDefinitionsService(s *Service) *AchievementDefinitionsService {
 	rs := &AchievementDefinitionsService{s: s}
 	return rs
@@ -2575,7 +2583,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2677,7 +2685,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2813,7 +2821,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"playerId": c.playerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2926,7 +2934,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3009,7 +3017,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3096,7 +3104,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3178,7 +3186,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3270,7 +3278,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"applicationId": c.applicationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3364,7 +3372,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3452,7 +3460,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3567,7 +3575,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3668,7 +3676,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3754,7 +3762,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"leaderboardId": c.leaderboardId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3864,7 +3872,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3947,7 +3955,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4049,7 +4057,7 @@
 		"playerId":   c.playerId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4168,7 +4176,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"playerId": c.playerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4283,7 +4291,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4391,7 +4399,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4457,7 +4465,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4527,7 +4535,7 @@
 		"questId":     c.questId,
 		"milestoneId": c.milestoneId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4623,7 +4631,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"questId": c.questId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4739,7 +4747,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"playerId": c.playerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4833,7 +4841,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4925,7 +4933,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5012,7 +5020,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"roomId": c.roomId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5095,7 +5103,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"roomId": c.roomId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5175,7 +5183,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"roomId": c.roomId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5276,7 +5284,7 @@
 		"roomId": c.roomId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5380,7 +5388,7 @@
 		"roomId": c.roomId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5493,7 +5501,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5599,7 +5607,7 @@
 		"roomId": c.roomId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5739,7 +5747,7 @@
 		"leaderboardId": c.leaderboardId,
 		"timeSpan":      c.timeSpan,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5913,7 +5921,7 @@
 		"leaderboardId": c.leaderboardId,
 		"collection":    c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6103,7 +6111,7 @@
 		"leaderboardId": c.leaderboardId,
 		"collection":    c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6266,7 +6274,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"leaderboardId": c.leaderboardId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6376,7 +6384,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6462,7 +6470,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"snapshotId": c.snapshotId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6578,7 +6586,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"playerId": c.playerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6674,7 +6682,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6758,7 +6766,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6844,7 +6852,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6928,7 +6936,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7018,7 +7026,7 @@
 		"matchId": c.matchId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7123,7 +7131,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7220,7 +7228,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7313,7 +7321,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7422,7 +7430,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7571,7 +7579,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7695,7 +7703,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"matchId": c.matchId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7840,7 +7848,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7957,7 +7965,7 @@
 		"matchId": c.matchId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/gamesconfiguration/v1configuration/gamesconfiguration-gen.go b/gamesconfiguration/v1configuration/gamesconfiguration-gen.go
index 7e0bb17..0ef9afb 100644
--- a/gamesconfiguration/v1configuration/gamesconfiguration-gen.go
+++ b/gamesconfiguration/v1configuration/gamesconfiguration-gen.go
@@ -59,8 +59,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	AchievementConfigurations *AchievementConfigurationsService
 
@@ -69,6 +70,13 @@
 	LeaderboardConfigurations *LeaderboardConfigurationsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAchievementConfigurationsService(s *Service) *AchievementConfigurationsService {
 	rs := &AchievementConfigurationsService{s: s}
 	return rs
@@ -361,7 +369,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -431,7 +439,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -515,7 +523,7 @@
 		"applicationId": c.applicationId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -617,7 +625,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"applicationId": c.applicationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -715,7 +723,7 @@
 		"achievementId": c.achievementId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -803,7 +811,7 @@
 		"achievementId": c.achievementId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -948,7 +956,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -961,6 +969,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -1072,7 +1081,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"leaderboardId": c.leaderboardId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1142,7 +1151,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"leaderboardId": c.leaderboardId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1226,7 +1235,7 @@
 		"applicationId": c.applicationId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1328,7 +1337,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"applicationId": c.applicationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1426,7 +1435,7 @@
 		"leaderboardId": c.leaderboardId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1514,7 +1523,7 @@
 		"leaderboardId": c.leaderboardId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/gamesmanagement/v1management/gamesmanagement-gen.go b/gamesmanagement/v1management/gamesmanagement-gen.go
index 16f8346..0a969e8 100644
--- a/gamesmanagement/v1management/gamesmanagement-gen.go
+++ b/gamesmanagement/v1management/gamesmanagement-gen.go
@@ -68,8 +68,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Achievements *AchievementsService
 
@@ -88,6 +89,13 @@
 	TurnBasedMatches *TurnBasedMatchesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAchievementsService(s *Service) *AchievementsService {
 	rs := &AchievementsService{s: s}
 	return rs
@@ -401,7 +409,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -476,7 +484,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -540,7 +548,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -601,7 +609,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"achievementId": c.achievementId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -677,7 +685,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -763,7 +771,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"applicationId": c.applicationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -856,7 +864,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"eventId": c.eventId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -925,7 +933,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -982,7 +990,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1044,7 +1052,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"eventId": c.eventId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1121,7 +1129,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1188,7 +1196,7 @@
 		"applicationId": c.applicationId,
 		"playerId":      c.playerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1270,7 +1278,7 @@
 		"applicationId": c.applicationId,
 		"playerId":      c.playerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1349,7 +1357,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"questId": c.questId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1417,7 +1425,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1473,7 +1481,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1534,7 +1542,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"questId": c.questId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1610,7 +1618,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1670,7 +1678,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1727,7 +1735,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1788,7 +1796,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"leaderboardId": c.leaderboardId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1863,7 +1871,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1927,7 +1935,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1988,7 +1996,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"leaderboardId": c.leaderboardId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2065,7 +2073,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2124,7 +2132,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2182,7 +2190,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/gan/v1beta1/gan-gen.go b/gan/v1beta1/gan-gen.go
index b84801d..604cd38 100644
--- a/gan/v1beta1/gan-gen.go
+++ b/gan/v1beta1/gan-gen.go
@@ -56,8 +56,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Advertisers *AdvertisersService
 
@@ -72,6 +73,13 @@
 	Reports *ReportsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAdvertisersService(s *Service) *AdvertisersService {
 	rs := &AdvertisersService{s: s}
 	return rs
@@ -883,7 +891,7 @@
 		"role":   c.role,
 		"roleId": c.roleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1061,7 +1069,7 @@
 		"role":   c.role,
 		"roleId": c.roleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1227,7 +1235,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"publisher": c.publisher,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1501,7 +1509,7 @@
 		"role":   c.role,
 		"roleId": c.roleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1715,7 +1723,7 @@
 		"roleId": c.roleId,
 		"linkId": strconv.FormatInt(c.linkId, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1822,7 +1830,7 @@
 		"roleId": c.roleId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2047,7 +2055,7 @@
 		"role":   c.role,
 		"roleId": c.roleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2261,7 +2269,7 @@
 		"role":   c.role,
 		"roleId": c.roleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2439,7 +2447,7 @@
 		"role":   c.role,
 		"roleId": c.roleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2704,7 +2712,7 @@
 		"roleId":     c.roleId,
 		"reportType": c.reportType,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/genomics/v1beta/genomics-api.json b/genomics/v1beta/genomics-api.json
deleted file mode 100644
index 16d75e6..0000000
--- a/genomics/v1beta/genomics-api.json
+++ /dev/null
@@ -1,2315 +0,0 @@
-{
- "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/P0iF9O81Ih4OkuOxr8vmJcp5un4\"",
- "discoveryVersion": "v1",
- "id": "genomics:v1beta",
- "name": "genomics",
- "version": "v1beta",
- "revision": "20150208",
- "title": "Genomics API",
- "description": "Provides access to Genomics 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"
- },
- "documentationLink": "https://developers.google.com/genomics/v1beta/reference",
- "protocol": "rest",
- "baseUrl": "https://www.googleapis.com/genomics/v1beta/",
- "basePath": "/genomics/v1beta/",
- "rootUrl": "https://www.googleapis.com/",
- "servicePath": "genomics/v1beta/",
- "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/bigquery": {
-     "description": "View and manage your data in Google BigQuery"
-    },
-    "https://www.googleapis.com/auth/devstorage.read_write": {
-     "description": "Manage your data in Google Cloud Storage"
-    },
-    "https://www.googleapis.com/auth/genomics": {
-     "description": "View and manage Genomics data"
-    },
-    "https://www.googleapis.com/auth/genomics.readonly": {
-     "description": "View Genomics data"
-    }
-   }
-  }
- },
- "schemas": {
-  "Call": {
-   "id": "Call",
-   "type": "object",
-   "description": "A call represents the determination of genotype with respect to a particular variant. It may include associated information such as quality and phasing. For example, a call might assign a probability of 0.32 to the occurrence of a SNP named rs1234 in a call set with the name NA12345.",
-   "properties": {
-    "callSetId": {
-     "type": "string",
-     "description": "The ID of the call set this variant call belongs to."
-    },
-    "callSetName": {
-     "type": "string",
-     "description": "The name of the call set this variant call belongs to."
-    },
-    "genotype": {
-     "type": "array",
-     "description": "The genotype of this variant call. Each value represents either the value of the referenceBases field or a 1-based index into alternateBases. If a variant had a referenceBases value of T and an alternateBases value of [\"A\", \"C\"], and the genotype was [2, 1], that would mean the call represented the heterozygous value CA for this variant. If the genotype was instead [0, 1], the represented value would be TA. Ordering of the genotype values is important if the phaseset is present. If a genotype is not called (that is, a . is present in the GT string) -1 is returned.",
-     "items": {
-      "type": "integer",
-      "format": "int32"
-     }
-    },
-    "genotypeLikelihood": {
-     "type": "array",
-     "description": "The genotype likelihoods for this variant call. Each array entry represents how likely a specific genotype is for this call. The value ordering is defined by the GL tag in the VCF spec. If Phred-scaled genotype likelihood scores (PL) are available and log10(P) genotype likelihood scores (GL) are not, PL scores are converted to GL scores. If both are available, PL scores are stored in info.",
-     "items": {
-      "type": "number",
-      "format": "double"
-     }
-    },
-    "info": {
-     "type": "object",
-     "description": "A map of additional variant call information.",
-     "additionalProperties": {
-      "type": "array",
-      "description": "A string which maps to an array of values.",
-      "items": {
-       "type": "string"
-      }
-     }
-    },
-    "phaseset": {
-     "type": "string",
-     "description": "If this field is present, this variant call's genotype ordering implies the phase of the bases and is consistent with any other variant calls in the same reference sequence which have the same phaseset value. When importing data from VCF, if the genotype data was phased but no phase set was specified this field will be set to *."
-    }
-   }
-  },
-  "CallSet": {
-   "id": "CallSet",
-   "type": "object",
-   "description": "A call set is a collection of variant calls, typically for one sample. It belongs to a variant set.",
-   "properties": {
-    "created": {
-     "type": "string",
-     "description": "The date this call set was created in milliseconds from the epoch.",
-     "format": "int64"
-    },
-    "id": {
-     "type": "string",
-     "description": "The Google generated ID of the call set, immutable."
-    },
-    "info": {
-     "type": "object",
-     "description": "A map of additional call set information.",
-     "additionalProperties": {
-      "type": "array",
-      "description": "A string which maps to an array of values.",
-      "items": {
-       "type": "string"
-      }
-     }
-    },
-    "name": {
-     "type": "string",
-     "description": "The call set name."
-    },
-    "sampleId": {
-     "type": "string",
-     "description": "The sample ID this call set corresponds to."
-    },
-    "variantSetIds": {
-     "type": "array",
-     "description": "The IDs of the variant sets this call set belongs to.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "CoverageBucket": {
-   "id": "CoverageBucket",
-   "type": "object",
-   "description": "A bucket over which read coverage has been precomputed. A bucket corresponds to a specific range of the reference sequence.",
-   "properties": {
-    "meanCoverage": {
-     "type": "number",
-     "description": "The average number of reads which are aligned to each individual reference base in this bucket.",
-     "format": "float"
-    },
-    "range": {
-     "$ref": "GenomicRange",
-     "description": "The genomic coordinate range spanned by this bucket."
-    }
-   }
-  },
-  "Dataset": {
-   "id": "Dataset",
-   "type": "object",
-   "description": "A Dataset is a collection of genomic data.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "The Google generated ID of the dataset, immutable."
-    },
-    "isPublic": {
-     "type": "boolean",
-     "description": "Flag indicating whether or not a dataset is publicly viewable. If a dataset is not public, it inherits viewing permissions from its project."
-    },
-    "name": {
-     "type": "string",
-     "description": "The dataset name."
-    },
-    "projectId": {
-     "type": "string",
-     "description": "The Google Developers Console project number that this dataset belongs to.",
-     "format": "int64"
-    }
-   }
-  },
-  "ExperimentalCreateJobRequest": {
-   "id": "ExperimentalCreateJobRequest",
-   "type": "object",
-   "description": "The job creation request.",
-   "properties": {
-    "align": {
-     "type": "boolean",
-     "description": "Specifies whether or not to run the alignment pipeline. Either align or callVariants must be set."
-    },
-    "callVariants": {
-     "type": "boolean",
-     "description": "Specifies whether or not to run the variant calling pipeline. Either align or callVariants must be set."
-    },
-    "gcsOutputPath": {
-     "type": "string",
-     "description": "Specifies where to copy the results of certain pipelines. This should be in the form of gs://bucket/path."
-    },
-    "pairedSourceUris": {
-     "type": "array",
-     "description": "A list of Google Cloud Storage URIs of paired end .fastq files to operate upon. If specified, this represents the second file of each paired .fastq file. The first file of each pair should be specified in sourceUris.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "projectId": {
-     "type": "string",
-     "description": "Required. The Google Cloud Project ID with which to associate the request.",
-     "format": "int64"
-    },
-    "sourceUris": {
-     "type": "array",
-     "description": "A list of Google Cloud Storage URIs of data files to operate upon. These can be .bam, interleaved .fastq, or paired .fastq. If specifying paired .fastq files, the first of each pair of files should be listed here, and the second of each pair should be listed in pairedSourceUris.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "ExperimentalCreateJobResponse": {
-   "id": "ExperimentalCreateJobResponse",
-   "type": "object",
-   "description": "The job creation response.",
-   "properties": {
-    "jobId": {
-     "type": "string",
-     "description": "A job ID that can be used to get status information."
-    }
-   }
-  },
-  "ExportReadsetsRequest": {
-   "id": "ExportReadsetsRequest",
-   "type": "object",
-   "description": "The readset export request.",
-   "properties": {
-    "exportUri": {
-     "type": "string",
-     "description": "A Google Cloud Storage URI where the exported BAM file will be created. The currently authenticated user must have write access to the new file location. An error will be returned if the URI already contains data."
-    },
-    "projectId": {
-     "type": "string",
-     "description": "The Google Developers Console project number that owns this export.",
-     "format": "int64"
-    },
-    "readsetIds": {
-     "type": "array",
-     "description": "The IDs of the readsets to export.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "referenceNames": {
-     "type": "array",
-     "description": "The reference names to export. If this is not specified, all reference sequences, including unmapped reads, are exported. Use * to export only unmapped reads.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "ExportReadsetsResponse": {
-   "id": "ExportReadsetsResponse",
-   "type": "object",
-   "description": "The readset export response.",
-   "properties": {
-    "jobId": {
-     "type": "string",
-     "description": "A job ID that can be used to get status information."
-    }
-   }
-  },
-  "ExportVariantsRequest": {
-   "id": "ExportVariantsRequest",
-   "type": "object",
-   "description": "The variant data export request.",
-   "properties": {
-    "bigqueryDataset": {
-     "type": "string",
-     "description": "The BigQuery dataset to export data to. Note that this is distinct from the Genomics concept of \"dataset\"."
-    },
-    "bigqueryTable": {
-     "type": "string",
-     "description": "The BigQuery table to export data to. If the table doesn't exist, it will be created. If it already exists, it will be overwritten."
-    },
-    "callSetIds": {
-     "type": "array",
-     "description": "If provided, only variant call information from the specified call sets will be exported. By default all variant calls are exported.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "format": {
-     "type": "string",
-     "description": "The format for the exported data.",
-     "enum": [
-      "bigquery"
-     ],
-     "enumDescriptions": [
-      ""
-     ]
-    },
-    "projectId": {
-     "type": "string",
-     "description": "The Google Cloud project number that owns the destination BigQuery dataset. The caller must have WRITE access to this project. This project will also own the resulting export job.",
-     "format": "int64"
-    },
-    "variantSetId": {
-     "type": "string",
-     "description": "Required. The ID of the variant set that contains variant data which should be exported. The caller must have READ access to this variant set."
-    }
-   }
-  },
-  "ExportVariantsResponse": {
-   "id": "ExportVariantsResponse",
-   "type": "object",
-   "description": "The variant data export response.",
-   "properties": {
-    "jobId": {
-     "type": "string",
-     "description": "A job ID that can be used to get status information."
-    }
-   }
-  },
-  "GenomicRange": {
-   "id": "GenomicRange",
-   "type": "object",
-   "description": "An inclusive, exclusive genomic coordinate range over a reference sequence.",
-   "properties": {
-    "sequenceEnd": {
-     "type": "string",
-     "description": "The end position of the range on the reference, 1-based exclusive. If specified, sequenceName must also be specified.",
-     "format": "uint64"
-    },
-    "sequenceName": {
-     "type": "string",
-     "description": "The reference sequence name, for example chr1, 1, or chrX."
-    },
-    "sequenceStart": {
-     "type": "string",
-     "description": "The start position of the range on the reference, 1-based inclusive. If specified, sequenceName must also be specified.",
-     "format": "uint64"
-    }
-   }
-  },
-  "Header": {
-   "id": "Header",
-   "type": "object",
-   "properties": {
-    "sortingOrder": {
-     "type": "string",
-     "description": "(SO) Sorting order of alignments."
-    },
-    "version": {
-     "type": "string",
-     "description": "(VN) BAM format version."
-    }
-   }
-  },
-  "HeaderSection": {
-   "id": "HeaderSection",
-   "type": "object",
-   "description": "The header section of the BAM/SAM file.",
-   "properties": {
-    "comments": {
-     "type": "array",
-     "description": "(@CO) One-line text comments.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUri": {
-     "type": "string",
-     "description": "[Deprecated] This field is deprecated and will no longer be populated. Please use filename instead."
-    },
-    "filename": {
-     "type": "string",
-     "description": "The name of the file from which this data was imported."
-    },
-    "headers": {
-     "type": "array",
-     "description": "(@HD) The header line.",
-     "items": {
-      "$ref": "Header"
-     }
-    },
-    "programs": {
-     "type": "array",
-     "description": "(@PG) Programs.",
-     "items": {
-      "$ref": "Program"
-     }
-    },
-    "readGroups": {
-     "type": "array",
-     "description": "(@RG) Read group.",
-     "items": {
-      "$ref": "ReadGroup"
-     }
-    },
-    "refSequences": {
-     "type": "array",
-     "description": "(@SQ) Reference sequence dictionary.",
-     "items": {
-      "$ref": "ReferenceSequence"
-     }
-    }
-   }
-  },
-  "ImportReadsetsRequest": {
-   "id": "ImportReadsetsRequest",
-   "type": "object",
-   "description": "The readset import request.",
-   "properties": {
-    "datasetId": {
-     "type": "string",
-     "description": "Required. The ID of the dataset these readsets will belong to. The caller must have WRITE permissions to this dataset."
-    },
-    "sourceUris": {
-     "type": "array",
-     "description": "A list of URIs pointing at BAM files in Google Cloud Storage.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "ImportReadsetsResponse": {
-   "id": "ImportReadsetsResponse",
-   "type": "object",
-   "description": "The readset import response.",
-   "properties": {
-    "jobId": {
-     "type": "string",
-     "description": "A job ID that can be used to get status information."
-    }
-   }
-  },
-  "ImportVariantsRequest": {
-   "id": "ImportVariantsRequest",
-   "type": "object",
-   "description": "The variant data import request.",
-   "properties": {
-    "format": {
-     "type": "string",
-     "description": "The format of the variant data being imported.",
-     "enum": [
-      "completeGenomics",
-      "vcf"
-     ],
-     "enumDescriptions": [
-      "",
-      ""
-     ]
-    },
-    "sourceUris": {
-     "type": "array",
-     "description": "A list of URIs pointing at VCF files in Google Cloud Storage. See the VCF Specification for more details on the input format.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "variantSetId": {
-     "type": "string",
-     "description": "Required. The variant set to which variant data should be imported."
-    }
-   }
-  },
-  "ImportVariantsResponse": {
-   "id": "ImportVariantsResponse",
-   "type": "object",
-   "description": "The variant data import response.",
-   "properties": {
-    "jobId": {
-     "type": "string",
-     "description": "A job ID that can be used to get status information."
-    }
-   }
-  },
-  "Job": {
-   "id": "Job",
-   "type": "object",
-   "description": "A Job represents an ongoing process that can be monitored for status information.",
-   "properties": {
-    "created": {
-     "type": "string",
-     "description": "The date this job was created, in milliseconds from the epoch.",
-     "format": "int64"
-    },
-    "description": {
-     "type": "string",
-     "description": "A more detailed description of this job's current status."
-    },
-    "errors": {
-     "type": "array",
-     "description": "Any errors that occurred during processing.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "id": {
-     "type": "string",
-     "description": "The job ID."
-    },
-    "importedIds": {
-     "type": "array",
-     "description": "If this Job represents an import, this field will contain the IDs of the objects that were successfully imported.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "projectId": {
-     "type": "string",
-     "description": "The Google Developers Console project number to which this job belongs.",
-     "format": "int64"
-    },
-    "request": {
-     "$ref": "JobRequest",
-     "description": "A summarized representation of the original service request."
-    },
-    "status": {
-     "type": "string",
-     "description": "The status of this job.",
-     "enum": [
-      "canceled",
-      "failure",
-      "new",
-      "pending",
-      "running",
-      "success",
-      "unknownStatus"
-     ],
-     "enumDescriptions": [
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      ""
-     ]
-    },
-    "warnings": {
-     "type": "array",
-     "description": "Any warnings that occurred during processing.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "JobRequest": {
-   "id": "JobRequest",
-   "type": "object",
-   "description": "A summary representation of the service request that spawned the job.",
-   "properties": {
-    "destination": {
-     "type": "array",
-     "description": "The data destination of the request, for example, a Google BigQuery Table or Dataset ID.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "source": {
-     "type": "array",
-     "description": "The data source of the request, for example, a Google Cloud Storage object path or Readset ID.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "type": {
-     "type": "string",
-     "description": "The original request type.",
-     "enum": [
-      "alignReadsets",
-      "callReadsets",
-      "experimentalCreateJob",
-      "exportReadsets",
-      "exportVariants",
-      "importReadsets",
-      "importVariants",
-      "unknownType"
-     ],
-     "enumDescriptions": [
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      ""
-     ]
-    }
-   }
-  },
-  "ListCoverageBucketsResponse": {
-   "id": "ListCoverageBucketsResponse",
-   "type": "object",
-   "properties": {
-    "bucketWidth": {
-     "type": "string",
-     "description": "The length of each coverage bucket in base pairs. Note that buckets at the end of a reference sequence may be shorter. This value is omitted if the bucket width is infinity (the default behaviour, with no range or targetBucketWidth).",
-     "format": "uint64"
-    },
-    "coverageBuckets": {
-     "type": "array",
-     "description": "The coverage buckets. The list of buckets is sparse; a bucket with 0 overlapping reads is not returned. A bucket never crosses more than one reference sequence. Each bucket has width bucketWidth, unless its end is the end of the reference sequence.",
-     "items": {
-      "$ref": "CoverageBucket"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results."
-    }
-   }
-  },
-  "ListDatasetsResponse": {
-   "id": "ListDatasetsResponse",
-   "type": "object",
-   "description": "The dataset list response.",
-   "properties": {
-    "datasets": {
-     "type": "array",
-     "description": "The list of matching Datasets.",
-     "items": {
-      "$ref": "Dataset"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results."
-    }
-   }
-  },
-  "MergeVariantsRequest": {
-   "id": "MergeVariantsRequest",
-   "type": "object",
-   "properties": {
-    "variants": {
-     "type": "array",
-     "description": "The variants to be merged with existing variants.",
-     "items": {
-      "$ref": "Variant"
-     }
-    }
-   }
-  },
-  "Metadata": {
-   "id": "Metadata",
-   "type": "object",
-   "description": "Metadata describes a single piece of variant call metadata. These data include a top level key and either a single value string (value) or a list of key-value pairs (info.) Value and info are mutually exclusive.",
-   "properties": {
-    "description": {
-     "type": "string",
-     "description": "A textual description of this metadata."
-    },
-    "id": {
-     "type": "string",
-     "description": "User-provided ID field, not enforced by this API. Two or more pieces of structured metadata with identical id and key fields are considered equivalent."
-    },
-    "info": {
-     "type": "object",
-     "description": "Remaining structured metadata key-value pairs.",
-     "additionalProperties": {
-      "type": "array",
-      "description": "A string which maps to an array of values.",
-      "items": {
-       "type": "string"
-      }
-     }
-    },
-    "key": {
-     "type": "string",
-     "description": "The top-level key."
-    },
-    "number": {
-     "type": "string",
-     "description": "The number of values that can be included in a field described by this metadata."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of data. Possible types include: Integer, Float, Flag, Character, and String.",
-     "enum": [
-      "character",
-      "flag",
-      "float",
-      "integer",
-      "string",
-      "unknownType"
-     ],
-     "enumDescriptions": [
-      "",
-      "",
-      "",
-      "",
-      "",
-      ""
-     ]
-    },
-    "value": {
-     "type": "string",
-     "description": "The value field for simple metadata"
-    }
-   }
-  },
-  "Program": {
-   "id": "Program",
-   "type": "object",
-   "properties": {
-    "commandLine": {
-     "type": "string",
-     "description": "(CL) Command line."
-    },
-    "id": {
-     "type": "string",
-     "description": "(ID) Program record identifier."
-    },
-    "name": {
-     "type": "string",
-     "description": "(PN) Program name."
-    },
-    "prevProgramId": {
-     "type": "string",
-     "description": "(PP) Previous program ID."
-    },
-    "version": {
-     "type": "string",
-     "description": "(VN) Program version."
-    }
-   }
-  },
-  "Read": {
-   "id": "Read",
-   "type": "object",
-   "description": "A Read is a group of bases that may or may not have been aligned to a reference. It contains quality information and other metadata.",
-   "properties": {
-    "alignedBases": {
-     "type": "string",
-     "description": "The originalBases after the cigar field has been applied. Deletions are represented with '-' and insertions are omitted."
-    },
-    "baseQuality": {
-     "type": "string",
-     "description": "Represents the quality of each base in this read. Each character represents one base. To get the quality, take the ASCII value of the character and subtract 33. (QUAL)"
-    },
-    "cigar": {
-     "type": "string",
-     "description": "A condensed representation of how this read matches up to the reference. (CIGAR)"
-    },
-    "flags": {
-     "type": "integer",
-     "description": "Each bit of this number has a different meaning if enabled. See the full BAM spec for more details. (FLAG)",
-     "format": "int32"
-    },
-    "id": {
-     "type": "string",
-     "description": "The Google generated ID of the read, immutable."
-    },
-    "mappingQuality": {
-     "type": "integer",
-     "description": "A score up to 255 that represents how likely this read's aligned position is to be correct. A higher value is better. (MAPQ)",
-     "format": "int32"
-    },
-    "matePosition": {
-     "type": "integer",
-     "description": "The 1-based start position of the paired read. (PNEXT)",
-     "format": "int32"
-    },
-    "mateReferenceSequenceName": {
-     "type": "string",
-     "description": "The name of the sequence that the paired read is aligned to. This is usually the same as referenceSequenceName. (RNEXT)"
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the read. When imported from a BAM file, this is the query template name. (QNAME)"
-    },
-    "originalBases": {
-     "type": "string",
-     "description": "The list of bases that this read represents (such as \"CATCGA\"). (SEQ)"
-    },
-    "position": {
-     "type": "integer",
-     "description": "The 1-based start position of the aligned read. If the first base starts at the very beginning of the reference sequence, then the position would be '1'. (POS)",
-     "format": "int32"
-    },
-    "readsetId": {
-     "type": "string",
-     "description": "The ID of the readset this read belongs to."
-    },
-    "referenceSequenceName": {
-     "type": "string",
-     "description": "The name of the sequence that this read is aligned to. This would be, for example, 'X' for the X Chromosome or '20' for Chromosome 20. (RNAME)"
-    },
-    "tags": {
-     "type": "object",
-     "description": "A map of additional read information. (TAG)",
-     "additionalProperties": {
-      "type": "array",
-      "description": "A string which maps to an array of values.",
-      "items": {
-       "type": "string"
-      }
-     }
-    },
-    "templateLength": {
-     "type": "integer",
-     "description": "Length of the original piece of DNA that produced both this read and the paired read. (TLEN)",
-     "format": "int32"
-    }
-   }
-  },
-  "ReadGroup": {
-   "id": "ReadGroup",
-   "type": "object",
-   "properties": {
-    "date": {
-     "type": "string",
-     "description": "(DT) Date the run was produced (ISO8601 date or date/time)."
-    },
-    "description": {
-     "type": "string",
-     "description": "(DS) Description."
-    },
-    "flowOrder": {
-     "type": "string",
-     "description": "(FO) Flow order. The array of nucleotide bases that correspond to the nucleotides used for each flow of each read."
-    },
-    "id": {
-     "type": "string",
-     "description": "(ID) Read group identifier."
-    },
-    "keySequence": {
-     "type": "string",
-     "description": "(KS) The array of nucleotide bases that correspond to the key sequence of each read."
-    },
-    "library": {
-     "type": "string",
-     "description": "(LS) Library."
-    },
-    "platformUnit": {
-     "type": "string",
-     "description": "(PU) Platform unit."
-    },
-    "predictedInsertSize": {
-     "type": "integer",
-     "description": "(PI) Predicted median insert size.",
-     "format": "int32"
-    },
-    "processingProgram": {
-     "type": "string",
-     "description": "(PG) Programs used for processing the read group."
-    },
-    "sample": {
-     "type": "string",
-     "description": "(SM) Sample."
-    },
-    "sequencingCenterName": {
-     "type": "string",
-     "description": "(CN) Name of sequencing center producing the read."
-    },
-    "sequencingTechnology": {
-     "type": "string",
-     "description": "(PL) Platform/technology used to produce the reads."
-    }
-   }
-  },
-  "Readset": {
-   "id": "Readset",
-   "type": "object",
-   "description": "A Readset is a collection of Reads.",
-   "properties": {
-    "datasetId": {
-     "type": "string",
-     "description": "The ID of the dataset this readset belongs to."
-    },
-    "fileData": {
-     "type": "array",
-     "description": "File information from the original BAM import. See the BAM format specification for additional information on each field.",
-     "items": {
-      "$ref": "HeaderSection"
-     }
-    },
-    "id": {
-     "type": "string",
-     "description": "The Google generated ID of the readset, immutable."
-    },
-    "name": {
-     "type": "string",
-     "description": "The readset name, typically this is the sample name."
-    }
-   }
-  },
-  "ReferenceBound": {
-   "id": "ReferenceBound",
-   "type": "object",
-   "description": "ReferenceBound records an upper bound for the starting coordinate of variants in a particular reference.",
-   "properties": {
-    "referenceName": {
-     "type": "string",
-     "description": "The reference the bound is associate with."
-    },
-    "upperBound": {
-     "type": "string",
-     "description": "An upper bound (inclusive) on the starting coordinate of any variant in the reference sequence.",
-     "format": "int64"
-    }
-   }
-  },
-  "ReferenceSequence": {
-   "id": "ReferenceSequence",
-   "type": "object",
-   "properties": {
-    "assemblyId": {
-     "type": "string",
-     "description": "(AS) Genome assembly identifier."
-    },
-    "length": {
-     "type": "integer",
-     "description": "(LN) Reference sequence length.",
-     "format": "int32"
-    },
-    "md5Checksum": {
-     "type": "string",
-     "description": "(M5) MD5 checksum of the sequence in the uppercase, excluding spaces but including pads as *."
-    },
-    "name": {
-     "type": "string",
-     "description": "(SN) Reference sequence name."
-    },
-    "species": {
-     "type": "string",
-     "description": "(SP) Species."
-    },
-    "uri": {
-     "type": "string",
-     "description": "(UR) URI of the sequence."
-    }
-   }
-  },
-  "SearchCallSetsRequest": {
-   "id": "SearchCallSetsRequest",
-   "type": "object",
-   "description": "The call set search request.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "Only return call sets for which a substring of the name matches this string."
-    },
-    "pageSize": {
-     "type": "integer",
-     "description": "The maximum number of call sets to return.",
-     "format": "int32"
-    },
-    "pageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response."
-    },
-    "variantSetIds": {
-     "type": "array",
-     "description": "Restrict the query to call sets within the given variant sets. At least one ID must be provided.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "SearchCallSetsResponse": {
-   "id": "SearchCallSetsResponse",
-   "type": "object",
-   "description": "The call set search response.",
-   "properties": {
-    "callSets": {
-     "type": "array",
-     "description": "The list of matching call sets.",
-     "items": {
-      "$ref": "CallSet"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results."
-    }
-   }
-  },
-  "SearchJobsRequest": {
-   "id": "SearchJobsRequest",
-   "type": "object",
-   "description": "The jobs search request.",
-   "properties": {
-    "createdAfter": {
-     "type": "string",
-     "description": "If specified, only jobs created on or after this date, given in milliseconds since Unix epoch, will be returned.",
-     "format": "int64"
-    },
-    "createdBefore": {
-     "type": "string",
-     "description": "If specified, only jobs created prior to this date, given in milliseconds since Unix epoch, will be returned.",
-     "format": "int64"
-    },
-    "maxResults": {
-     "type": "string",
-     "description": "Specifies the number of results to return in a single page. Defaults to 128. The maximum value is 256.",
-     "format": "uint64"
-    },
-    "pageToken": {
-     "type": "string",
-     "description": "The continuation token which is used to page through large result sets. To get the next page of results, set this parameter to the value of the nextPageToken from the previous response."
-    },
-    "projectId": {
-     "type": "string",
-     "description": "Required. Only return jobs which belong to this Google Developers Console project.",
-     "format": "int64"
-    },
-    "status": {
-     "type": "array",
-     "description": "Only return jobs which have a matching status.",
-     "items": {
-      "type": "string",
-      "enum": [
-       "canceled",
-       "failure",
-       "new",
-       "pending",
-       "running",
-       "success",
-       "unknownStatus"
-      ],
-      "enumDescriptions": [
-       "",
-       "",
-       "",
-       "",
-       "",
-       "",
-       ""
-      ]
-     }
-    }
-   }
-  },
-  "SearchJobsResponse": {
-   "id": "SearchJobsResponse",
-   "type": "object",
-   "description": "The job search response.",
-   "properties": {
-    "jobs": {
-     "type": "array",
-     "description": "The list of jobs results, ordered newest to oldest.",
-     "items": {
-      "$ref": "Job"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token which is used to page through large result sets. Provide this value is a subsequent request to return the next page of results. This field will be empty if there are no more results."
-    }
-   }
-  },
-  "SearchReadsRequest": {
-   "id": "SearchReadsRequest",
-   "type": "object",
-   "description": "The read search request.",
-   "properties": {
-    "maxResults": {
-     "type": "string",
-     "description": "Specifies number of results to return in a single page. If unspecified, it will default to 256. The maximum value is 2048.",
-     "format": "uint64"
-    },
-    "pageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response."
-    },
-    "readsetIds": {
-     "type": "array",
-     "description": "The readsets within which to search for reads. At least one readset ID must be provided. All specified readsets must be aligned against a common set of reference sequences; this defines the genomic coordinates for the query.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "sequenceEnd": {
-     "type": "string",
-     "description": "The end position (1-based, inclusive) of the target range. If specified, sequenceName must also be specified. Defaults to the end of the target reference sequence, if any.",
-     "format": "uint64"
-    },
-    "sequenceName": {
-     "type": "string",
-     "description": "Restricts the results to a particular reference sequence such as 1, chr1, or X. The set of valid references sequences depends on the readsets specified. If set to *, only unmapped Reads are returned."
-    },
-    "sequenceStart": {
-     "type": "string",
-     "description": "The start position (1-based, inclusive) of the target range. If specified, sequenceName must also be specified. Defaults to the start of the target reference sequence, if any.",
-     "format": "uint64"
-    }
-   }
-  },
-  "SearchReadsResponse": {
-   "id": "SearchReadsResponse",
-   "type": "object",
-   "description": "The read search response.",
-   "properties": {
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results."
-    },
-    "reads": {
-     "type": "array",
-     "description": "The list of matching Reads. The resulting Reads are sorted by position; the smallest positions are returned first. Unmapped reads, which have no position, are returned last and are further sorted alphabetically by name.",
-     "items": {
-      "$ref": "Read"
-     }
-    }
-   }
-  },
-  "SearchReadsetsRequest": {
-   "id": "SearchReadsetsRequest",
-   "type": "object",
-   "description": "The readset search request.",
-   "properties": {
-    "datasetIds": {
-     "type": "array",
-     "description": "Restricts this query to readsets within the given datasets. At least one ID must be provided.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "maxResults": {
-     "type": "string",
-     "description": "Specifies number of results to return in a single page. If unspecified, it will default to 128. The maximum value is 1024.",
-     "format": "uint64"
-    },
-    "name": {
-     "type": "string",
-     "description": "Only return readsets for which a substring of the name matches this string."
-    },
-    "pageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response."
-    }
-   }
-  },
-  "SearchReadsetsResponse": {
-   "id": "SearchReadsetsResponse",
-   "type": "object",
-   "description": "The readset search response.",
-   "properties": {
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results."
-    },
-    "readsets": {
-     "type": "array",
-     "description": "The list of matching Readsets.",
-     "items": {
-      "$ref": "Readset"
-     }
-    }
-   }
-  },
-  "SearchVariantSetsRequest": {
-   "id": "SearchVariantSetsRequest",
-   "type": "object",
-   "description": "The search variant sets request.",
-   "properties": {
-    "datasetIds": {
-     "type": "array",
-     "description": "Exactly one dataset ID must be provided here. Only variant sets which belong to this dataset will be returned.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "pageSize": {
-     "type": "integer",
-     "description": "The maximum number of variant sets to return in a request.",
-     "format": "int32"
-    },
-    "pageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response."
-    }
-   }
-  },
-  "SearchVariantSetsResponse": {
-   "id": "SearchVariantSetsResponse",
-   "type": "object",
-   "description": "The search variant sets response.",
-   "properties": {
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results."
-    },
-    "variantSets": {
-     "type": "array",
-     "description": "The variant sets belonging to the requested dataset.",
-     "items": {
-      "$ref": "VariantSet"
-     }
-    }
-   }
-  },
-  "SearchVariantsRequest": {
-   "id": "SearchVariantsRequest",
-   "type": "object",
-   "description": "The variant search request.",
-   "properties": {
-    "callSetIds": {
-     "type": "array",
-     "description": "Only return variant calls which belong to call sets with these ids. Leaving this blank returns all variant calls. If a variant has no calls belonging to any of these call sets, it won't be returned at all. Currently, variants with no calls from any call set will never be returned.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "end": {
-     "type": "string",
-     "description": "Required. The end of the window (0-based, exclusive) for which overlapping variants should be returned.",
-     "format": "int64"
-    },
-    "maxCalls": {
-     "type": "integer",
-     "description": "The maximum number of calls to return. However, at least one variant will always be returned, even if it has more calls than this limit.",
-     "format": "int32"
-    },
-    "pageSize": {
-     "type": "integer",
-     "description": "The maximum number of variants to return.",
-     "format": "int32"
-    },
-    "pageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response."
-    },
-    "referenceName": {
-     "type": "string",
-     "description": "Required. Only return variants in this reference sequence."
-    },
-    "start": {
-     "type": "string",
-     "description": "Required. The beginning of the window (0-based, inclusive) for which overlapping variants should be returned.",
-     "format": "int64"
-    },
-    "variantName": {
-     "type": "string",
-     "description": "Only return variants which have exactly this name."
-    },
-    "variantSetIds": {
-     "type": "array",
-     "description": "Exactly one variant set ID must be provided. Only variants from this variant set will be returned.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "SearchVariantsResponse": {
-   "id": "SearchVariantsResponse",
-   "type": "object",
-   "description": "The variant search response.",
-   "properties": {
-    "nextPageToken": {
-     "type": "string",
-     "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results."
-    },
-    "variants": {
-     "type": "array",
-     "description": "The list of matching Variants.",
-     "items": {
-      "$ref": "Variant"
-     }
-    }
-   }
-  },
-  "Variant": {
-   "id": "Variant",
-   "type": "object",
-   "description": "A variant represents a change in DNA sequence relative to a reference sequence. For example, a variant could represent a SNP or an insertion. Variants belong to a variant set. Each of the calls on a variant represent a determination of genotype with respect to that variant. For example, a call might assign probability of 0.32 to the occurrence of a SNP named rs1234 in a sample named NA12345. A call belongs to a call set, which contains related calls typically from one sample.",
-   "properties": {
-    "alternateBases": {
-     "type": "array",
-     "description": "The bases that appear instead of the reference bases.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "calls": {
-     "type": "array",
-     "description": "The variant calls for this particular variant. Each one represents the determination of genotype with respect to this variant.",
-     "items": {
-      "$ref": "Call"
-     }
-    },
-    "created": {
-     "type": "string",
-     "description": "The date this variant was created, in milliseconds from the epoch.",
-     "format": "int64"
-    },
-    "end": {
-     "type": "string",
-     "description": "The end position (0-based) of this variant. This corresponds to the first base after the last base in the reference allele. So, the length of the reference allele is (end - start). This is useful for variants that don't explicitly give alternate bases, for example large deletions.",
-     "format": "int64"
-    },
-    "filter": {
-     "type": "array",
-     "description": "A list of filters (normally quality filters) this variant has failed. PASS indicates this variant has passed all filters.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "id": {
-     "type": "string",
-     "description": "The Google generated ID of the variant, immutable."
-    },
-    "info": {
-     "type": "object",
-     "description": "A map of additional variant information.",
-     "additionalProperties": {
-      "type": "array",
-      "description": "A string which maps to an array of values.",
-      "items": {
-       "type": "string"
-      }
-     }
-    },
-    "names": {
-     "type": "array",
-     "description": "Names for the variant, for example a RefSNP ID.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "quality": {
-     "type": "number",
-     "description": "A measure of how likely this variant is to be real. A higher value is better.",
-     "format": "double"
-    },
-    "referenceBases": {
-     "type": "string",
-     "description": "The reference bases for this variant. They start at the given position."
-    },
-    "referenceName": {
-     "type": "string",
-     "description": "The reference on which this variant occurs. (such as chr20 or X)"
-    },
-    "start": {
-     "type": "string",
-     "description": "The position at which this variant occurs (0-based). This corresponds to the first base of the string of reference bases.",
-     "format": "int64"
-    },
-    "variantSetId": {
-     "type": "string",
-     "description": "The ID of the variant set this variant belongs to."
-    }
-   }
-  },
-  "VariantSet": {
-   "id": "VariantSet",
-   "type": "object",
-   "description": "A variant set is a collection of call sets and variants. It contains summary statistics of those contents. A variant set belongs to a dataset.",
-   "properties": {
-    "datasetId": {
-     "type": "string",
-     "description": "The dataset to which this variant set belongs. Immutable."
-    },
-    "id": {
-     "type": "string",
-     "description": "The Google-generated ID of the variant set. Immutable."
-    },
-    "metadata": {
-     "type": "array",
-     "description": "The metadata associated with this variant set.",
-     "items": {
-      "$ref": "Metadata"
-     }
-    },
-    "referenceBounds": {
-     "type": "array",
-     "description": "A list of all references used by the variants in a variant set with associated coordinate upper bounds for each one.",
-     "items": {
-      "$ref": "ReferenceBound"
-     }
-    }
-   }
-  }
- },
- "resources": {
-  "callsets": {
-   "methods": {
-    "create": {
-     "id": "genomics.callsets.create",
-     "path": "callsets",
-     "httpMethod": "POST",
-     "description": "Creates a new call set.",
-     "request": {
-      "$ref": "CallSet"
-     },
-     "response": {
-      "$ref": "CallSet"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "delete": {
-     "id": "genomics.callsets.delete",
-     "path": "callsets/{callSetId}",
-     "httpMethod": "DELETE",
-     "description": "Deletes a call set.",
-     "parameters": {
-      "callSetId": {
-       "type": "string",
-       "description": "The ID of the call set to be deleted.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "callSetId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "get": {
-     "id": "genomics.callsets.get",
-     "path": "callsets/{callSetId}",
-     "httpMethod": "GET",
-     "description": "Gets a call set by ID.",
-     "parameters": {
-      "callSetId": {
-       "type": "string",
-       "description": "The ID of the call set.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "callSetId"
-     ],
-     "response": {
-      "$ref": "CallSet"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "patch": {
-     "id": "genomics.callsets.patch",
-     "path": "callsets/{callSetId}",
-     "httpMethod": "PATCH",
-     "description": "Updates a call set. This method supports patch semantics.",
-     "parameters": {
-      "callSetId": {
-       "type": "string",
-       "description": "The ID of the call set to be updated.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "callSetId"
-     ],
-     "request": {
-      "$ref": "CallSet"
-     },
-     "response": {
-      "$ref": "CallSet"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "search": {
-     "id": "genomics.callsets.search",
-     "path": "callsets/search",
-     "httpMethod": "POST",
-     "description": "Gets a list of call sets matching the criteria.\n\nImplements GlobalAllianceApi.searchCallSets.",
-     "request": {
-      "$ref": "SearchCallSetsRequest"
-     },
-     "response": {
-      "$ref": "SearchCallSetsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "update": {
-     "id": "genomics.callsets.update",
-     "path": "callsets/{callSetId}",
-     "httpMethod": "PUT",
-     "description": "Updates a call set.",
-     "parameters": {
-      "callSetId": {
-       "type": "string",
-       "description": "The ID of the call set to be updated.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "callSetId"
-     ],
-     "request": {
-      "$ref": "CallSet"
-     },
-     "response": {
-      "$ref": "CallSet"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    }
-   }
-  },
-  "datasets": {
-   "methods": {
-    "create": {
-     "id": "genomics.datasets.create",
-     "path": "datasets",
-     "httpMethod": "POST",
-     "description": "Creates a new dataset.",
-     "request": {
-      "$ref": "Dataset"
-     },
-     "response": {
-      "$ref": "Dataset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "delete": {
-     "id": "genomics.datasets.delete",
-     "path": "datasets/{datasetId}",
-     "httpMethod": "DELETE",
-     "description": "Deletes a dataset.",
-     "parameters": {
-      "datasetId": {
-       "type": "string",
-       "description": "The ID of the dataset to be deleted.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "datasetId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "get": {
-     "id": "genomics.datasets.get",
-     "path": "datasets/{datasetId}",
-     "httpMethod": "GET",
-     "description": "Gets a dataset by ID.",
-     "parameters": {
-      "datasetId": {
-       "type": "string",
-       "description": "The ID of the dataset.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "datasetId"
-     ],
-     "response": {
-      "$ref": "Dataset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "list": {
-     "id": "genomics.datasets.list",
-     "path": "datasets",
-     "httpMethod": "GET",
-     "description": "Lists all datasets.",
-     "parameters": {
-      "maxResults": {
-       "type": "string",
-       "description": "The maximum number of results returned by this request.",
-       "default": "50",
-       "format": "uint64",
-       "location": "query"
-      },
-      "pageToken": {
-       "type": "string",
-       "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
-       "location": "query"
-      },
-      "projectId": {
-       "type": "string",
-       "description": "Only return datasets which belong to this Google Developers Console project. Only accepts project numbers. Returns all public projects if no project number is specified.",
-       "format": "int64",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "ListDatasetsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "patch": {
-     "id": "genomics.datasets.patch",
-     "path": "datasets/{datasetId}",
-     "httpMethod": "PATCH",
-     "description": "Updates a dataset. This method supports patch semantics.",
-     "parameters": {
-      "datasetId": {
-       "type": "string",
-       "description": "The ID of the dataset to be updated.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "datasetId"
-     ],
-     "request": {
-      "$ref": "Dataset"
-     },
-     "response": {
-      "$ref": "Dataset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "undelete": {
-     "id": "genomics.datasets.undelete",
-     "path": "datasets/{datasetId}/undelete",
-     "httpMethod": "POST",
-     "description": "Undeletes a dataset by restoring a dataset which was deleted via this API. This operation is only possible for a week after the deletion occurred.",
-     "parameters": {
-      "datasetId": {
-       "type": "string",
-       "description": "The ID of the dataset to be undeleted.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "datasetId"
-     ],
-     "response": {
-      "$ref": "Dataset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "update": {
-     "id": "genomics.datasets.update",
-     "path": "datasets/{datasetId}",
-     "httpMethod": "PUT",
-     "description": "Updates a dataset.",
-     "parameters": {
-      "datasetId": {
-       "type": "string",
-       "description": "The ID of the dataset to be updated.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "datasetId"
-     ],
-     "request": {
-      "$ref": "Dataset"
-     },
-     "response": {
-      "$ref": "Dataset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    }
-   }
-  },
-  "experimental": {
-   "resources": {
-    "jobs": {
-     "methods": {
-      "create": {
-       "id": "genomics.experimental.jobs.create",
-       "path": "experimental/jobs/create",
-       "httpMethod": "POST",
-       "description": "Creates and asynchronously runs an ad-hoc job. This is an experimental call and may be removed or changed at any time.",
-       "request": {
-        "$ref": "ExperimentalCreateJobRequest"
-       },
-       "response": {
-        "$ref": "ExperimentalCreateJobResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/devstorage.read_write",
-        "https://www.googleapis.com/auth/genomics"
-       ]
-      }
-     }
-    }
-   }
-  },
-  "jobs": {
-   "methods": {
-    "cancel": {
-     "id": "genomics.jobs.cancel",
-     "path": "jobs/{jobId}/cancel",
-     "httpMethod": "POST",
-     "description": "Cancels a job by ID. Note that it is possible for partial results to be generated and stored for cancelled jobs.",
-     "parameters": {
-      "jobId": {
-       "type": "string",
-       "description": "Required. The ID of the job.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "jobId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "get": {
-     "id": "genomics.jobs.get",
-     "path": "jobs/{jobId}",
-     "httpMethod": "GET",
-     "description": "Gets a job by ID.",
-     "parameters": {
-      "jobId": {
-       "type": "string",
-       "description": "Required. The ID of the job.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "jobId"
-     ],
-     "response": {
-      "$ref": "Job"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "search": {
-     "id": "genomics.jobs.search",
-     "path": "jobs/search",
-     "httpMethod": "POST",
-     "description": "Gets a list of jobs matching the criteria.",
-     "request": {
-      "$ref": "SearchJobsRequest"
-     },
-     "response": {
-      "$ref": "SearchJobsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    }
-   }
-  },
-  "reads": {
-   "methods": {
-    "search": {
-     "id": "genomics.reads.search",
-     "path": "reads/search",
-     "httpMethod": "POST",
-     "description": "Gets a list of reads for one or more readsets. Reads search operates over a genomic coordinate space of reference sequence & position defined over the reference sequences to which the requested readsets are aligned. If a target positional range is specified, search returns all reads whose alignment to the reference genome overlap the range. A query which specifies only readset IDs yields all reads in those readsets, including unmapped reads. All reads returned (including reads on subsequent pages) are ordered by genomic coordinate (reference sequence & position). Reads with equivalent genomic coordinates are returned in a deterministic order.",
-     "request": {
-      "$ref": "SearchReadsRequest"
-     },
-     "response": {
-      "$ref": "SearchReadsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    }
-   }
-  },
-  "readsets": {
-   "methods": {
-    "delete": {
-     "id": "genomics.readsets.delete",
-     "path": "readsets/{readsetId}",
-     "httpMethod": "DELETE",
-     "description": "Deletes a readset.",
-     "parameters": {
-      "readsetId": {
-       "type": "string",
-       "description": "The ID of the readset to be deleted. The caller must have WRITE permissions to the dataset associated with this readset.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "readsetId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "export": {
-     "id": "genomics.readsets.export",
-     "path": "readsets/export",
-     "httpMethod": "POST",
-     "description": "Exports readsets to a BAM file in Google Cloud Storage. Note that currently there may be some differences between exported BAM files and the original BAM file at the time of import. In particular, comments in the input file header will not be preserved, and some custom tags will be converted to strings.",
-     "request": {
-      "$ref": "ExportReadsetsRequest"
-     },
-     "response": {
-      "$ref": "ExportReadsetsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/devstorage.read_write",
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "get": {
-     "id": "genomics.readsets.get",
-     "path": "readsets/{readsetId}",
-     "httpMethod": "GET",
-     "description": "Gets a readset by ID.",
-     "parameters": {
-      "readsetId": {
-       "type": "string",
-       "description": "The ID of the readset.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "readsetId"
-     ],
-     "response": {
-      "$ref": "Readset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "import": {
-     "id": "genomics.readsets.import",
-     "path": "readsets/import",
-     "httpMethod": "POST",
-     "description": "Creates readsets by asynchronously importing the provided information. Note that currently comments in the input file header are not imported and some custom tags will be converted to strings, rather than preserving tag types. The caller must have WRITE permissions to the dataset.",
-     "request": {
-      "$ref": "ImportReadsetsRequest"
-     },
-     "response": {
-      "$ref": "ImportReadsetsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/devstorage.read_write",
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "patch": {
-     "id": "genomics.readsets.patch",
-     "path": "readsets/{readsetId}",
-     "httpMethod": "PATCH",
-     "description": "Updates a readset. This method supports patch semantics.",
-     "parameters": {
-      "readsetId": {
-       "type": "string",
-       "description": "The ID of the readset to be updated. The caller must have WRITE permissions to the dataset associated with this readset.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "readsetId"
-     ],
-     "request": {
-      "$ref": "Readset"
-     },
-     "response": {
-      "$ref": "Readset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "search": {
-     "id": "genomics.readsets.search",
-     "path": "readsets/search",
-     "httpMethod": "POST",
-     "description": "Gets a list of readsets matching the criteria.",
-     "request": {
-      "$ref": "SearchReadsetsRequest"
-     },
-     "response": {
-      "$ref": "SearchReadsetsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "update": {
-     "id": "genomics.readsets.update",
-     "path": "readsets/{readsetId}",
-     "httpMethod": "PUT",
-     "description": "Updates a readset.",
-     "parameters": {
-      "readsetId": {
-       "type": "string",
-       "description": "The ID of the readset to be updated. The caller must have WRITE permissions to the dataset associated with this readset.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "readsetId"
-     ],
-     "request": {
-      "$ref": "Readset"
-     },
-     "response": {
-      "$ref": "Readset"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    }
-   },
-   "resources": {
-    "coveragebuckets": {
-     "methods": {
-      "list": {
-       "id": "genomics.readsets.coveragebuckets.list",
-       "path": "readsets/{readsetId}/coveragebuckets",
-       "httpMethod": "GET",
-       "description": "Lists fixed width coverage buckets for a readset, each of which correspond to a range of a reference sequence. Each bucket summarizes coverage information across its corresponding genomic range. Coverage is defined as the number of reads which are aligned to a given base in the reference sequence. Coverage buckets are available at various bucket widths, enabling various coverage \"zoom levels\". The caller must have READ permissions for the target readset.",
-       "parameters": {
-        "maxResults": {
-         "type": "string",
-         "description": "The maximum number of results to return in a single page. If unspecified, defaults to 1024. The maximum value is 2048.",
-         "default": "1024",
-         "format": "uint64",
-         "location": "query"
-        },
-        "pageToken": {
-         "type": "string",
-         "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
-         "location": "query"
-        },
-        "range.sequenceEnd": {
-         "type": "string",
-         "description": "The end position of the range on the reference, 1-based exclusive. If specified, sequenceName must also be specified.",
-         "format": "uint64",
-         "location": "query"
-        },
-        "range.sequenceName": {
-         "type": "string",
-         "description": "The reference sequence name, for example chr1, 1, or chrX.",
-         "location": "query"
-        },
-        "range.sequenceStart": {
-         "type": "string",
-         "description": "The start position of the range on the reference, 1-based inclusive. If specified, sequenceName must also be specified.",
-         "format": "uint64",
-         "location": "query"
-        },
-        "readsetId": {
-         "type": "string",
-         "description": "Required. The ID of the readset over which coverage is requested.",
-         "required": true,
-         "location": "path"
-        },
-        "targetBucketWidth": {
-         "type": "string",
-         "description": "The desired width of each reported coverage bucket in base pairs. This will be rounded down to the nearest precomputed bucket width; the value of which is returned as bucketWidth in the response. Defaults to infinity (each bucket spans an entire reference sequence) or the length of the target range, if specified. The smallest precomputed bucketWidth is currently 2048 base pairs; this is subject to change.",
-         "format": "uint64",
-         "location": "query"
-        }
-       },
-       "parameterOrder": [
-        "readsetId"
-       ],
-       "response": {
-        "$ref": "ListCoverageBucketsResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/genomics",
-        "https://www.googleapis.com/auth/genomics.readonly"
-       ]
-      }
-     }
-    }
-   }
-  },
-  "variants": {
-   "methods": {
-    "create": {
-     "id": "genomics.variants.create",
-     "path": "variants",
-     "httpMethod": "POST",
-     "description": "Creates a new variant.",
-     "request": {
-      "$ref": "Variant"
-     },
-     "response": {
-      "$ref": "Variant"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "delete": {
-     "id": "genomics.variants.delete",
-     "path": "variants/{variantId}",
-     "httpMethod": "DELETE",
-     "description": "Deletes a variant.",
-     "parameters": {
-      "variantId": {
-       "type": "string",
-       "description": "The ID of the variant to be deleted.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "export": {
-     "id": "genomics.variants.export",
-     "path": "variants/export",
-     "httpMethod": "POST",
-     "description": "Exports variant data to an external destination.",
-     "request": {
-      "$ref": "ExportVariantsRequest"
-     },
-     "response": {
-      "$ref": "ExportVariantsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/bigquery",
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "get": {
-     "id": "genomics.variants.get",
-     "path": "variants/{variantId}",
-     "httpMethod": "GET",
-     "description": "Gets a variant by ID.",
-     "parameters": {
-      "variantId": {
-       "type": "string",
-       "description": "The ID of the variant.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantId"
-     ],
-     "response": {
-      "$ref": "Variant"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "import": {
-     "id": "genomics.variants.import",
-     "path": "variants/import",
-     "httpMethod": "POST",
-     "description": "Creates variant data by asynchronously importing the provided information. The variants for import will be merged with any existing data and each other according to the behavior of mergeVariants. In particular, this means for merged VCF variants that have conflicting INFO fields, some data will be arbitrarily discarded. As a special case, for single-sample VCF files, QUAL and FILTER fields will be moved to the call level; these are sometimes interpreted in a call-specific context. Imported VCF headers are appended to the metadata already in a variant set.",
-     "request": {
-      "$ref": "ImportVariantsRequest"
-     },
-     "response": {
-      "$ref": "ImportVariantsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/devstorage.read_write",
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "search": {
-     "id": "genomics.variants.search",
-     "path": "variants/search",
-     "httpMethod": "POST",
-     "description": "Gets a list of variants matching the criteria.\n\nImplements GlobalAllianceApi.searchVariants.",
-     "request": {
-      "$ref": "SearchVariantsRequest"
-     },
-     "response": {
-      "$ref": "SearchVariantsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "update": {
-     "id": "genomics.variants.update",
-     "path": "variants/{variantId}",
-     "httpMethod": "PUT",
-     "description": "Updates a variant's names and info fields. All other modifications are silently ignored. Returns the modified variant without its calls.",
-     "parameters": {
-      "variantId": {
-       "type": "string",
-       "description": "The ID of the variant to be updated.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantId"
-     ],
-     "request": {
-      "$ref": "Variant"
-     },
-     "response": {
-      "$ref": "Variant"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    }
-   }
-  },
-  "variantsets": {
-   "methods": {
-    "delete": {
-     "id": "genomics.variantsets.delete",
-     "path": "variantsets/{variantSetId}",
-     "httpMethod": "DELETE",
-     "description": "Deletes the contents of a variant set. The variant set object is not deleted.",
-     "parameters": {
-      "variantSetId": {
-       "type": "string",
-       "description": "The ID of the variant set to be deleted.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantSetId"
-     ],
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "get": {
-     "id": "genomics.variantsets.get",
-     "path": "variantsets/{variantSetId}",
-     "httpMethod": "GET",
-     "description": "Gets a variant set by ID.",
-     "parameters": {
-      "variantSetId": {
-       "type": "string",
-       "description": "Required. The ID of the variant set.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantSetId"
-     ],
-     "response": {
-      "$ref": "VariantSet"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "mergeVariants": {
-     "id": "genomics.variantsets.mergeVariants",
-     "path": "variantsets/{variantSetId}/mergeVariants",
-     "httpMethod": "POST",
-     "description": "Merges the given variants with existing variants. Each variant will be merged with an existing variant that matches its reference sequence, start, end, reference bases, and alternative bases. If no such variant exists, a new one will be created.\n\nWhen variants are merged, the call information from the new variant is added to the existing variant, and other fields (such as key/value pairs) are discarded.",
-     "parameters": {
-      "variantSetId": {
-       "type": "string",
-       "description": "The destination variant set.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantSetId"
-     ],
-     "request": {
-      "$ref": "MergeVariantsRequest"
-     }
-    },
-    "patch": {
-     "id": "genomics.variantsets.patch",
-     "path": "variantsets/{variantSetId}",
-     "httpMethod": "PATCH",
-     "description": "Updates a variant set's metadata. All other modifications are silently ignored. This method supports patch semantics.",
-     "parameters": {
-      "variantSetId": {
-       "type": "string",
-       "description": "The ID of the variant to be updated.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantSetId"
-     ],
-     "request": {
-      "$ref": "VariantSet"
-     },
-     "response": {
-      "$ref": "VariantSet"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    },
-    "search": {
-     "id": "genomics.variantsets.search",
-     "path": "variantsets/search",
-     "httpMethod": "POST",
-     "description": "Returns a list of all variant sets matching search criteria.\n\nImplements GlobalAllianceApi.searchVariantSets.",
-     "request": {
-      "$ref": "SearchVariantSetsRequest"
-     },
-     "response": {
-      "$ref": "SearchVariantSetsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics",
-      "https://www.googleapis.com/auth/genomics.readonly"
-     ]
-    },
-    "update": {
-     "id": "genomics.variantsets.update",
-     "path": "variantsets/{variantSetId}",
-     "httpMethod": "PUT",
-     "description": "Updates a variant set's metadata. All other modifications are silently ignored.",
-     "parameters": {
-      "variantSetId": {
-       "type": "string",
-       "description": "The ID of the variant to be updated.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "variantSetId"
-     ],
-     "request": {
-      "$ref": "VariantSet"
-     },
-     "response": {
-      "$ref": "VariantSet"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/genomics"
-     ]
-    }
-   }
-  }
- }
-}
diff --git a/genomics/v1beta/genomics-gen.go b/genomics/v1beta/genomics-gen.go
deleted file mode 100644
index 590e990..0000000
--- a/genomics/v1beta/genomics-gen.go
+++ /dev/null
@@ -1,4203 +0,0 @@
-// Package genomics provides access to the Genomics API.
-//
-// See https://developers.google.com/genomics/v1beta/reference
-//
-// Usage example:
-//
-//   import "google.golang.org/api/genomics/v1beta"
-//   ...
-//   genomicsService, err := genomics.New(oauthHttpClient)
-package genomics
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-	"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
-var _ = context.Background
-
-const apiId = "genomics:v1beta"
-const apiName = "genomics"
-const apiVersion = "v1beta"
-const basePath = "https://www.googleapis.com/genomics/v1beta/"
-
-// OAuth2 scopes used by this API.
-const (
-	// View and manage your data in Google BigQuery
-	BigqueryScope = "https://www.googleapis.com/auth/bigquery"
-
-	// Manage your data in Google Cloud Storage
-	DevstorageRead_writeScope = "https://www.googleapis.com/auth/devstorage.read_write"
-
-	// View and manage Genomics data
-	GenomicsScope = "https://www.googleapis.com/auth/genomics"
-
-	// View Genomics data
-	GenomicsReadonlyScope = "https://www.googleapis.com/auth/genomics.readonly"
-)
-
-func New(client *http.Client) (*Service, error) {
-	if client == nil {
-		return nil, errors.New("client is nil")
-	}
-	s := &Service{client: client, BasePath: basePath}
-	s.Callsets = NewCallsetsService(s)
-	s.Datasets = NewDatasetsService(s)
-	s.Experimental = NewExperimentalService(s)
-	s.Jobs = NewJobsService(s)
-	s.Reads = NewReadsService(s)
-	s.Readsets = NewReadsetsService(s)
-	s.Variants = NewVariantsService(s)
-	s.Variantsets = NewVariantsetsService(s)
-	return s, nil
-}
-
-type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
-
-	Callsets *CallsetsService
-
-	Datasets *DatasetsService
-
-	Experimental *ExperimentalService
-
-	Jobs *JobsService
-
-	Reads *ReadsService
-
-	Readsets *ReadsetsService
-
-	Variants *VariantsService
-
-	Variantsets *VariantsetsService
-}
-
-func NewCallsetsService(s *Service) *CallsetsService {
-	rs := &CallsetsService{s: s}
-	return rs
-}
-
-type CallsetsService struct {
-	s *Service
-}
-
-func NewDatasetsService(s *Service) *DatasetsService {
-	rs := &DatasetsService{s: s}
-	return rs
-}
-
-type DatasetsService struct {
-	s *Service
-}
-
-func NewExperimentalService(s *Service) *ExperimentalService {
-	rs := &ExperimentalService{s: s}
-	rs.Jobs = NewExperimentalJobsService(s)
-	return rs
-}
-
-type ExperimentalService struct {
-	s *Service
-
-	Jobs *ExperimentalJobsService
-}
-
-func NewExperimentalJobsService(s *Service) *ExperimentalJobsService {
-	rs := &ExperimentalJobsService{s: s}
-	return rs
-}
-
-type ExperimentalJobsService struct {
-	s *Service
-}
-
-func NewJobsService(s *Service) *JobsService {
-	rs := &JobsService{s: s}
-	return rs
-}
-
-type JobsService struct {
-	s *Service
-}
-
-func NewReadsService(s *Service) *ReadsService {
-	rs := &ReadsService{s: s}
-	return rs
-}
-
-type ReadsService struct {
-	s *Service
-}
-
-func NewReadsetsService(s *Service) *ReadsetsService {
-	rs := &ReadsetsService{s: s}
-	rs.Coveragebuckets = NewReadsetsCoveragebucketsService(s)
-	return rs
-}
-
-type ReadsetsService struct {
-	s *Service
-
-	Coveragebuckets *ReadsetsCoveragebucketsService
-}
-
-func NewReadsetsCoveragebucketsService(s *Service) *ReadsetsCoveragebucketsService {
-	rs := &ReadsetsCoveragebucketsService{s: s}
-	return rs
-}
-
-type ReadsetsCoveragebucketsService struct {
-	s *Service
-}
-
-func NewVariantsService(s *Service) *VariantsService {
-	rs := &VariantsService{s: s}
-	return rs
-}
-
-type VariantsService struct {
-	s *Service
-}
-
-func NewVariantsetsService(s *Service) *VariantsetsService {
-	rs := &VariantsetsService{s: s}
-	return rs
-}
-
-type VariantsetsService struct {
-	s *Service
-}
-
-type Call struct {
-	// CallSetId: The ID of the call set this variant call belongs to.
-	CallSetId string `json:"callSetId,omitempty"`
-
-	// CallSetName: The name of the call set this variant call belongs to.
-	CallSetName string `json:"callSetName,omitempty"`
-
-	// Genotype: The genotype of this variant call. Each value represents
-	// either the value of the referenceBases field or a 1-based index into
-	// alternateBases. If a variant had a referenceBases value of T and an
-	// alternateBases value of ["A", "C"], and the genotype was [2, 1], that
-	// would mean the call represented the heterozygous value CA for this
-	// variant. If the genotype was instead [0, 1], the represented value
-	// would be TA. Ordering of the genotype values is important if the
-	// phaseset is present. If a genotype is not called (that is, a . is
-	// present in the GT string) -1 is returned.
-	Genotype []int64 `json:"genotype,omitempty"`
-
-	// GenotypeLikelihood: The genotype likelihoods for this variant call.
-	// Each array entry represents how likely a specific genotype is for
-	// this call. The value ordering is defined by the GL tag in the VCF
-	// spec. If Phred-scaled genotype likelihood scores (PL) are available
-	// and log10(P) genotype likelihood scores (GL) are not, PL scores are
-	// converted to GL scores. If both are available, PL scores are stored
-	// in info.
-	GenotypeLikelihood []float64 `json:"genotypeLikelihood,omitempty"`
-
-	// Info: A map of additional variant call information.
-	Info map[string][]string `json:"info,omitempty"`
-
-	// Phaseset: If this field is present, this variant call's genotype
-	// ordering implies the phase of the bases and is consistent with any
-	// other variant calls in the same reference sequence which have the
-	// same phaseset value. When importing data from VCF, if the genotype
-	// data was phased but no phase set was specified this field will be set
-	// to *.
-	Phaseset string `json:"phaseset,omitempty"`
-}
-
-type CallSet struct {
-	// Created: The date this call set was created in milliseconds from the
-	// epoch.
-	Created int64 `json:"created,omitempty,string"`
-
-	// Id: The Google generated ID of the call set, immutable.
-	Id string `json:"id,omitempty"`
-
-	// Info: A map of additional call set information.
-	Info map[string][]string `json:"info,omitempty"`
-
-	// Name: The call set name.
-	Name string `json:"name,omitempty"`
-
-	// SampleId: The sample ID this call set corresponds to.
-	SampleId string `json:"sampleId,omitempty"`
-
-	// VariantSetIds: The IDs of the variant sets this call set belongs to.
-	VariantSetIds []string `json:"variantSetIds,omitempty"`
-}
-
-type CoverageBucket struct {
-	// MeanCoverage: The average number of reads which are aligned to each
-	// individual reference base in this bucket.
-	MeanCoverage float64 `json:"meanCoverage,omitempty"`
-
-	// Range: The genomic coordinate range spanned by this bucket.
-	Range *GenomicRange `json:"range,omitempty"`
-}
-
-type Dataset struct {
-	// Id: The Google generated ID of the dataset, immutable.
-	Id string `json:"id,omitempty"`
-
-	// IsPublic: Flag indicating whether or not a dataset is publicly
-	// viewable. If a dataset is not public, it inherits viewing permissions
-	// from its project.
-	IsPublic bool `json:"isPublic,omitempty"`
-
-	// Name: The dataset name.
-	Name string `json:"name,omitempty"`
-
-	// ProjectId: The Google Developers Console project number that this
-	// dataset belongs to.
-	ProjectId int64 `json:"projectId,omitempty,string"`
-}
-
-type ExperimentalCreateJobRequest struct {
-	// Align: Specifies whether or not to run the alignment pipeline. Either
-	// align or callVariants must be set.
-	Align bool `json:"align,omitempty"`
-
-	// CallVariants: Specifies whether or not to run the variant calling
-	// pipeline. Either align or callVariants must be set.
-	CallVariants bool `json:"callVariants,omitempty"`
-
-	// GcsOutputPath: Specifies where to copy the results of certain
-	// pipelines. This should be in the form of gs://bucket/path.
-	GcsOutputPath string `json:"gcsOutputPath,omitempty"`
-
-	// PairedSourceUris: A list of Google Cloud Storage URIs of paired end
-	// .fastq files to operate upon. If specified, this represents the
-	// second file of each paired .fastq file. The first file of each pair
-	// should be specified in sourceUris.
-	PairedSourceUris []string `json:"pairedSourceUris,omitempty"`
-
-	// ProjectId: Required. The Google Cloud Project ID with which to
-	// associate the request.
-	ProjectId int64 `json:"projectId,omitempty,string"`
-
-	// SourceUris: A list of Google Cloud Storage URIs of data files to
-	// operate upon. These can be .bam, interleaved .fastq, or paired
-	// .fastq. If specifying paired .fastq files, the first of each pair of
-	// files should be listed here, and the second of each pair should be
-	// listed in pairedSourceUris.
-	SourceUris []string `json:"sourceUris,omitempty"`
-}
-
-type ExperimentalCreateJobResponse struct {
-	// JobId: A job ID that can be used to get status information.
-	JobId string `json:"jobId,omitempty"`
-}
-
-type ExportReadsetsRequest struct {
-	// ExportUri: A Google Cloud Storage URI where the exported BAM file
-	// will be created. The currently authenticated user must have write
-	// access to the new file location. An error will be returned if the URI
-	// already contains data.
-	ExportUri string `json:"exportUri,omitempty"`
-
-	// ProjectId: The Google Developers Console project number that owns
-	// this export.
-	ProjectId int64 `json:"projectId,omitempty,string"`
-
-	// ReadsetIds: The IDs of the readsets to export.
-	ReadsetIds []string `json:"readsetIds,omitempty"`
-
-	// ReferenceNames: The reference names to export. If this is not
-	// specified, all reference sequences, including unmapped reads, are
-	// exported. Use * to export only unmapped reads.
-	ReferenceNames []string `json:"referenceNames,omitempty"`
-}
-
-type ExportReadsetsResponse struct {
-	// JobId: A job ID that can be used to get status information.
-	JobId string `json:"jobId,omitempty"`
-}
-
-type ExportVariantsRequest struct {
-	// BigqueryDataset: The BigQuery dataset to export data to. Note that
-	// this is distinct from the Genomics concept of "dataset".
-	BigqueryDataset string `json:"bigqueryDataset,omitempty"`
-
-	// BigqueryTable: The BigQuery table to export data to. If the table
-	// doesn't exist, it will be created. If it already exists, it will be
-	// overwritten.
-	BigqueryTable string `json:"bigqueryTable,omitempty"`
-
-	// CallSetIds: If provided, only variant call information from the
-	// specified call sets will be exported. By default all variant calls
-	// are exported.
-	CallSetIds []string `json:"callSetIds,omitempty"`
-
-	// Format: The format for the exported data.
-	Format string `json:"format,omitempty"`
-
-	// ProjectId: The Google Cloud project number that owns the destination
-	// BigQuery dataset. The caller must have WRITE access to this project.
-	// This project will also own the resulting export job.
-	ProjectId int64 `json:"projectId,omitempty,string"`
-
-	// VariantSetId: Required. The ID of the variant set that contains
-	// variant data which should be exported. The caller must have READ
-	// access to this variant set.
-	VariantSetId string `json:"variantSetId,omitempty"`
-}
-
-type ExportVariantsResponse struct {
-	// JobId: A job ID that can be used to get status information.
-	JobId string `json:"jobId,omitempty"`
-}
-
-type GenomicRange struct {
-	// SequenceEnd: The end position of the range on the reference, 1-based
-	// exclusive. If specified, sequenceName must also be specified.
-	SequenceEnd uint64 `json:"sequenceEnd,omitempty,string"`
-
-	// SequenceName: The reference sequence name, for example chr1, 1, or
-	// chrX.
-	SequenceName string `json:"sequenceName,omitempty"`
-
-	// SequenceStart: The start position of the range on the reference,
-	// 1-based inclusive. If specified, sequenceName must also be specified.
-	SequenceStart uint64 `json:"sequenceStart,omitempty,string"`
-}
-
-type Header struct {
-	// SortingOrder: (SO) Sorting order of alignments.
-	SortingOrder string `json:"sortingOrder,omitempty"`
-
-	// Version: (VN) BAM format version.
-	Version string `json:"version,omitempty"`
-}
-
-type HeaderSection struct {
-	// Comments: (@CO) One-line text comments.
-	Comments []string `json:"comments,omitempty"`
-
-	// FileUri: [Deprecated] This field is deprecated and will no longer be
-	// populated. Please use filename instead.
-	FileUri string `json:"fileUri,omitempty"`
-
-	// Filename: The name of the file from which this data was imported.
-	Filename string `json:"filename,omitempty"`
-
-	// Headers: (@HD) The header line.
-	Headers []*Header `json:"headers,omitempty"`
-
-	// Programs: (@PG) Programs.
-	Programs []*Program `json:"programs,omitempty"`
-
-	// ReadGroups: (@RG) Read group.
-	ReadGroups []*ReadGroup `json:"readGroups,omitempty"`
-
-	// RefSequences: (@SQ) Reference sequence dictionary.
-	RefSequences []*ReferenceSequence `json:"refSequences,omitempty"`
-}
-
-type ImportReadsetsRequest struct {
-	// DatasetId: Required. The ID of the dataset these readsets will belong
-	// to. The caller must have WRITE permissions to this dataset.
-	DatasetId string `json:"datasetId,omitempty"`
-
-	// SourceUris: A list of URIs pointing at BAM files in Google Cloud
-	// Storage.
-	SourceUris []string `json:"sourceUris,omitempty"`
-}
-
-type ImportReadsetsResponse struct {
-	// JobId: A job ID that can be used to get status information.
-	JobId string `json:"jobId,omitempty"`
-}
-
-type ImportVariantsRequest struct {
-	// Format: The format of the variant data being imported.
-	Format string `json:"format,omitempty"`
-
-	// SourceUris: A list of URIs pointing at VCF files in Google Cloud
-	// Storage. See the VCF Specification for more details on the input
-	// format.
-	SourceUris []string `json:"sourceUris,omitempty"`
-
-	// VariantSetId: Required. The variant set to which variant data should
-	// be imported.
-	VariantSetId string `json:"variantSetId,omitempty"`
-}
-
-type ImportVariantsResponse struct {
-	// JobId: A job ID that can be used to get status information.
-	JobId string `json:"jobId,omitempty"`
-}
-
-type Job struct {
-	// Created: The date this job was created, in milliseconds from the
-	// epoch.
-	Created int64 `json:"created,omitempty,string"`
-
-	// Description: A more detailed description of this job's current
-	// status.
-	Description string `json:"description,omitempty"`
-
-	// Errors: Any errors that occurred during processing.
-	Errors []string `json:"errors,omitempty"`
-
-	// Id: The job ID.
-	Id string `json:"id,omitempty"`
-
-	// ImportedIds: If this Job represents an import, this field will
-	// contain the IDs of the objects that were successfully imported.
-	ImportedIds []string `json:"importedIds,omitempty"`
-
-	// ProjectId: The Google Developers Console project number to which this
-	// job belongs.
-	ProjectId int64 `json:"projectId,omitempty,string"`
-
-	// Request: A summarized representation of the original service request.
-	Request *JobRequest `json:"request,omitempty"`
-
-	// Status: The status of this job.
-	Status string `json:"status,omitempty"`
-
-	// Warnings: Any warnings that occurred during processing.
-	Warnings []string `json:"warnings,omitempty"`
-}
-
-type JobRequest struct {
-	// Destination: The data destination of the request, for example, a
-	// Google BigQuery Table or Dataset ID.
-	Destination []string `json:"destination,omitempty"`
-
-	// Source: The data source of the request, for example, a Google Cloud
-	// Storage object path or Readset ID.
-	Source []string `json:"source,omitempty"`
-
-	// Type: The original request type.
-	Type string `json:"type,omitempty"`
-}
-
-type ListCoverageBucketsResponse struct {
-	// BucketWidth: The length of each coverage bucket in base pairs. Note
-	// that buckets at the end of a reference sequence may be shorter. This
-	// value is omitted if the bucket width is infinity (the default
-	// behaviour, with no range or targetBucketWidth).
-	BucketWidth uint64 `json:"bucketWidth,omitempty,string"`
-
-	// CoverageBuckets: The coverage buckets. The list of buckets is sparse;
-	// a bucket with 0 overlapping reads is not returned. A bucket never
-	// crosses more than one reference sequence. Each bucket has width
-	// bucketWidth, unless its end is the end of the reference sequence.
-	CoverageBuckets []*CoverageBucket `json:"coverageBuckets,omitempty"`
-
-	// NextPageToken: The continuation token, which is used to page through
-	// large result sets. Provide this value in a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// aren't any additional results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-}
-
-type ListDatasetsResponse struct {
-	// Datasets: The list of matching Datasets.
-	Datasets []*Dataset `json:"datasets,omitempty"`
-
-	// NextPageToken: The continuation token, which is used to page through
-	// large result sets. Provide this value in a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// aren't any additional results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-}
-
-type MergeVariantsRequest struct {
-	// Variants: The variants to be merged with existing variants.
-	Variants []*Variant `json:"variants,omitempty"`
-}
-
-type Metadata struct {
-	// Description: A textual description of this metadata.
-	Description string `json:"description,omitempty"`
-
-	// Id: User-provided ID field, not enforced by this API. Two or more
-	// pieces of structured metadata with identical id and key fields are
-	// considered equivalent.
-	Id string `json:"id,omitempty"`
-
-	// Info: Remaining structured metadata key-value pairs.
-	Info map[string][]string `json:"info,omitempty"`
-
-	// Key: The top-level key.
-	Key string `json:"key,omitempty"`
-
-	// Number: The number of values that can be included in a field
-	// described by this metadata.
-	Number string `json:"number,omitempty"`
-
-	// Type: The type of data. Possible types include: Integer, Float, Flag,
-	// Character, and String.
-	Type string `json:"type,omitempty"`
-
-	// Value: The value field for simple metadata
-	Value string `json:"value,omitempty"`
-}
-
-type Program struct {
-	// CommandLine: (CL) Command line.
-	CommandLine string `json:"commandLine,omitempty"`
-
-	// Id: (ID) Program record identifier.
-	Id string `json:"id,omitempty"`
-
-	// Name: (PN) Program name.
-	Name string `json:"name,omitempty"`
-
-	// PrevProgramId: (PP) Previous program ID.
-	PrevProgramId string `json:"prevProgramId,omitempty"`
-
-	// Version: (VN) Program version.
-	Version string `json:"version,omitempty"`
-}
-
-type Read struct {
-	// AlignedBases: The originalBases after the cigar field has been
-	// applied. Deletions are represented with '-' and insertions are
-	// omitted.
-	AlignedBases string `json:"alignedBases,omitempty"`
-
-	// BaseQuality: Represents the quality of each base in this read. Each
-	// character represents one base. To get the quality, take the ASCII
-	// value of the character and subtract 33. (QUAL)
-	BaseQuality string `json:"baseQuality,omitempty"`
-
-	// Cigar: A condensed representation of how this read matches up to the
-	// reference. (CIGAR)
-	Cigar string `json:"cigar,omitempty"`
-
-	// Flags: Each bit of this number has a different meaning if enabled.
-	// See the full BAM spec for more details. (FLAG)
-	Flags int64 `json:"flags,omitempty"`
-
-	// Id: The Google generated ID of the read, immutable.
-	Id string `json:"id,omitempty"`
-
-	// MappingQuality: A score up to 255 that represents how likely this
-	// read's aligned position is to be correct. A higher value is better.
-	// (MAPQ)
-	MappingQuality int64 `json:"mappingQuality,omitempty"`
-
-	// MatePosition: The 1-based start position of the paired read. (PNEXT)
-	MatePosition int64 `json:"matePosition,omitempty"`
-
-	// MateReferenceSequenceName: The name of the sequence that the paired
-	// read is aligned to. This is usually the same as
-	// referenceSequenceName. (RNEXT)
-	MateReferenceSequenceName string `json:"mateReferenceSequenceName,omitempty"`
-
-	// Name: The name of the read. When imported from a BAM file, this is
-	// the query template name. (QNAME)
-	Name string `json:"name,omitempty"`
-
-	// OriginalBases: The list of bases that this read represents (such as
-	// "CATCGA"). (SEQ)
-	OriginalBases string `json:"originalBases,omitempty"`
-
-	// Position: The 1-based start position of the aligned read. If the
-	// first base starts at the very beginning of the reference sequence,
-	// then the position would be '1'. (POS)
-	Position int64 `json:"position,omitempty"`
-
-	// ReadsetId: The ID of the readset this read belongs to.
-	ReadsetId string `json:"readsetId,omitempty"`
-
-	// ReferenceSequenceName: The name of the sequence that this read is
-	// aligned to. This would be, for example, 'X' for the X Chromosome or
-	// '20' for Chromosome 20. (RNAME)
-	ReferenceSequenceName string `json:"referenceSequenceName,omitempty"`
-
-	// Tags: A map of additional read information. (TAG)
-	Tags map[string][]string `json:"tags,omitempty"`
-
-	// TemplateLength: Length of the original piece of DNA that produced
-	// both this read and the paired read. (TLEN)
-	TemplateLength int64 `json:"templateLength,omitempty"`
-}
-
-type ReadGroup struct {
-	// Date: (DT) Date the run was produced (ISO8601 date or date/time).
-	Date string `json:"date,omitempty"`
-
-	// Description: (DS) Description.
-	Description string `json:"description,omitempty"`
-
-	// FlowOrder: (FO) Flow order. The array of nucleotide bases that
-	// correspond to the nucleotides used for each flow of each read.
-	FlowOrder string `json:"flowOrder,omitempty"`
-
-	// Id: (ID) Read group identifier.
-	Id string `json:"id,omitempty"`
-
-	// KeySequence: (KS) The array of nucleotide bases that correspond to
-	// the key sequence of each read.
-	KeySequence string `json:"keySequence,omitempty"`
-
-	// Library: (LS) Library.
-	Library string `json:"library,omitempty"`
-
-	// PlatformUnit: (PU) Platform unit.
-	PlatformUnit string `json:"platformUnit,omitempty"`
-
-	// PredictedInsertSize: (PI) Predicted median insert size.
-	PredictedInsertSize int64 `json:"predictedInsertSize,omitempty"`
-
-	// ProcessingProgram: (PG) Programs used for processing the read group.
-	ProcessingProgram string `json:"processingProgram,omitempty"`
-
-	// Sample: (SM) Sample.
-	Sample string `json:"sample,omitempty"`
-
-	// SequencingCenterName: (CN) Name of sequencing center producing the
-	// read.
-	SequencingCenterName string `json:"sequencingCenterName,omitempty"`
-
-	// SequencingTechnology: (PL) Platform/technology used to produce the
-	// reads.
-	SequencingTechnology string `json:"sequencingTechnology,omitempty"`
-}
-
-type Readset struct {
-	// DatasetId: The ID of the dataset this readset belongs to.
-	DatasetId string `json:"datasetId,omitempty"`
-
-	// FileData: File information from the original BAM import. See the BAM
-	// format specification for additional information on each field.
-	FileData []*HeaderSection `json:"fileData,omitempty"`
-
-	// Id: The Google generated ID of the readset, immutable.
-	Id string `json:"id,omitempty"`
-
-	// Name: The readset name, typically this is the sample name.
-	Name string `json:"name,omitempty"`
-}
-
-type ReferenceBound struct {
-	// ReferenceName: The reference the bound is associate with.
-	ReferenceName string `json:"referenceName,omitempty"`
-
-	// UpperBound: An upper bound (inclusive) on the starting coordinate of
-	// any variant in the reference sequence.
-	UpperBound int64 `json:"upperBound,omitempty,string"`
-}
-
-type ReferenceSequence struct {
-	// AssemblyId: (AS) Genome assembly identifier.
-	AssemblyId string `json:"assemblyId,omitempty"`
-
-	// Length: (LN) Reference sequence length.
-	Length int64 `json:"length,omitempty"`
-
-	// Md5Checksum: (M5) MD5 checksum of the sequence in the uppercase,
-	// excluding spaces but including pads as *.
-	Md5Checksum string `json:"md5Checksum,omitempty"`
-
-	// Name: (SN) Reference sequence name.
-	Name string `json:"name,omitempty"`
-
-	// Species: (SP) Species.
-	Species string `json:"species,omitempty"`
-
-	// Uri: (UR) URI of the sequence.
-	Uri string `json:"uri,omitempty"`
-}
-
-type SearchCallSetsRequest struct {
-	// Name: Only return call sets for which a substring of the name matches
-	// this string.
-	Name string `json:"name,omitempty"`
-
-	// PageSize: The maximum number of call sets to return.
-	PageSize int64 `json:"pageSize,omitempty"`
-
-	// PageToken: The continuation token, which is used to page through
-	// large result sets. To get the next page of results, set this
-	// parameter to the value of nextPageToken from the previous response.
-	PageToken string `json:"pageToken,omitempty"`
-
-	// VariantSetIds: Restrict the query to call sets within the given
-	// variant sets. At least one ID must be provided.
-	VariantSetIds []string `json:"variantSetIds,omitempty"`
-}
-
-type SearchCallSetsResponse struct {
-	// CallSets: The list of matching call sets.
-	CallSets []*CallSet `json:"callSets,omitempty"`
-
-	// NextPageToken: The continuation token, which is used to page through
-	// large result sets. Provide this value in a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// aren't any additional results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-}
-
-type SearchJobsRequest struct {
-	// CreatedAfter: If specified, only jobs created on or after this date,
-	// given in milliseconds since Unix epoch, will be returned.
-	CreatedAfter int64 `json:"createdAfter,omitempty,string"`
-
-	// CreatedBefore: If specified, only jobs created prior to this date,
-	// given in milliseconds since Unix epoch, will be returned.
-	CreatedBefore int64 `json:"createdBefore,omitempty,string"`
-
-	// MaxResults: Specifies the number of results to return in a single
-	// page. Defaults to 128. The maximum value is 256.
-	MaxResults uint64 `json:"maxResults,omitempty,string"`
-
-	// PageToken: The continuation token which is used to page through large
-	// result sets. To get the next page of results, set this parameter to
-	// the value of the nextPageToken from the previous response.
-	PageToken string `json:"pageToken,omitempty"`
-
-	// ProjectId: Required. Only return jobs which belong to this Google
-	// Developers Console project.
-	ProjectId int64 `json:"projectId,omitempty,string"`
-
-	// Status: Only return jobs which have a matching status.
-	Status []string `json:"status,omitempty"`
-}
-
-type SearchJobsResponse struct {
-	// Jobs: The list of jobs results, ordered newest to oldest.
-	Jobs []*Job `json:"jobs,omitempty"`
-
-	// NextPageToken: The continuation token which is used to page through
-	// large result sets. Provide this value is a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// are no more results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-}
-
-type SearchReadsRequest struct {
-	// MaxResults: Specifies number of results to return in a single page.
-	// If unspecified, it will default to 256. The maximum value is 2048.
-	MaxResults uint64 `json:"maxResults,omitempty,string"`
-
-	// PageToken: The continuation token, which is used to page through
-	// large result sets. To get the next page of results, set this
-	// parameter to the value of nextPageToken from the previous response.
-	PageToken string `json:"pageToken,omitempty"`
-
-	// ReadsetIds: The readsets within which to search for reads. At least
-	// one readset ID must be provided. All specified readsets must be
-	// aligned against a common set of reference sequences; this defines the
-	// genomic coordinates for the query.
-	ReadsetIds []string `json:"readsetIds,omitempty"`
-
-	// SequenceEnd: The end position (1-based, inclusive) of the target
-	// range. If specified, sequenceName must also be specified. Defaults to
-	// the end of the target reference sequence, if any.
-	SequenceEnd uint64 `json:"sequenceEnd,omitempty,string"`
-
-	// SequenceName: Restricts the results to a particular reference
-	// sequence such as 1, chr1, or X. The set of valid references sequences
-	// depends on the readsets specified. If set to *, only unmapped Reads
-	// are returned.
-	SequenceName string `json:"sequenceName,omitempty"`
-
-	// SequenceStart: The start position (1-based, inclusive) of the target
-	// range. If specified, sequenceName must also be specified. Defaults to
-	// the start of the target reference sequence, if any.
-	SequenceStart uint64 `json:"sequenceStart,omitempty,string"`
-}
-
-type SearchReadsResponse struct {
-	// NextPageToken: The continuation token, which is used to page through
-	// large result sets. Provide this value in a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// aren't any additional results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-
-	// Reads: The list of matching Reads. The resulting Reads are sorted by
-	// position; the smallest positions are returned first. Unmapped reads,
-	// which have no position, are returned last and are further sorted
-	// alphabetically by name.
-	Reads []*Read `json:"reads,omitempty"`
-}
-
-type SearchReadsetsRequest struct {
-	// DatasetIds: Restricts this query to readsets within the given
-	// datasets. At least one ID must be provided.
-	DatasetIds []string `json:"datasetIds,omitempty"`
-
-	// MaxResults: Specifies number of results to return in a single page.
-	// If unspecified, it will default to 128. The maximum value is 1024.
-	MaxResults uint64 `json:"maxResults,omitempty,string"`
-
-	// Name: Only return readsets for which a substring of the name matches
-	// this string.
-	Name string `json:"name,omitempty"`
-
-	// PageToken: The continuation token, which is used to page through
-	// large result sets. To get the next page of results, set this
-	// parameter to the value of nextPageToken from the previous response.
-	PageToken string `json:"pageToken,omitempty"`
-}
-
-type SearchReadsetsResponse struct {
-	// NextPageToken: The continuation token, which is used to page through
-	// large result sets. Provide this value in a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// aren't any additional results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-
-	// Readsets: The list of matching Readsets.
-	Readsets []*Readset `json:"readsets,omitempty"`
-}
-
-type SearchVariantSetsRequest struct {
-	// DatasetIds: Exactly one dataset ID must be provided here. Only
-	// variant sets which belong to this dataset will be returned.
-	DatasetIds []string `json:"datasetIds,omitempty"`
-
-	// PageSize: The maximum number of variant sets to return in a request.
-	PageSize int64 `json:"pageSize,omitempty"`
-
-	// PageToken: The continuation token, which is used to page through
-	// large result sets. To get the next page of results, set this
-	// parameter to the value of nextPageToken from the previous response.
-	PageToken string `json:"pageToken,omitempty"`
-}
-
-type SearchVariantSetsResponse struct {
-	// NextPageToken: The continuation token, which is used to page through
-	// large result sets. Provide this value in a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// aren't any additional results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-
-	// VariantSets: The variant sets belonging to the requested dataset.
-	VariantSets []*VariantSet `json:"variantSets,omitempty"`
-}
-
-type SearchVariantsRequest struct {
-	// CallSetIds: Only return variant calls which belong to call sets with
-	// these ids. Leaving this blank returns all variant calls. If a variant
-	// has no calls belonging to any of these call sets, it won't be
-	// returned at all. Currently, variants with no calls from any call set
-	// will never be returned.
-	CallSetIds []string `json:"callSetIds,omitempty"`
-
-	// End: Required. The end of the window (0-based, exclusive) for which
-	// overlapping variants should be returned.
-	End int64 `json:"end,omitempty,string"`
-
-	// MaxCalls: The maximum number of calls to return. However, at least
-	// one variant will always be returned, even if it has more calls than
-	// this limit.
-	MaxCalls int64 `json:"maxCalls,omitempty"`
-
-	// PageSize: The maximum number of variants to return.
-	PageSize int64 `json:"pageSize,omitempty"`
-
-	// PageToken: The continuation token, which is used to page through
-	// large result sets. To get the next page of results, set this
-	// parameter to the value of nextPageToken from the previous response.
-	PageToken string `json:"pageToken,omitempty"`
-
-	// ReferenceName: Required. Only return variants in this reference
-	// sequence.
-	ReferenceName string `json:"referenceName,omitempty"`
-
-	// Start: Required. The beginning of the window (0-based, inclusive) for
-	// which overlapping variants should be returned.
-	Start int64 `json:"start,omitempty,string"`
-
-	// VariantName: Only return variants which have exactly this name.
-	VariantName string `json:"variantName,omitempty"`
-
-	// VariantSetIds: Exactly one variant set ID must be provided. Only
-	// variants from this variant set will be returned.
-	VariantSetIds []string `json:"variantSetIds,omitempty"`
-}
-
-type SearchVariantsResponse struct {
-	// NextPageToken: The continuation token, which is used to page through
-	// large result sets. Provide this value in a subsequent request to
-	// return the next page of results. This field will be empty if there
-	// aren't any additional results.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-
-	// Variants: The list of matching Variants.
-	Variants []*Variant `json:"variants,omitempty"`
-}
-
-type Variant struct {
-	// AlternateBases: The bases that appear instead of the reference bases.
-	AlternateBases []string `json:"alternateBases,omitempty"`
-
-	// Calls: The variant calls for this particular variant. Each one
-	// represents the determination of genotype with respect to this
-	// variant.
-	Calls []*Call `json:"calls,omitempty"`
-
-	// Created: The date this variant was created, in milliseconds from the
-	// epoch.
-	Created int64 `json:"created,omitempty,string"`
-
-	// End: The end position (0-based) of this variant. This corresponds to
-	// the first base after the last base in the reference allele. So, the
-	// length of the reference allele is (end - start). This is useful for
-	// variants that don't explicitly give alternate bases, for example
-	// large deletions.
-	End int64 `json:"end,omitempty,string"`
-
-	// Filter: A list of filters (normally quality filters) this variant has
-	// failed. PASS indicates this variant has passed all filters.
-	Filter []string `json:"filter,omitempty"`
-
-	// Id: The Google generated ID of the variant, immutable.
-	Id string `json:"id,omitempty"`
-
-	// Info: A map of additional variant information.
-	Info map[string][]string `json:"info,omitempty"`
-
-	// Names: Names for the variant, for example a RefSNP ID.
-	Names []string `json:"names,omitempty"`
-
-	// Quality: A measure of how likely this variant is to be real. A higher
-	// value is better.
-	Quality float64 `json:"quality,omitempty"`
-
-	// ReferenceBases: The reference bases for this variant. They start at
-	// the given position.
-	ReferenceBases string `json:"referenceBases,omitempty"`
-
-	// ReferenceName: The reference on which this variant occurs. (such as
-	// chr20 or X)
-	ReferenceName string `json:"referenceName,omitempty"`
-
-	// Start: The position at which this variant occurs (0-based). This
-	// corresponds to the first base of the string of reference bases.
-	Start int64 `json:"start,omitempty,string"`
-
-	// VariantSetId: The ID of the variant set this variant belongs to.
-	VariantSetId string `json:"variantSetId,omitempty"`
-}
-
-type VariantSet struct {
-	// DatasetId: The dataset to which this variant set belongs. Immutable.
-	DatasetId string `json:"datasetId,omitempty"`
-
-	// Id: The Google-generated ID of the variant set. Immutable.
-	Id string `json:"id,omitempty"`
-
-	// Metadata: The metadata associated with this variant set.
-	Metadata []*Metadata `json:"metadata,omitempty"`
-
-	// ReferenceBounds: A list of all references used by the variants in a
-	// variant set with associated coordinate upper bounds for each one.
-	ReferenceBounds []*ReferenceBound `json:"referenceBounds,omitempty"`
-}
-
-// method id "genomics.callsets.create":
-
-type CallsetsCreateCall struct {
-	s       *Service
-	callset *CallSet
-	opt_    map[string]interface{}
-}
-
-// Create: Creates a new call set.
-func (r *CallsetsService) Create(callset *CallSet) *CallsetsCreateCall {
-	c := &CallsetsCreateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.callset = callset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CallsetsCreateCall) Fields(s ...googleapi.Field) *CallsetsCreateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *CallsetsCreateCall) Do() (*CallSet, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.callset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "callsets")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *CallSet
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Creates a new call set.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.callsets.create",
-	//   "path": "callsets",
-	//   "request": {
-	//     "$ref": "CallSet"
-	//   },
-	//   "response": {
-	//     "$ref": "CallSet"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.callsets.delete":
-
-type CallsetsDeleteCall struct {
-	s         *Service
-	callSetId string
-	opt_      map[string]interface{}
-}
-
-// Delete: Deletes a call set.
-func (r *CallsetsService) Delete(callSetId string) *CallsetsDeleteCall {
-	c := &CallsetsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
-	c.callSetId = callSetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CallsetsDeleteCall) Fields(s ...googleapi.Field) *CallsetsDeleteCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *CallsetsDeleteCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "callsets/{callSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"callSetId": c.callSetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Deletes a call set.",
-	//   "httpMethod": "DELETE",
-	//   "id": "genomics.callsets.delete",
-	//   "parameterOrder": [
-	//     "callSetId"
-	//   ],
-	//   "parameters": {
-	//     "callSetId": {
-	//       "description": "The ID of the call set to be deleted.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "callsets/{callSetId}",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.callsets.get":
-
-type CallsetsGetCall struct {
-	s         *Service
-	callSetId string
-	opt_      map[string]interface{}
-}
-
-// Get: Gets a call set by ID.
-func (r *CallsetsService) Get(callSetId string) *CallsetsGetCall {
-	c := &CallsetsGetCall{s: r.s, opt_: make(map[string]interface{})}
-	c.callSetId = callSetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CallsetsGetCall) Fields(s ...googleapi.Field) *CallsetsGetCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *CallsetsGetCall) Do() (*CallSet, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "callsets/{callSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"callSetId": c.callSetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *CallSet
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a call set by ID.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.callsets.get",
-	//   "parameterOrder": [
-	//     "callSetId"
-	//   ],
-	//   "parameters": {
-	//     "callSetId": {
-	//       "description": "The ID of the call set.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "callsets/{callSetId}",
-	//   "response": {
-	//     "$ref": "CallSet"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.callsets.patch":
-
-type CallsetsPatchCall struct {
-	s         *Service
-	callSetId string
-	callset   *CallSet
-	opt_      map[string]interface{}
-}
-
-// Patch: Updates a call set. This method supports patch semantics.
-func (r *CallsetsService) Patch(callSetId string, callset *CallSet) *CallsetsPatchCall {
-	c := &CallsetsPatchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.callSetId = callSetId
-	c.callset = callset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CallsetsPatchCall) Fields(s ...googleapi.Field) *CallsetsPatchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *CallsetsPatchCall) Do() (*CallSet, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.callset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "callsets/{callSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PATCH", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"callSetId": c.callSetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *CallSet
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a call set. This method supports patch semantics.",
-	//   "httpMethod": "PATCH",
-	//   "id": "genomics.callsets.patch",
-	//   "parameterOrder": [
-	//     "callSetId"
-	//   ],
-	//   "parameters": {
-	//     "callSetId": {
-	//       "description": "The ID of the call set to be updated.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "callsets/{callSetId}",
-	//   "request": {
-	//     "$ref": "CallSet"
-	//   },
-	//   "response": {
-	//     "$ref": "CallSet"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.callsets.search":
-
-type CallsetsSearchCall struct {
-	s                     *Service
-	searchcallsetsrequest *SearchCallSetsRequest
-	opt_                  map[string]interface{}
-}
-
-// Search: Gets a list of call sets matching the criteria.
-//
-// Implements
-// GlobalAllianceApi.searchCallSets.
-func (r *CallsetsService) Search(searchcallsetsrequest *SearchCallSetsRequest) *CallsetsSearchCall {
-	c := &CallsetsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.searchcallsetsrequest = searchcallsetsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CallsetsSearchCall) Fields(s ...googleapi.Field) *CallsetsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *CallsetsSearchCall) Do() (*SearchCallSetsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchcallsetsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "callsets/search")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *SearchCallSetsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a list of call sets matching the criteria.\n\nImplements GlobalAllianceApi.searchCallSets.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.callsets.search",
-	//   "path": "callsets/search",
-	//   "request": {
-	//     "$ref": "SearchCallSetsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "SearchCallSetsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.callsets.update":
-
-type CallsetsUpdateCall struct {
-	s         *Service
-	callSetId string
-	callset   *CallSet
-	opt_      map[string]interface{}
-}
-
-// Update: Updates a call set.
-func (r *CallsetsService) Update(callSetId string, callset *CallSet) *CallsetsUpdateCall {
-	c := &CallsetsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.callSetId = callSetId
-	c.callset = callset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CallsetsUpdateCall) Fields(s ...googleapi.Field) *CallsetsUpdateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *CallsetsUpdateCall) Do() (*CallSet, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.callset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "callsets/{callSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PUT", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"callSetId": c.callSetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *CallSet
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a call set.",
-	//   "httpMethod": "PUT",
-	//   "id": "genomics.callsets.update",
-	//   "parameterOrder": [
-	//     "callSetId"
-	//   ],
-	//   "parameters": {
-	//     "callSetId": {
-	//       "description": "The ID of the call set to be updated.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "callsets/{callSetId}",
-	//   "request": {
-	//     "$ref": "CallSet"
-	//   },
-	//   "response": {
-	//     "$ref": "CallSet"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.datasets.create":
-
-type DatasetsCreateCall struct {
-	s       *Service
-	dataset *Dataset
-	opt_    map[string]interface{}
-}
-
-// Create: Creates a new dataset.
-func (r *DatasetsService) Create(dataset *Dataset) *DatasetsCreateCall {
-	c := &DatasetsCreateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.dataset = dataset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DatasetsCreateCall) Fields(s ...googleapi.Field) *DatasetsCreateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DatasetsCreateCall) Do() (*Dataset, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "datasets")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Dataset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Creates a new dataset.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.datasets.create",
-	//   "path": "datasets",
-	//   "request": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "response": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.datasets.delete":
-
-type DatasetsDeleteCall struct {
-	s         *Service
-	datasetId string
-	opt_      map[string]interface{}
-}
-
-// Delete: Deletes a dataset.
-func (r *DatasetsService) Delete(datasetId string) *DatasetsDeleteCall {
-	c := &DatasetsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
-	c.datasetId = datasetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DatasetsDeleteCall) Fields(s ...googleapi.Field) *DatasetsDeleteCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DatasetsDeleteCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "datasets/{datasetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"datasetId": c.datasetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Deletes a dataset.",
-	//   "httpMethod": "DELETE",
-	//   "id": "genomics.datasets.delete",
-	//   "parameterOrder": [
-	//     "datasetId"
-	//   ],
-	//   "parameters": {
-	//     "datasetId": {
-	//       "description": "The ID of the dataset to be deleted.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "datasets/{datasetId}",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.datasets.get":
-
-type DatasetsGetCall struct {
-	s         *Service
-	datasetId string
-	opt_      map[string]interface{}
-}
-
-// Get: Gets a dataset by ID.
-func (r *DatasetsService) Get(datasetId string) *DatasetsGetCall {
-	c := &DatasetsGetCall{s: r.s, opt_: make(map[string]interface{})}
-	c.datasetId = datasetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DatasetsGetCall) Fields(s ...googleapi.Field) *DatasetsGetCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DatasetsGetCall) Do() (*Dataset, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "datasets/{datasetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"datasetId": c.datasetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Dataset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a dataset by ID.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.datasets.get",
-	//   "parameterOrder": [
-	//     "datasetId"
-	//   ],
-	//   "parameters": {
-	//     "datasetId": {
-	//       "description": "The ID of the dataset.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "datasets/{datasetId}",
-	//   "response": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.datasets.list":
-
-type DatasetsListCall struct {
-	s    *Service
-	opt_ map[string]interface{}
-}
-
-// List: Lists all datasets.
-func (r *DatasetsService) List() *DatasetsListCall {
-	c := &DatasetsListCall{s: r.s, opt_: make(map[string]interface{})}
-	return c
-}
-
-// MaxResults sets the optional parameter "maxResults": The maximum
-// number of results returned by this request.
-func (c *DatasetsListCall) MaxResults(maxResults uint64) *DatasetsListCall {
-	c.opt_["maxResults"] = maxResults
-	return c
-}
-
-// PageToken sets the optional parameter "pageToken": The continuation
-// token, which is used to page through large result sets. To get the
-// next page of results, set this parameter to the value of
-// nextPageToken from the previous response.
-func (c *DatasetsListCall) PageToken(pageToken string) *DatasetsListCall {
-	c.opt_["pageToken"] = pageToken
-	return c
-}
-
-// ProjectId sets the optional parameter "projectId": Only return
-// datasets which belong to this Google Developers Console project. Only
-// accepts project numbers. Returns all public projects if no project
-// number is specified.
-func (c *DatasetsListCall) ProjectId(projectId int64) *DatasetsListCall {
-	c.opt_["projectId"] = projectId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DatasetsListCall) Fields(s ...googleapi.Field) *DatasetsListCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DatasetsListCall) Do() (*ListDatasetsResponse, 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_["projectId"]; ok {
-		params.Set("projectId", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "datasets")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ListDatasetsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Lists all datasets.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.datasets.list",
-	//   "parameters": {
-	//     "maxResults": {
-	//       "default": "50",
-	//       "description": "The maximum number of results returned by this request.",
-	//       "format": "uint64",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "pageToken": {
-	//       "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "projectId": {
-	//       "description": "Only return datasets which belong to this Google Developers Console project. Only accepts project numbers. Returns all public projects if no project number is specified.",
-	//       "format": "int64",
-	//       "location": "query",
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "datasets",
-	//   "response": {
-	//     "$ref": "ListDatasetsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.datasets.patch":
-
-type DatasetsPatchCall struct {
-	s         *Service
-	datasetId string
-	dataset   *Dataset
-	opt_      map[string]interface{}
-}
-
-// Patch: Updates a dataset. This method supports patch semantics.
-func (r *DatasetsService) Patch(datasetId string, dataset *Dataset) *DatasetsPatchCall {
-	c := &DatasetsPatchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.datasetId = datasetId
-	c.dataset = dataset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DatasetsPatchCall) Fields(s ...googleapi.Field) *DatasetsPatchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DatasetsPatchCall) Do() (*Dataset, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "datasets/{datasetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PATCH", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"datasetId": c.datasetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Dataset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a dataset. This method supports patch semantics.",
-	//   "httpMethod": "PATCH",
-	//   "id": "genomics.datasets.patch",
-	//   "parameterOrder": [
-	//     "datasetId"
-	//   ],
-	//   "parameters": {
-	//     "datasetId": {
-	//       "description": "The ID of the dataset to be updated.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "datasets/{datasetId}",
-	//   "request": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "response": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.datasets.undelete":
-
-type DatasetsUndeleteCall struct {
-	s         *Service
-	datasetId string
-	opt_      map[string]interface{}
-}
-
-// Undelete: Undeletes a dataset by restoring a dataset which was
-// deleted via this API. This operation is only possible for a week
-// after the deletion occurred.
-func (r *DatasetsService) Undelete(datasetId string) *DatasetsUndeleteCall {
-	c := &DatasetsUndeleteCall{s: r.s, opt_: make(map[string]interface{})}
-	c.datasetId = datasetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DatasetsUndeleteCall) Fields(s ...googleapi.Field) *DatasetsUndeleteCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DatasetsUndeleteCall) Do() (*Dataset, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "datasets/{datasetId}/undelete")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"datasetId": c.datasetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Dataset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Undeletes a dataset by restoring a dataset which was deleted via this API. This operation is only possible for a week after the deletion occurred.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.datasets.undelete",
-	//   "parameterOrder": [
-	//     "datasetId"
-	//   ],
-	//   "parameters": {
-	//     "datasetId": {
-	//       "description": "The ID of the dataset to be undeleted.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "datasets/{datasetId}/undelete",
-	//   "response": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.datasets.update":
-
-type DatasetsUpdateCall struct {
-	s         *Service
-	datasetId string
-	dataset   *Dataset
-	opt_      map[string]interface{}
-}
-
-// Update: Updates a dataset.
-func (r *DatasetsService) Update(datasetId string, dataset *Dataset) *DatasetsUpdateCall {
-	c := &DatasetsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.datasetId = datasetId
-	c.dataset = dataset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *DatasetsUpdateCall) Fields(s ...googleapi.Field) *DatasetsUpdateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *DatasetsUpdateCall) Do() (*Dataset, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "datasets/{datasetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PUT", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"datasetId": c.datasetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Dataset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a dataset.",
-	//   "httpMethod": "PUT",
-	//   "id": "genomics.datasets.update",
-	//   "parameterOrder": [
-	//     "datasetId"
-	//   ],
-	//   "parameters": {
-	//     "datasetId": {
-	//       "description": "The ID of the dataset to be updated.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "datasets/{datasetId}",
-	//   "request": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "response": {
-	//     "$ref": "Dataset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.experimental.jobs.create":
-
-type ExperimentalJobsCreateCall struct {
-	s                            *Service
-	experimentalcreatejobrequest *ExperimentalCreateJobRequest
-	opt_                         map[string]interface{}
-}
-
-// Create: Creates and asynchronously runs an ad-hoc job. This is an
-// experimental call and may be removed or changed at any time.
-func (r *ExperimentalJobsService) Create(experimentalcreatejobrequest *ExperimentalCreateJobRequest) *ExperimentalJobsCreateCall {
-	c := &ExperimentalJobsCreateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.experimentalcreatejobrequest = experimentalcreatejobrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ExperimentalJobsCreateCall) Fields(s ...googleapi.Field) *ExperimentalJobsCreateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ExperimentalJobsCreateCall) Do() (*ExperimentalCreateJobResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.experimentalcreatejobrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "experimental/jobs/create")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ExperimentalCreateJobResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Creates and asynchronously runs an ad-hoc job. This is an experimental call and may be removed or changed at any time.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.experimental.jobs.create",
-	//   "path": "experimental/jobs/create",
-	//   "request": {
-	//     "$ref": "ExperimentalCreateJobRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "ExperimentalCreateJobResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/devstorage.read_write",
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.jobs.cancel":
-
-type JobsCancelCall struct {
-	s     *Service
-	jobId string
-	opt_  map[string]interface{}
-}
-
-// Cancel: Cancels a job by ID. Note that it is possible for partial
-// results to be generated and stored for cancelled jobs.
-func (r *JobsService) Cancel(jobId string) *JobsCancelCall {
-	c := &JobsCancelCall{s: r.s, opt_: make(map[string]interface{})}
-	c.jobId = jobId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *JobsCancelCall) Fields(s ...googleapi.Field) *JobsCancelCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *JobsCancelCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "jobs/{jobId}/cancel")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"jobId": c.jobId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Cancels a job by ID. Note that it is possible for partial results to be generated and stored for cancelled jobs.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.jobs.cancel",
-	//   "parameterOrder": [
-	//     "jobId"
-	//   ],
-	//   "parameters": {
-	//     "jobId": {
-	//       "description": "Required. The ID of the job.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "jobs/{jobId}/cancel",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.jobs.get":
-
-type JobsGetCall struct {
-	s     *Service
-	jobId string
-	opt_  map[string]interface{}
-}
-
-// Get: Gets a job by ID.
-func (r *JobsService) Get(jobId string) *JobsGetCall {
-	c := &JobsGetCall{s: r.s, opt_: make(map[string]interface{})}
-	c.jobId = jobId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *JobsGetCall) Fields(s ...googleapi.Field) *JobsGetCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *JobsGetCall) Do() (*Job, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "jobs/{jobId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"jobId": c.jobId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Job
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a job by ID.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.jobs.get",
-	//   "parameterOrder": [
-	//     "jobId"
-	//   ],
-	//   "parameters": {
-	//     "jobId": {
-	//       "description": "Required. The ID of the job.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "jobs/{jobId}",
-	//   "response": {
-	//     "$ref": "Job"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.jobs.search":
-
-type JobsSearchCall struct {
-	s                 *Service
-	searchjobsrequest *SearchJobsRequest
-	opt_              map[string]interface{}
-}
-
-// Search: Gets a list of jobs matching the criteria.
-func (r *JobsService) Search(searchjobsrequest *SearchJobsRequest) *JobsSearchCall {
-	c := &JobsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.searchjobsrequest = searchjobsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *JobsSearchCall) Fields(s ...googleapi.Field) *JobsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *JobsSearchCall) Do() (*SearchJobsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchjobsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "jobs/search")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *SearchJobsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a list of jobs matching the criteria.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.jobs.search",
-	//   "path": "jobs/search",
-	//   "request": {
-	//     "$ref": "SearchJobsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "SearchJobsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.reads.search":
-
-type ReadsSearchCall struct {
-	s                  *Service
-	searchreadsrequest *SearchReadsRequest
-	opt_               map[string]interface{}
-}
-
-// Search: Gets a list of reads for one or more readsets. Reads search
-// operates over a genomic coordinate space of reference sequence &
-// position defined over the reference sequences to which the requested
-// readsets are aligned. If a target positional range is specified,
-// search returns all reads whose alignment to the reference genome
-// overlap the range. A query which specifies only readset IDs yields
-// all reads in those readsets, including unmapped reads. All reads
-// returned (including reads on subsequent pages) are ordered by genomic
-// coordinate (reference sequence & position). Reads with equivalent
-// genomic coordinates are returned in a deterministic order.
-func (r *ReadsService) Search(searchreadsrequest *SearchReadsRequest) *ReadsSearchCall {
-	c := &ReadsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.searchreadsrequest = searchreadsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsSearchCall) Fields(s ...googleapi.Field) *ReadsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsSearchCall) Do() (*SearchReadsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchreadsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "reads/search")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *SearchReadsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a list of reads for one or more readsets. Reads search operates over a genomic coordinate space of reference sequence \u0026 position defined over the reference sequences to which the requested readsets are aligned. If a target positional range is specified, search returns all reads whose alignment to the reference genome overlap the range. A query which specifies only readset IDs yields all reads in those readsets, including unmapped reads. All reads returned (including reads on subsequent pages) are ordered by genomic coordinate (reference sequence \u0026 position). Reads with equivalent genomic coordinates are returned in a deterministic order.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.reads.search",
-	//   "path": "reads/search",
-	//   "request": {
-	//     "$ref": "SearchReadsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "SearchReadsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.delete":
-
-type ReadsetsDeleteCall struct {
-	s         *Service
-	readsetId string
-	opt_      map[string]interface{}
-}
-
-// Delete: Deletes a readset.
-func (r *ReadsetsService) Delete(readsetId string) *ReadsetsDeleteCall {
-	c := &ReadsetsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
-	c.readsetId = readsetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsDeleteCall) Fields(s ...googleapi.Field) *ReadsetsDeleteCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsDeleteCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/{readsetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"readsetId": c.readsetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Deletes a readset.",
-	//   "httpMethod": "DELETE",
-	//   "id": "genomics.readsets.delete",
-	//   "parameterOrder": [
-	//     "readsetId"
-	//   ],
-	//   "parameters": {
-	//     "readsetId": {
-	//       "description": "The ID of the readset to be deleted. The caller must have WRITE permissions to the dataset associated with this readset.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "readsets/{readsetId}",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.export":
-
-type ReadsetsExportCall struct {
-	s                     *Service
-	exportreadsetsrequest *ExportReadsetsRequest
-	opt_                  map[string]interface{}
-}
-
-// Export: Exports readsets to a BAM file in Google Cloud Storage. Note
-// that currently there may be some differences between exported BAM
-// files and the original BAM file at the time of import. In particular,
-// comments in the input file header will not be preserved, and some
-// custom tags will be converted to strings.
-func (r *ReadsetsService) Export(exportreadsetsrequest *ExportReadsetsRequest) *ReadsetsExportCall {
-	c := &ReadsetsExportCall{s: r.s, opt_: make(map[string]interface{})}
-	c.exportreadsetsrequest = exportreadsetsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsExportCall) Fields(s ...googleapi.Field) *ReadsetsExportCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsExportCall) Do() (*ExportReadsetsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.exportreadsetsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/export")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ExportReadsetsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Exports readsets to a BAM file in Google Cloud Storage. Note that currently there may be some differences between exported BAM files and the original BAM file at the time of import. In particular, comments in the input file header will not be preserved, and some custom tags will be converted to strings.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.readsets.export",
-	//   "path": "readsets/export",
-	//   "request": {
-	//     "$ref": "ExportReadsetsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "ExportReadsetsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/devstorage.read_write",
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.get":
-
-type ReadsetsGetCall struct {
-	s         *Service
-	readsetId string
-	opt_      map[string]interface{}
-}
-
-// Get: Gets a readset by ID.
-func (r *ReadsetsService) Get(readsetId string) *ReadsetsGetCall {
-	c := &ReadsetsGetCall{s: r.s, opt_: make(map[string]interface{})}
-	c.readsetId = readsetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsGetCall) Fields(s ...googleapi.Field) *ReadsetsGetCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsGetCall) Do() (*Readset, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/{readsetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"readsetId": c.readsetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Readset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a readset by ID.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.readsets.get",
-	//   "parameterOrder": [
-	//     "readsetId"
-	//   ],
-	//   "parameters": {
-	//     "readsetId": {
-	//       "description": "The ID of the readset.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "readsets/{readsetId}",
-	//   "response": {
-	//     "$ref": "Readset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.import":
-
-type ReadsetsImportCall struct {
-	s                     *Service
-	importreadsetsrequest *ImportReadsetsRequest
-	opt_                  map[string]interface{}
-}
-
-// Import: Creates readsets by asynchronously importing the provided
-// information. Note that currently comments in the input file header
-// are not imported and some custom tags will be converted to strings,
-// rather than preserving tag types. The caller must have WRITE
-// permissions to the dataset.
-func (r *ReadsetsService) Import(importreadsetsrequest *ImportReadsetsRequest) *ReadsetsImportCall {
-	c := &ReadsetsImportCall{s: r.s, opt_: make(map[string]interface{})}
-	c.importreadsetsrequest = importreadsetsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsImportCall) Fields(s ...googleapi.Field) *ReadsetsImportCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsImportCall) Do() (*ImportReadsetsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.importreadsetsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/import")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ImportReadsetsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Creates readsets by asynchronously importing the provided information. Note that currently comments in the input file header are not imported and some custom tags will be converted to strings, rather than preserving tag types. The caller must have WRITE permissions to the dataset.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.readsets.import",
-	//   "path": "readsets/import",
-	//   "request": {
-	//     "$ref": "ImportReadsetsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "ImportReadsetsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/devstorage.read_write",
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.patch":
-
-type ReadsetsPatchCall struct {
-	s         *Service
-	readsetId string
-	readset   *Readset
-	opt_      map[string]interface{}
-}
-
-// Patch: Updates a readset. This method supports patch semantics.
-func (r *ReadsetsService) Patch(readsetId string, readset *Readset) *ReadsetsPatchCall {
-	c := &ReadsetsPatchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.readsetId = readsetId
-	c.readset = readset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsPatchCall) Fields(s ...googleapi.Field) *ReadsetsPatchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsPatchCall) Do() (*Readset, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.readset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/{readsetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PATCH", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"readsetId": c.readsetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Readset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a readset. This method supports patch semantics.",
-	//   "httpMethod": "PATCH",
-	//   "id": "genomics.readsets.patch",
-	//   "parameterOrder": [
-	//     "readsetId"
-	//   ],
-	//   "parameters": {
-	//     "readsetId": {
-	//       "description": "The ID of the readset to be updated. The caller must have WRITE permissions to the dataset associated with this readset.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "readsets/{readsetId}",
-	//   "request": {
-	//     "$ref": "Readset"
-	//   },
-	//   "response": {
-	//     "$ref": "Readset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.search":
-
-type ReadsetsSearchCall struct {
-	s                     *Service
-	searchreadsetsrequest *SearchReadsetsRequest
-	opt_                  map[string]interface{}
-}
-
-// Search: Gets a list of readsets matching the criteria.
-func (r *ReadsetsService) Search(searchreadsetsrequest *SearchReadsetsRequest) *ReadsetsSearchCall {
-	c := &ReadsetsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.searchreadsetsrequest = searchreadsetsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsSearchCall) Fields(s ...googleapi.Field) *ReadsetsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsSearchCall) Do() (*SearchReadsetsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchreadsetsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/search")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *SearchReadsetsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a list of readsets matching the criteria.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.readsets.search",
-	//   "path": "readsets/search",
-	//   "request": {
-	//     "$ref": "SearchReadsetsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "SearchReadsetsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.update":
-
-type ReadsetsUpdateCall struct {
-	s         *Service
-	readsetId string
-	readset   *Readset
-	opt_      map[string]interface{}
-}
-
-// Update: Updates a readset.
-func (r *ReadsetsService) Update(readsetId string, readset *Readset) *ReadsetsUpdateCall {
-	c := &ReadsetsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.readsetId = readsetId
-	c.readset = readset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsUpdateCall) Fields(s ...googleapi.Field) *ReadsetsUpdateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsUpdateCall) Do() (*Readset, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.readset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/{readsetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PUT", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"readsetId": c.readsetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Readset
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a readset.",
-	//   "httpMethod": "PUT",
-	//   "id": "genomics.readsets.update",
-	//   "parameterOrder": [
-	//     "readsetId"
-	//   ],
-	//   "parameters": {
-	//     "readsetId": {
-	//       "description": "The ID of the readset to be updated. The caller must have WRITE permissions to the dataset associated with this readset.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "readsets/{readsetId}",
-	//   "request": {
-	//     "$ref": "Readset"
-	//   },
-	//   "response": {
-	//     "$ref": "Readset"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.readsets.coveragebuckets.list":
-
-type ReadsetsCoveragebucketsListCall struct {
-	s         *Service
-	readsetId string
-	opt_      map[string]interface{}
-}
-
-// List: Lists fixed width coverage buckets for a readset, each of which
-// correspond to a range of a reference sequence. Each bucket summarizes
-// coverage information across its corresponding genomic range. Coverage
-// is defined as the number of reads which are aligned to a given base
-// in the reference sequence. Coverage buckets are available at various
-// bucket widths, enabling various coverage "zoom levels". The caller
-// must have READ permissions for the target readset.
-func (r *ReadsetsCoveragebucketsService) List(readsetId string) *ReadsetsCoveragebucketsListCall {
-	c := &ReadsetsCoveragebucketsListCall{s: r.s, opt_: make(map[string]interface{})}
-	c.readsetId = readsetId
-	return c
-}
-
-// MaxResults sets the optional parameter "maxResults": The maximum
-// number of results to return in a single page. If unspecified,
-// defaults to 1024. The maximum value is 2048.
-func (c *ReadsetsCoveragebucketsListCall) MaxResults(maxResults uint64) *ReadsetsCoveragebucketsListCall {
-	c.opt_["maxResults"] = maxResults
-	return c
-}
-
-// PageToken sets the optional parameter "pageToken": The continuation
-// token, which is used to page through large result sets. To get the
-// next page of results, set this parameter to the value of
-// nextPageToken from the previous response.
-func (c *ReadsetsCoveragebucketsListCall) PageToken(pageToken string) *ReadsetsCoveragebucketsListCall {
-	c.opt_["pageToken"] = pageToken
-	return c
-}
-
-// RangeSequenceEnd sets the optional parameter "range.sequenceEnd": The
-// end position of the range on the reference, 1-based exclusive. If
-// specified, sequenceName must also be specified.
-func (c *ReadsetsCoveragebucketsListCall) RangeSequenceEnd(rangeSequenceEnd uint64) *ReadsetsCoveragebucketsListCall {
-	c.opt_["range.sequenceEnd"] = rangeSequenceEnd
-	return c
-}
-
-// RangeSequenceName sets the optional parameter "range.sequenceName":
-// The reference sequence name, for example chr1, 1, or chrX.
-func (c *ReadsetsCoveragebucketsListCall) RangeSequenceName(rangeSequenceName string) *ReadsetsCoveragebucketsListCall {
-	c.opt_["range.sequenceName"] = rangeSequenceName
-	return c
-}
-
-// RangeSequenceStart sets the optional parameter "range.sequenceStart":
-// The start position of the range on the reference, 1-based inclusive.
-// If specified, sequenceName must also be specified.
-func (c *ReadsetsCoveragebucketsListCall) RangeSequenceStart(rangeSequenceStart uint64) *ReadsetsCoveragebucketsListCall {
-	c.opt_["range.sequenceStart"] = rangeSequenceStart
-	return c
-}
-
-// TargetBucketWidth sets the optional parameter "targetBucketWidth":
-// The desired width of each reported coverage bucket in base pairs.
-// This will be rounded down to the nearest precomputed bucket width;
-// the value of which is returned as bucketWidth in the response.
-// Defaults to infinity (each bucket spans an entire reference sequence)
-// or the length of the target range, if specified. The smallest
-// precomputed bucketWidth is currently 2048 base pairs; this is subject
-// to change.
-func (c *ReadsetsCoveragebucketsListCall) TargetBucketWidth(targetBucketWidth uint64) *ReadsetsCoveragebucketsListCall {
-	c.opt_["targetBucketWidth"] = targetBucketWidth
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ReadsetsCoveragebucketsListCall) Fields(s ...googleapi.Field) *ReadsetsCoveragebucketsListCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *ReadsetsCoveragebucketsListCall) Do() (*ListCoverageBucketsResponse, 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_["range.sequenceEnd"]; ok {
-		params.Set("range.sequenceEnd", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["range.sequenceName"]; ok {
-		params.Set("range.sequenceName", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["range.sequenceStart"]; ok {
-		params.Set("range.sequenceStart", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["targetBucketWidth"]; ok {
-		params.Set("targetBucketWidth", fmt.Sprintf("%v", v))
-	}
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "readsets/{readsetId}/coveragebuckets")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"readsetId": c.readsetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ListCoverageBucketsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Lists fixed width coverage buckets for a readset, each of which correspond to a range of a reference sequence. Each bucket summarizes coverage information across its corresponding genomic range. Coverage is defined as the number of reads which are aligned to a given base in the reference sequence. Coverage buckets are available at various bucket widths, enabling various coverage \"zoom levels\". The caller must have READ permissions for the target readset.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.readsets.coveragebuckets.list",
-	//   "parameterOrder": [
-	//     "readsetId"
-	//   ],
-	//   "parameters": {
-	//     "maxResults": {
-	//       "default": "1024",
-	//       "description": "The maximum number of results to return in a single page. If unspecified, defaults to 1024. The maximum value is 2048.",
-	//       "format": "uint64",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "pageToken": {
-	//       "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "range.sequenceEnd": {
-	//       "description": "The end position of the range on the reference, 1-based exclusive. If specified, sequenceName must also be specified.",
-	//       "format": "uint64",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "range.sequenceName": {
-	//       "description": "The reference sequence name, for example chr1, 1, or chrX.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "range.sequenceStart": {
-	//       "description": "The start position of the range on the reference, 1-based inclusive. If specified, sequenceName must also be specified.",
-	//       "format": "uint64",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "readsetId": {
-	//       "description": "Required. The ID of the readset over which coverage is requested.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     },
-	//     "targetBucketWidth": {
-	//       "description": "The desired width of each reported coverage bucket in base pairs. This will be rounded down to the nearest precomputed bucket width; the value of which is returned as bucketWidth in the response. Defaults to infinity (each bucket spans an entire reference sequence) or the length of the target range, if specified. The smallest precomputed bucketWidth is currently 2048 base pairs; this is subject to change.",
-	//       "format": "uint64",
-	//       "location": "query",
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "readsets/{readsetId}/coveragebuckets",
-	//   "response": {
-	//     "$ref": "ListCoverageBucketsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variants.create":
-
-type VariantsCreateCall struct {
-	s       *Service
-	variant *Variant
-	opt_    map[string]interface{}
-}
-
-// Create: Creates a new variant.
-func (r *VariantsService) Create(variant *Variant) *VariantsCreateCall {
-	c := &VariantsCreateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variant = variant
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsCreateCall) Fields(s ...googleapi.Field) *VariantsCreateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsCreateCall) Do() (*Variant, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variant)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variants")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Variant
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Creates a new variant.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.variants.create",
-	//   "path": "variants",
-	//   "request": {
-	//     "$ref": "Variant"
-	//   },
-	//   "response": {
-	//     "$ref": "Variant"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variants.delete":
-
-type VariantsDeleteCall struct {
-	s         *Service
-	variantId string
-	opt_      map[string]interface{}
-}
-
-// Delete: Deletes a variant.
-func (r *VariantsService) Delete(variantId string) *VariantsDeleteCall {
-	c := &VariantsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantId = variantId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsDeleteCall) Fields(s ...googleapi.Field) *VariantsDeleteCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsDeleteCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variants/{variantId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantId": c.variantId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Deletes a variant.",
-	//   "httpMethod": "DELETE",
-	//   "id": "genomics.variants.delete",
-	//   "parameterOrder": [
-	//     "variantId"
-	//   ],
-	//   "parameters": {
-	//     "variantId": {
-	//       "description": "The ID of the variant to be deleted.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variants/{variantId}",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variants.export":
-
-type VariantsExportCall struct {
-	s                     *Service
-	exportvariantsrequest *ExportVariantsRequest
-	opt_                  map[string]interface{}
-}
-
-// Export: Exports variant data to an external destination.
-func (r *VariantsService) Export(exportvariantsrequest *ExportVariantsRequest) *VariantsExportCall {
-	c := &VariantsExportCall{s: r.s, opt_: make(map[string]interface{})}
-	c.exportvariantsrequest = exportvariantsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsExportCall) Fields(s ...googleapi.Field) *VariantsExportCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsExportCall) Do() (*ExportVariantsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.exportvariantsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variants/export")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ExportVariantsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Exports variant data to an external destination.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.variants.export",
-	//   "path": "variants/export",
-	//   "request": {
-	//     "$ref": "ExportVariantsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "ExportVariantsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/bigquery",
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variants.get":
-
-type VariantsGetCall struct {
-	s         *Service
-	variantId string
-	opt_      map[string]interface{}
-}
-
-// Get: Gets a variant by ID.
-func (r *VariantsService) Get(variantId string) *VariantsGetCall {
-	c := &VariantsGetCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantId = variantId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsGetCall) Fields(s ...googleapi.Field) *VariantsGetCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsGetCall) Do() (*Variant, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variants/{variantId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantId": c.variantId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Variant
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a variant by ID.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.variants.get",
-	//   "parameterOrder": [
-	//     "variantId"
-	//   ],
-	//   "parameters": {
-	//     "variantId": {
-	//       "description": "The ID of the variant.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variants/{variantId}",
-	//   "response": {
-	//     "$ref": "Variant"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variants.import":
-
-type VariantsImportCall struct {
-	s                     *Service
-	importvariantsrequest *ImportVariantsRequest
-	opt_                  map[string]interface{}
-}
-
-// Import: Creates variant data by asynchronously importing the provided
-// information. The variants for import will be merged with any existing
-// data and each other according to the behavior of mergeVariants. In
-// particular, this means for merged VCF variants that have conflicting
-// INFO fields, some data will be arbitrarily discarded. As a special
-// case, for single-sample VCF files, QUAL and FILTER fields will be
-// moved to the call level; these are sometimes interpreted in a
-// call-specific context. Imported VCF headers are appended to the
-// metadata already in a variant set.
-func (r *VariantsService) Import(importvariantsrequest *ImportVariantsRequest) *VariantsImportCall {
-	c := &VariantsImportCall{s: r.s, opt_: make(map[string]interface{})}
-	c.importvariantsrequest = importvariantsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsImportCall) Fields(s ...googleapi.Field) *VariantsImportCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsImportCall) Do() (*ImportVariantsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.importvariantsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variants/import")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *ImportVariantsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Creates variant data by asynchronously importing the provided information. The variants for import will be merged with any existing data and each other according to the behavior of mergeVariants. In particular, this means for merged VCF variants that have conflicting INFO fields, some data will be arbitrarily discarded. As a special case, for single-sample VCF files, QUAL and FILTER fields will be moved to the call level; these are sometimes interpreted in a call-specific context. Imported VCF headers are appended to the metadata already in a variant set.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.variants.import",
-	//   "path": "variants/import",
-	//   "request": {
-	//     "$ref": "ImportVariantsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "ImportVariantsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/devstorage.read_write",
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variants.search":
-
-type VariantsSearchCall struct {
-	s                     *Service
-	searchvariantsrequest *SearchVariantsRequest
-	opt_                  map[string]interface{}
-}
-
-// Search: Gets a list of variants matching the criteria.
-//
-// Implements
-// GlobalAllianceApi.searchVariants.
-func (r *VariantsService) Search(searchvariantsrequest *SearchVariantsRequest) *VariantsSearchCall {
-	c := &VariantsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.searchvariantsrequest = searchvariantsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsSearchCall) Fields(s ...googleapi.Field) *VariantsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsSearchCall) Do() (*SearchVariantsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchvariantsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variants/search")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *SearchVariantsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a list of variants matching the criteria.\n\nImplements GlobalAllianceApi.searchVariants.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.variants.search",
-	//   "path": "variants/search",
-	//   "request": {
-	//     "$ref": "SearchVariantsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "SearchVariantsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variants.update":
-
-type VariantsUpdateCall struct {
-	s         *Service
-	variantId string
-	variant   *Variant
-	opt_      map[string]interface{}
-}
-
-// Update: Updates a variant's names and info fields. All other
-// modifications are silently ignored. Returns the modified variant
-// without its calls.
-func (r *VariantsService) Update(variantId string, variant *Variant) *VariantsUpdateCall {
-	c := &VariantsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantId = variantId
-	c.variant = variant
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsUpdateCall) Fields(s ...googleapi.Field) *VariantsUpdateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsUpdateCall) Do() (*Variant, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variant)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variants/{variantId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PUT", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantId": c.variantId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *Variant
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a variant's names and info fields. All other modifications are silently ignored. Returns the modified variant without its calls.",
-	//   "httpMethod": "PUT",
-	//   "id": "genomics.variants.update",
-	//   "parameterOrder": [
-	//     "variantId"
-	//   ],
-	//   "parameters": {
-	//     "variantId": {
-	//       "description": "The ID of the variant to be updated.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variants/{variantId}",
-	//   "request": {
-	//     "$ref": "Variant"
-	//   },
-	//   "response": {
-	//     "$ref": "Variant"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variantsets.delete":
-
-type VariantsetsDeleteCall struct {
-	s            *Service
-	variantSetId string
-	opt_         map[string]interface{}
-}
-
-// Delete: Deletes the contents of a variant set. The variant set object
-// is not deleted.
-func (r *VariantsetsService) Delete(variantSetId string) *VariantsetsDeleteCall {
-	c := &VariantsetsDeleteCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantSetId = variantSetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsetsDeleteCall) Fields(s ...googleapi.Field) *VariantsetsDeleteCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsetsDeleteCall) Do() error {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variantsets/{variantSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantSetId": c.variantSetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Deletes the contents of a variant set. The variant set object is not deleted.",
-	//   "httpMethod": "DELETE",
-	//   "id": "genomics.variantsets.delete",
-	//   "parameterOrder": [
-	//     "variantSetId"
-	//   ],
-	//   "parameters": {
-	//     "variantSetId": {
-	//       "description": "The ID of the variant set to be deleted.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variantsets/{variantSetId}",
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variantsets.get":
-
-type VariantsetsGetCall struct {
-	s            *Service
-	variantSetId string
-	opt_         map[string]interface{}
-}
-
-// Get: Gets a variant set by ID.
-func (r *VariantsetsService) Get(variantSetId string) *VariantsetsGetCall {
-	c := &VariantsetsGetCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantSetId = variantSetId
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsetsGetCall) Fields(s ...googleapi.Field) *VariantsetsGetCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsetsGetCall) Do() (*VariantSet, error) {
-	var body io.Reader = nil
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variantsets/{variantSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantSetId": c.variantSetId,
-	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
-	res, err := c.s.client.Do(req)
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *VariantSet
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Gets a variant set by ID.",
-	//   "httpMethod": "GET",
-	//   "id": "genomics.variantsets.get",
-	//   "parameterOrder": [
-	//     "variantSetId"
-	//   ],
-	//   "parameters": {
-	//     "variantSetId": {
-	//       "description": "Required. The ID of the variant set.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variantsets/{variantSetId}",
-	//   "response": {
-	//     "$ref": "VariantSet"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variantsets.mergeVariants":
-
-type VariantsetsMergeVariantsCall struct {
-	s                    *Service
-	variantSetId         string
-	mergevariantsrequest *MergeVariantsRequest
-	opt_                 map[string]interface{}
-}
-
-// MergeVariants: Merges the given variants with existing variants. Each
-// variant will be merged with an existing variant that matches its
-// reference sequence, start, end, reference bases, and alternative
-// bases. If no such variant exists, a new one will be created.
-//
-// When
-// variants are merged, the call information from the new variant is
-// added to the existing variant, and other fields (such as key/value
-// pairs) are discarded.
-func (r *VariantsetsService) MergeVariants(variantSetId string, mergevariantsrequest *MergeVariantsRequest) *VariantsetsMergeVariantsCall {
-	c := &VariantsetsMergeVariantsCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantSetId = variantSetId
-	c.mergevariantsrequest = mergevariantsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsetsMergeVariantsCall) Fields(s ...googleapi.Field) *VariantsetsMergeVariantsCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsetsMergeVariantsCall) Do() error {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.mergevariantsrequest)
-	if err != nil {
-		return err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variantsets/{variantSetId}/mergeVariants")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantSetId": c.variantSetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return err
-	}
-	return nil
-	// {
-	//   "description": "Merges the given variants with existing variants. Each variant will be merged with an existing variant that matches its reference sequence, start, end, reference bases, and alternative bases. If no such variant exists, a new one will be created.\n\nWhen variants are merged, the call information from the new variant is added to the existing variant, and other fields (such as key/value pairs) are discarded.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.variantsets.mergeVariants",
-	//   "parameterOrder": [
-	//     "variantSetId"
-	//   ],
-	//   "parameters": {
-	//     "variantSetId": {
-	//       "description": "The destination variant set.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variantsets/{variantSetId}/mergeVariants",
-	//   "request": {
-	//     "$ref": "MergeVariantsRequest"
-	//   }
-	// }
-
-}
-
-// method id "genomics.variantsets.patch":
-
-type VariantsetsPatchCall struct {
-	s            *Service
-	variantSetId string
-	variantset   *VariantSet
-	opt_         map[string]interface{}
-}
-
-// Patch: Updates a variant set's metadata. All other modifications are
-// silently ignored. This method supports patch semantics.
-func (r *VariantsetsService) Patch(variantSetId string, variantset *VariantSet) *VariantsetsPatchCall {
-	c := &VariantsetsPatchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantSetId = variantSetId
-	c.variantset = variantset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsetsPatchCall) Fields(s ...googleapi.Field) *VariantsetsPatchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsetsPatchCall) Do() (*VariantSet, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variantset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variantsets/{variantSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PATCH", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantSetId": c.variantSetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *VariantSet
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a variant set's metadata. All other modifications are silently ignored. This method supports patch semantics.",
-	//   "httpMethod": "PATCH",
-	//   "id": "genomics.variantsets.patch",
-	//   "parameterOrder": [
-	//     "variantSetId"
-	//   ],
-	//   "parameters": {
-	//     "variantSetId": {
-	//       "description": "The ID of the variant to be updated.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variantsets/{variantSetId}",
-	//   "request": {
-	//     "$ref": "VariantSet"
-	//   },
-	//   "response": {
-	//     "$ref": "VariantSet"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variantsets.search":
-
-type VariantsetsSearchCall struct {
-	s                        *Service
-	searchvariantsetsrequest *SearchVariantSetsRequest
-	opt_                     map[string]interface{}
-}
-
-// Search: Returns a list of all variant sets matching search
-// criteria.
-//
-// Implements GlobalAllianceApi.searchVariantSets.
-func (r *VariantsetsService) Search(searchvariantsetsrequest *SearchVariantSetsRequest) *VariantsetsSearchCall {
-	c := &VariantsetsSearchCall{s: r.s, opt_: make(map[string]interface{})}
-	c.searchvariantsetsrequest = searchvariantsetsrequest
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsetsSearchCall) Fields(s ...googleapi.Field) *VariantsetsSearchCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsetsSearchCall) Do() (*SearchVariantSetsResponse, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchvariantsetsrequest)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variantsets/search")
-	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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *SearchVariantSetsResponse
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Returns a list of all variant sets matching search criteria.\n\nImplements GlobalAllianceApi.searchVariantSets.",
-	//   "httpMethod": "POST",
-	//   "id": "genomics.variantsets.search",
-	//   "path": "variantsets/search",
-	//   "request": {
-	//     "$ref": "SearchVariantSetsRequest"
-	//   },
-	//   "response": {
-	//     "$ref": "SearchVariantSetsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics",
-	//     "https://www.googleapis.com/auth/genomics.readonly"
-	//   ]
-	// }
-
-}
-
-// method id "genomics.variantsets.update":
-
-type VariantsetsUpdateCall struct {
-	s            *Service
-	variantSetId string
-	variantset   *VariantSet
-	opt_         map[string]interface{}
-}
-
-// Update: Updates a variant set's metadata. All other modifications are
-// silently ignored.
-func (r *VariantsetsService) Update(variantSetId string, variantset *VariantSet) *VariantsetsUpdateCall {
-	c := &VariantsetsUpdateCall{s: r.s, opt_: make(map[string]interface{})}
-	c.variantSetId = variantSetId
-	c.variantset = variantset
-	return c
-}
-
-// Fields allows partial responses to be retrieved.
-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *VariantsetsUpdateCall) Fields(s ...googleapi.Field) *VariantsetsUpdateCall {
-	c.opt_["fields"] = googleapi.CombineFields(s)
-	return c
-}
-
-func (c *VariantsetsUpdateCall) Do() (*VariantSet, error) {
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variantset)
-	if err != nil {
-		return nil, err
-	}
-	ctype := "application/json"
-	params := make(url.Values)
-	params.Set("alt", "json")
-	if v, ok := c.opt_["fields"]; ok {
-		params.Set("fields", fmt.Sprintf("%v", v))
-	}
-	urls := googleapi.ResolveRelative(c.s.BasePath, "variantsets/{variantSetId}")
-	urls += "?" + params.Encode()
-	req, _ := http.NewRequest("PUT", urls, body)
-	googleapi.Expand(req.URL, map[string]string{
-		"variantSetId": c.variantSetId,
-	})
-	req.Header.Set("Content-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 googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	var ret *VariantSet
-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Updates a variant set's metadata. All other modifications are silently ignored.",
-	//   "httpMethod": "PUT",
-	//   "id": "genomics.variantsets.update",
-	//   "parameterOrder": [
-	//     "variantSetId"
-	//   ],
-	//   "parameters": {
-	//     "variantSetId": {
-	//       "description": "The ID of the variant to be updated.",
-	//       "location": "path",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "variantsets/{variantSetId}",
-	//   "request": {
-	//     "$ref": "VariantSet"
-	//   },
-	//   "response": {
-	//     "$ref": "VariantSet"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/genomics"
-	//   ]
-	// }
-
-}
diff --git a/genomics/v1beta2/genomics-api.json b/genomics/v1beta2/genomics-api.json
index c9803e7..2373661 100644
--- a/genomics/v1beta2/genomics-api.json
+++ b/genomics/v1beta2/genomics-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/Rkk_7Yu2BNIHc2z3p4FKuem23zE\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/u10WbWL3P9lxZaZ0H6MJ8QBvqKA\"",
  "discoveryVersion": "v1",
  "id": "genomics:v1beta2",
  "name": "genomics",
  "version": "v1beta2",
- "revision": "20150213",
+ "revision": "20150317",
  "title": "Genomics API",
  "description": "Provides access to Genomics data.",
  "ownerDomain": "google.com",
@@ -129,7 +129,7 @@
   "Annotation": {
    "id": "Annotation",
    "type": "object",
-   "description": "An annotation describes a region of reference genome. The value of an annotation may be one of several canonical types, supplemented by arbitrary info tags. A variant annotation is represented by one or more of these canonical types. An annotation is not inherently associated with a specific sample/individual (though a client could choose to use annotations in this way). Example canonical annotation types are 'Gene' and 'Variant'.",
+   "description": "An annotation describes a region of reference genome. The value of an annotation may be one of several canonical types, supplemented by arbitrary info tags. A variant annotation is represented by one or more of these canonical types. An annotation is not inherently associated with a specific sample or individual (though a client could choose to use annotations in this way). Example canonical annotation types are 'Gene' and 'Variant'.",
    "properties": {
     "annotationSetId": {
      "type": "string",
@@ -160,7 +160,7 @@
     },
     "transcript": {
      "$ref": "Transcript",
-     "description": "A transcript value represents the assertion that a particular region of the reference genome may be transcribed as RNA. An alternate splicing pattern would be represented as separate transcript object. This field is only set for annotations of type TRANSCRIPT."
+     "description": "A transcript value represents the assertion that a particular region of the reference genome may be transcribed as RNA. An alternative splicing pattern would be represented as a separate transcript object. This field is only set for annotations of type TRANSCRIPT."
     },
     "type": {
      "type": "string",
@@ -180,14 +180,14 @@
     },
     "variant": {
      "$ref": "VariantAnnotation",
-     "description": "A variant annotation which describes the effect of a variant on the genome, the coding sequence, and/or higher level consequences at the organism level e.g. pathogenicity. This field is only set for annotations of type VARIANT."
+     "description": "A variant annotation, which describes the effect of a variant on the genome, the coding sequence, and/or higher level consequences at the organism level e.g. pathogenicity. This field is only set for annotations of type VARIANT."
     }
    }
   },
   "AnnotationSet": {
    "id": "AnnotationSet",
    "type": "object",
-   "description": "An annotation set is a logical grouping of annotations which share consistent type information and provenance. An example would be 'all genes from refseq', or 'all variant annotations from ClinVar'.",
+   "description": "An annotation set is a logical grouping of annotations that share consistent type information and provenance. Examples of annotation sets include 'all genes from refseq', and 'all variant annotations from ClinVar'.",
    "properties": {
     "datasetId": {
      "type": "string",
@@ -214,7 +214,7 @@
     },
     "referenceSetId": {
      "type": "string",
-     "description": "The ID of the reference set which defines the coordinate-space for this set's annotations."
+     "description": "The ID of the reference set that defines the coordinate space for this set's annotations."
     },
     "sourceUri": {
      "type": "string",
@@ -238,6 +238,62 @@
     }
    }
   },
+  "BatchAnnotationsResponse": {
+   "id": "BatchAnnotationsResponse",
+   "type": "object",
+   "properties": {
+    "entries": {
+     "type": "array",
+     "description": "The resulting per-annotation entries, ordered consistently with the original request.",
+     "items": {
+      "$ref": "BatchAnnotationsResponseEntry"
+     }
+    }
+   }
+  },
+  "BatchAnnotationsResponseEntry": {
+   "id": "BatchAnnotationsResponseEntry",
+   "type": "object",
+   "properties": {
+    "annotation": {
+     "$ref": "Annotation",
+     "description": "The annotation, if any."
+    },
+    "status": {
+     "$ref": "BatchAnnotationsResponseEntryStatus",
+     "description": "The resulting status for this annotation operation."
+    }
+   }
+  },
+  "BatchAnnotationsResponseEntryStatus": {
+   "id": "BatchAnnotationsResponseEntryStatus",
+   "type": "object",
+   "description": "",
+   "properties": {
+    "code": {
+     "type": "integer",
+     "description": "The HTTP status code for this operation.",
+     "format": "int32"
+    },
+    "message": {
+     "type": "string",
+     "description": "Error message for this status, if any."
+    }
+   }
+  },
+  "BatchCreateAnnotationsRequest": {
+   "id": "BatchCreateAnnotationsRequest",
+   "type": "object",
+   "properties": {
+    "annotations": {
+     "type": "array",
+     "description": "The annotations to be created. At most 4096 can be specified in a single request.",
+     "items": {
+      "$ref": "Annotation"
+     }
+    }
+   }
+  },
   "Call": {
    "id": "Call",
    "type": "object",
@@ -496,7 +552,7 @@
    "properties": {
     "exportUri": {
      "type": "string",
-     "description": "A Google Cloud Storage URI where the exported BAM file will be created. The currently authenticated user must have write access to the new file location. An error will be returned if the URI already contains data."
+     "description": "A Google Cloud Storage URI for the exported BAM file. The currently authenticated user must have write access to the new file. An error will be returned if the URI already contains data."
     },
     "projectNumber": {
      "type": "string",
@@ -1428,7 +1484,7 @@
     },
     "description": {
      "type": "string",
-     "description": "Optional free text description of this reference set."
+     "description": "Free text description of this reference set."
     },
     "id": {
      "type": "string",
@@ -1493,7 +1549,7 @@
     },
     "types": {
      "type": "array",
-     "description": "If specified, only annotation sets which have any of these types are returned.",
+     "description": "If specified, only annotation sets that have any of these types are returned.",
      "items": {
       "type": "string",
       "enum": [
@@ -1551,7 +1607,7 @@
     },
     "range": {
      "$ref": "QueryRange",
-     "description": "If specified, this query matches only annotations which overlap this range."
+     "description": "If specified, this query matches only annotations that overlap this range."
     }
    }
   },
@@ -1709,7 +1765,7 @@
     },
     "pageSize": {
      "type": "integer",
-     "description": "Specifies number of results to return in a single page. If unspecified, it will default to 128. The maximum value is 1024.",
+     "description": "Specifies number of results to return in a single page. If unspecified, it will default to 256. The maximum value is 1024.",
      "format": "int32"
     },
     "pageToken": {
@@ -2023,7 +2079,7 @@
     },
     "exons": {
      "type": "array",
-     "description": "The exons which compose this transcript. Exons are the pieces of the transcript which are spliced together, may be exported from a cell's nucleus, and may then be translated to protein. This field should be unset for genomes where transcript splicing does not occur, for example prokaryotes.\n\n\nIntrons are regions of the transcript which are not included in the spliced RNA product. Though not explicitly modeled here, intron ranges can be deduced; all regions of this transcript which are not exons are introns.\n\n\nExonic sequences do not necessarily code for a translational product (amino acids). Only the regions of exons bounded by the codingSequence correspond to coding DNA sequence.\n\n\nExons are ordered by start position and may not overlap.",
+     "description": "The exons that compose this transcript. This field should be unset for genomes where transcript splicing does not occur, for example prokaryotes.\n\n\nIntrons are regions of the transcript that are not included in the spliced RNA product. Though not explicitly modeled here, intron ranges can be deduced; all regions of this transcript that are not exons are introns.\n\n\nExonic sequences do not necessarily code for a translational product (amino acids). Only the regions of exons bounded by the codingSequence correspond to coding DNA sequence.\n\n\nExons are ordered by start position and may not overlap.",
      "items": {
       "$ref": "TranscriptExon"
      }
@@ -2061,7 +2117,7 @@
     },
     "frame": {
      "$ref": "Int32Value",
-     "description": "The frame of this exon. Contains a value of 0, 1, or 2 which indicates the offset of the first coding base of the exon within the reading frame of the coding DNA sequence, if any. This field is dependent on the strandedness of this annotation (see Annotation.position.reverseStrand). For forward stranded annotations, this offset is relative to the exon.start. For reverse strand annotations, this offset is relative to the exon.end-1.\n\nUnset if this exon does not intersect the coding sequence. Upon creation of a transcript, the frame must be populated for all or none of the coding exons."
+     "description": "The frame of this exon. Contains a value of 0, 1, or 2, which indicates the offset of the first coding base of the exon within the reading frame of the coding DNA sequence, if any. This field is dependent on the strandedness of this annotation (see Annotation.position.reverseStrand). For forward stranded annotations, this offset is relative to the exon.start. For reverse strand annotations, this offset is relative to the exon.end-1.\n\nUnset if this exon does not intersect the coding sequence. Upon creation of a transcript, the frame must be populated for all or none of the coding exons."
     },
     "start": {
      "type": "string",
@@ -2236,7 +2292,7 @@
     },
     "transcriptIds": {
      "type": "array",
-     "description": "Google annotation ID of the transcripts affected by this variant. These should be provided when the variant is created.",
+     "description": "Google annotation IDs of the transcripts affected by this variant. These should be provided when the variant is created.",
      "items": {
       "type": "string"
      }
@@ -2278,7 +2334,7 @@
     },
     "externalIds": {
      "type": "array",
-     "description": "The set of external ids for this condition.",
+     "description": "The set of external IDs for this condition.",
      "items": {
       "$ref": "ExternalId"
      }
@@ -2418,7 +2474,7 @@
      "id": "genomics.annotationSets.search",
      "path": "annotationSets/search",
      "httpMethod": "POST",
-     "description": "Searches for annotation sets which match the given criteria. Results are returned in a deterministic order. Caller must have READ permission for the queried datasets.",
+     "description": "Searches for annotation sets that match the given criteria. Results are returned in a deterministic order. Caller must have READ permission for the queried datasets.",
      "request": {
       "$ref": "SearchAnnotationSetsRequest"
      },
@@ -2460,6 +2516,21 @@
   },
   "annotations": {
    "methods": {
+    "batchCreate": {
+     "id": "genomics.annotations.batchCreate",
+     "path": "annotations:batchCreate",
+     "httpMethod": "POST",
+     "description": "Creates one or more new annotations atomically. All annotations must belong to the same annotation set. Caller must have WRITE permission for this annotation set. For optimal performance, batch positionally adjacent annotations together.\n\n\nIf the request has a systemic issue, such as an attempt to write to an inaccessible annotation set, the entire RPC will fail accordingly. For lesser data issues, when possible an error will be isolated to the corresponding batch entry in the response; the remaining well formed annotations will be created normally.",
+     "request": {
+      "$ref": "BatchCreateAnnotationsRequest"
+     },
+     "response": {
+      "$ref": "BatchAnnotationsResponse"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/genomics"
+     ]
+    },
     "create": {
      "id": "genomics.annotations.create",
      "path": "annotations",
@@ -2549,7 +2620,7 @@
      "id": "genomics.annotations.search",
      "path": "annotations/search",
      "httpMethod": "POST",
-     "description": "Searches for annotations which match the given criteria. Results are returned ordered by start position. Annotations which have matching start positions are ordered deterministically. Caller must have READ permission for the queried annotation sets.",
+     "description": "Searches for annotations that match the given criteria. Results are returned ordered by start position. Annotations that have matching start positions are ordered deterministically. Caller must have READ permission for the queried annotation sets.",
      "request": {
       "$ref": "SearchAnnotationsRequest"
      },
@@ -2785,12 +2856,11 @@
      "id": "genomics.datasets.list",
      "path": "datasets",
      "httpMethod": "GET",
-     "description": "Lists all datasets.",
+     "description": "Lists datasets within a project.",
      "parameters": {
       "pageSize": {
        "type": "integer",
-       "description": "The maximum number of results returned by this request.",
-       "default": "50",
+       "description": "The maximum number of results returned by this request. If unspecified, defaults to 50.",
        "format": "int32",
        "location": "query"
       },
@@ -2801,7 +2871,7 @@
       },
       "projectNumber": {
        "type": "string",
-       "description": "Only return datasets which belong to this Google Developers Console project. Only accepts project numbers. Returns all public projects if no project number is specified.",
+       "description": "The project to list datasets for.",
        "format": "int64",
        "location": "query"
       }
@@ -3170,7 +3240,6 @@
         "pageSize": {
          "type": "integer",
          "description": "The maximum number of results to return in a single page. If unspecified, defaults to 1024. The maximum value is 2048.",
-         "default": "1024",
          "format": "int32",
          "location": "query"
         },
@@ -3305,7 +3374,6 @@
         "pageSize": {
          "type": "integer",
          "description": "Specifies the maximum number of bases to return in a single page.",
-         "default": "200000",
          "format": "int32",
          "location": "query"
         },
diff --git a/genomics/v1beta2/genomics-gen.go b/genomics/v1beta2/genomics-gen.go
index 4ac0f7c..4ffd8a8 100644
--- a/genomics/v1beta2/genomics-gen.go
+++ b/genomics/v1beta2/genomics-gen.go
@@ -77,8 +77,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	AnnotationSets *AnnotationSetsService
 
@@ -105,6 +106,13 @@
 	Variantsets *VariantsetsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAnnotationSetsService(s *Service) *AnnotationSetsService {
 	rs := &AnnotationSetsService{s: s}
 	return rs
@@ -306,7 +314,7 @@
 
 	// Transcript: A transcript value represents the assertion that a
 	// particular region of the reference genome may be transcribed as RNA.
-	// An alternate splicing pattern would be represented as separate
+	// An alternative splicing pattern would be represented as a separate
 	// transcript object. This field is only set for annotations of type
 	// TRANSCRIPT.
 	Transcript *Transcript `json:"transcript,omitempty"`
@@ -315,10 +323,10 @@
 	// annotation set's type.
 	Type string `json:"type,omitempty"`
 
-	// Variant: A variant annotation which describes the effect of a variant
-	// on the genome, the coding sequence, and/or higher level consequences
-	// at the organism level e.g. pathogenicity. This field is only set for
-	// annotations of type VARIANT.
+	// Variant: A variant annotation, which describes the effect of a
+	// variant on the genome, the coding sequence, and/or higher level
+	// consequences at the organism level e.g. pathogenicity. This field is
+	// only set for annotations of type VARIANT.
 	Variant *VariantAnnotation `json:"variant,omitempty"`
 }
 
@@ -335,8 +343,8 @@
 	// Name: The display name for this annotation set.
 	Name string `json:"name,omitempty"`
 
-	// ReferenceSetId: The ID of the reference set which defines the
-	// coordinate-space for this set's annotations.
+	// ReferenceSetId: The ID of the reference set that defines the
+	// coordinate space for this set's annotations.
 	ReferenceSetId string `json:"referenceSetId,omitempty"`
 
 	// SourceUri: The source URI describing the file from which this
@@ -347,6 +355,34 @@
 	Type string `json:"type,omitempty"`
 }
 
+type BatchAnnotationsResponse struct {
+	// Entries: The resulting per-annotation entries, ordered consistently
+	// with the original request.
+	Entries []*BatchAnnotationsResponseEntry `json:"entries,omitempty"`
+}
+
+type BatchAnnotationsResponseEntry struct {
+	// Annotation: The annotation, if any.
+	Annotation *Annotation `json:"annotation,omitempty"`
+
+	// Status: The resulting status for this annotation operation.
+	Status *BatchAnnotationsResponseEntryStatus `json:"status,omitempty"`
+}
+
+type BatchAnnotationsResponseEntryStatus struct {
+	// Code: The HTTP status code for this operation.
+	Code int64 `json:"code,omitempty"`
+
+	// Message: Error message for this status, if any.
+	Message string `json:"message,omitempty"`
+}
+
+type BatchCreateAnnotationsRequest struct {
+	// Annotations: The annotations to be created. At most 4096 can be
+	// specified in a single request.
+	Annotations []*Annotation `json:"annotations,omitempty"`
+}
+
 type Call struct {
 	// CallSetId: The ID of the call set this variant call belongs to.
 	CallSetId string `json:"callSetId,omitempty"`
@@ -506,10 +542,9 @@
 }
 
 type ExportReadGroupSetsRequest struct {
-	// ExportUri: A Google Cloud Storage URI where the exported BAM file
-	// will be created. The currently authenticated user must have write
-	// access to the new file location. An error will be returned if the URI
-	// already contains data.
+	// ExportUri: A Google Cloud Storage URI for the exported BAM file. The
+	// currently authenticated user must have write access to the new file.
+	// An error will be returned if the URI already contains data.
 	ExportUri string `json:"exportUri,omitempty"`
 
 	// ProjectNumber: The Google Developers Console project number that owns
@@ -1126,7 +1161,7 @@
 	// AssemblyId: Public id of this reference set, such as GRCh37.
 	AssemblyId string `json:"assemblyId,omitempty"`
 
-	// Description: Optional free text description of this reference set.
+	// Description: Free text description of this reference set.
 	Description string `json:"description,omitempty"`
 
 	// Id: The Google generated immutable ID of the reference set.
@@ -1183,7 +1218,7 @@
 	// the given reference set are returned.
 	ReferenceSetId string `json:"referenceSetId,omitempty"`
 
-	// Types: If specified, only annotation sets which have any of these
+	// Types: If specified, only annotation sets that have any of these
 	// types are returned.
 	Types []string `json:"types,omitempty"`
 }
@@ -1214,8 +1249,8 @@
 	// parameter to the value of nextPageToken from the previous response.
 	PageToken string `json:"pageToken,omitempty"`
 
-	// Range: If specified, this query matches only annotations which
-	// overlap this range.
+	// Range: If specified, this query matches only annotations that overlap
+	// this range.
 	Range *QueryRange `json:"range,omitempty"`
 }
 
@@ -1306,7 +1341,7 @@
 	Name string `json:"name,omitempty"`
 
 	// PageSize: Specifies number of results to return in a single page. If
-	// unspecified, it will default to 128. The maximum value is 1024.
+	// unspecified, it will default to 256. The maximum value is 1024.
 	PageSize int64 `json:"pageSize,omitempty"`
 
 	// PageToken: The continuation token, which is used to page through
@@ -1540,27 +1575,25 @@
 	// necessarily be concatenated to produce the original transcript mRNA.
 	CodingSequence *TranscriptCodingSequence `json:"codingSequence,omitempty"`
 
-	// Exons: The exons which compose this transcript. Exons are the pieces
-	// of the transcript which are spliced together, may be exported from a
-	// cell's nucleus, and may then be translated to protein. This field
-	// should be unset for genomes where transcript splicing does not occur,
-	// for example prokaryotes.
+	// Exons: The exons that compose this transcript. This field should be
+	// unset for genomes where transcript splicing does not occur, for
+	// example prokaryotes.
 	//
 	//
-	// Introns are regions of the transcript
-	// which are not included in the spliced RNA product. Though not
-	// explicitly modeled here, intron ranges can be deduced; all regions of
-	// this transcript which are not exons are introns.
+	// Introns are regions of the transcript that are
+	// not included in the spliced RNA product. Though not explicitly
+	// modeled here, intron ranges can be deduced; all regions of this
+	// transcript that are not exons are introns.
 	//
 	//
-	// Exonic sequences
-	// do not necessarily code for a translational product (amino acids).
-	// Only the regions of exons bounded by the codingSequence correspond to
-	// coding DNA sequence.
+	// Exonic sequences do not
+	// necessarily code for a translational product (amino acids). Only the
+	// regions of exons bounded by the codingSequence correspond to coding
+	// DNA sequence.
 	//
 	//
-	// Exons are ordered by start position and may
-	// not overlap.
+	// Exons are ordered by start position and may not
+	// overlap.
 	Exons []*TranscriptExon `json:"exons,omitempty"`
 
 	// GeneId: The annotation ID of the gene from which this transcript is
@@ -1587,7 +1620,7 @@
 	// reference start, and not the containing annotation start.
 	End int64 `json:"end,omitempty,string"`
 
-	// Frame: The frame of this exon. Contains a value of 0, 1, or 2 which
+	// Frame: The frame of this exon. Contains a value of 0, 1, or 2, which
 	// indicates the offset of the first coding base of the exon within the
 	// reading frame of the coding DNA sequence, if any. This field is
 	// dependent on the strandedness of this annotation (see
@@ -1683,7 +1716,7 @@
 	// This should be provided when the variant is created.
 	GeneId string `json:"geneId,omitempty"`
 
-	// TranscriptIds: Google annotation ID of the transcripts affected by
+	// TranscriptIds: Google annotation IDs of the transcripts affected by
 	// this variant. These should be provided when the variant is created.
 	TranscriptIds []string `json:"transcriptIds,omitempty"`
 
@@ -1696,7 +1729,7 @@
 	// for these IDs at http://www.ncbi.nlm.nih.gov/medgen/
 	ConceptId string `json:"conceptId,omitempty"`
 
-	// ExternalIds: The set of external ids for this condition.
+	// ExternalIds: The set of external IDs for this condition.
 	ExternalIds []*ExternalId `json:"externalIds,omitempty"`
 
 	// Names: A set of names for the condition.
@@ -1763,7 +1796,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1832,7 +1865,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"annotationSetId": c.annotationSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1902,7 +1935,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"annotationSetId": c.annotationSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1990,7 +2023,7 @@
 		"annotationSetId": c.annotationSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2041,7 +2074,7 @@
 	opt_                        map[string]interface{}
 }
 
-// Search: Searches for annotation sets which match the given criteria.
+// Search: Searches for annotation sets that match the given criteria.
 // Results are returned in a deterministic order. Caller must have READ
 // permission for the queried datasets.
 func (r *AnnotationSetsService) Search(searchannotationsetsrequest *SearchAnnotationSetsRequest) *AnnotationSetsSearchCall {
@@ -2075,7 +2108,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2090,7 +2123,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Searches for annotation sets which match the given criteria. Results are returned in a deterministic order. Caller must have READ permission for the queried datasets.",
+	//   "description": "Searches for annotation sets that match the given criteria. Results are returned in a deterministic order. Caller must have READ permission for the queried datasets.",
 	//   "httpMethod": "POST",
 	//   "id": "genomics.annotationSets.search",
 	//   "path": "annotationSets/search",
@@ -2155,7 +2188,7 @@
 		"annotationSetId": c.annotationSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2198,6 +2231,89 @@
 
 }
 
+// method id "genomics.annotations.batchCreate":
+
+type AnnotationsBatchCreateCall struct {
+	s                             *Service
+	batchcreateannotationsrequest *BatchCreateAnnotationsRequest
+	opt_                          map[string]interface{}
+}
+
+// BatchCreate: Creates one or more new annotations atomically. All
+// annotations must belong to the same annotation set. Caller must have
+// WRITE permission for this annotation set. For optimal performance,
+// batch positionally adjacent annotations together.
+//
+//
+// If the request
+// has a systemic issue, such as an attempt to write to an inaccessible
+// annotation set, the entire RPC will fail accordingly. For lesser data
+// issues, when possible an error will be isolated to the corresponding
+// batch entry in the response; the remaining well formed annotations
+// will be created normally.
+func (r *AnnotationsService) BatchCreate(batchcreateannotationsrequest *BatchCreateAnnotationsRequest) *AnnotationsBatchCreateCall {
+	c := &AnnotationsBatchCreateCall{s: r.s, opt_: make(map[string]interface{})}
+	c.batchcreateannotationsrequest = batchcreateannotationsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved.
+// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AnnotationsBatchCreateCall) Fields(s ...googleapi.Field) *AnnotationsBatchCreateCall {
+	c.opt_["fields"] = googleapi.CombineFields(s)
+	return c
+}
+
+func (c *AnnotationsBatchCreateCall) Do() (*BatchAnnotationsResponse, error) {
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchcreateannotationsrequest)
+	if err != nil {
+		return nil, err
+	}
+	ctype := "application/json"
+	params := make(url.Values)
+	params.Set("alt", "json")
+	if v, ok := c.opt_["fields"]; ok {
+		params.Set("fields", fmt.Sprintf("%v", v))
+	}
+	urls := googleapi.ResolveRelative(c.s.BasePath, "annotations:batchCreate")
+	urls += "?" + params.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	googleapi.SetOpaque(req.URL)
+	req.Header.Set("Content-Type", ctype)
+	req.Header.Set("User-Agent", c.s.userAgent())
+	res, err := c.s.client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	var ret *BatchAnnotationsResponse
+	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Creates one or more new annotations atomically. All annotations must belong to the same annotation set. Caller must have WRITE permission for this annotation set. For optimal performance, batch positionally adjacent annotations together.\n\n\nIf the request has a systemic issue, such as an attempt to write to an inaccessible annotation set, the entire RPC will fail accordingly. For lesser data issues, when possible an error will be isolated to the corresponding batch entry in the response; the remaining well formed annotations will be created normally.",
+	//   "httpMethod": "POST",
+	//   "id": "genomics.annotations.batchCreate",
+	//   "path": "annotations:batchCreate",
+	//   "request": {
+	//     "$ref": "BatchCreateAnnotationsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "BatchAnnotationsResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/genomics"
+	//   ]
+	// }
+
+}
+
 // method id "genomics.annotations.create":
 
 type AnnotationsCreateCall struct {
@@ -2239,7 +2355,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2308,7 +2424,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"annotationId": c.annotationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2378,7 +2494,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"annotationId": c.annotationId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2466,7 +2582,7 @@
 		"annotationId": c.annotationId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2517,10 +2633,10 @@
 	opt_                     map[string]interface{}
 }
 
-// Search: Searches for annotations which match the given criteria.
-// Results are returned ordered by start position. Annotations which
-// have matching start positions are ordered deterministically. Caller
-// must have READ permission for the queried annotation sets.
+// Search: Searches for annotations that match the given criteria.
+// Results are returned ordered by start position. Annotations that have
+// matching start positions are ordered deterministically. Caller must
+// have READ permission for the queried annotation sets.
 func (r *AnnotationsService) Search(searchannotationsrequest *SearchAnnotationsRequest) *AnnotationsSearchCall {
 	c := &AnnotationsSearchCall{s: r.s, opt_: make(map[string]interface{})}
 	c.searchannotationsrequest = searchannotationsrequest
@@ -2552,7 +2668,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2567,7 +2683,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Searches for annotations which match the given criteria. Results are returned ordered by start position. Annotations which have matching start positions are ordered deterministically. Caller must have READ permission for the queried annotation sets.",
+	//   "description": "Searches for annotations that match the given criteria. Results are returned ordered by start position. Annotations that have matching start positions are ordered deterministically. Caller must have READ permission for the queried annotation sets.",
 	//   "httpMethod": "POST",
 	//   "id": "genomics.annotations.search",
 	//   "path": "annotations/search",
@@ -2632,7 +2748,7 @@
 		"annotationId": c.annotationId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2715,7 +2831,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2783,7 +2899,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"callSetId": c.callSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2852,7 +2968,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"callSetId": c.callSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2937,7 +3053,7 @@
 		"callSetId": c.callSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3023,7 +3139,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3100,7 +3216,7 @@
 		"callSetId": c.callSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3183,7 +3299,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3251,7 +3367,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"datasetId": c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3320,7 +3436,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"datasetId": c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3368,14 +3484,14 @@
 	opt_ map[string]interface{}
 }
 
-// List: Lists all datasets.
+// List: Lists datasets within a project.
 func (r *DatasetsService) List() *DatasetsListCall {
 	c := &DatasetsListCall{s: r.s, opt_: make(map[string]interface{})}
 	return c
 }
 
 // PageSize sets the optional parameter "pageSize": The maximum number
-// of results returned by this request.
+// of results returned by this request. If unspecified, defaults to 50.
 func (c *DatasetsListCall) PageSize(pageSize int64) *DatasetsListCall {
 	c.opt_["pageSize"] = pageSize
 	return c
@@ -3390,10 +3506,8 @@
 	return c
 }
 
-// ProjectNumber sets the optional parameter "projectNumber": Only
-// return datasets which belong to this Google Developers Console
-// project. Only accepts project numbers. Returns all public projects if
-// no project number is specified.
+// ProjectNumber sets the optional parameter "projectNumber": The
+// project to list datasets for.
 func (c *DatasetsListCall) ProjectNumber(projectNumber int64) *DatasetsListCall {
 	c.opt_["projectNumber"] = projectNumber
 	return c
@@ -3427,7 +3541,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3442,13 +3556,12 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Lists all datasets.",
+	//   "description": "Lists datasets within a project.",
 	//   "httpMethod": "GET",
 	//   "id": "genomics.datasets.list",
 	//   "parameters": {
 	//     "pageSize": {
-	//       "default": "50",
-	//       "description": "The maximum number of results returned by this request.",
+	//       "description": "The maximum number of results returned by this request. If unspecified, defaults to 50.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
@@ -3459,7 +3572,7 @@
 	//       "type": "string"
 	//     },
 	//     "projectNumber": {
-	//       "description": "Only return datasets which belong to this Google Developers Console project. Only accepts project numbers. Returns all public projects if no project number is specified.",
+	//       "description": "The project to list datasets for.",
 	//       "format": "int64",
 	//       "location": "query",
 	//       "type": "string"
@@ -3521,7 +3634,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3602,7 +3715,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"datasetId": c.datasetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3686,7 +3799,7 @@
 		"datasetId": c.datasetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3770,7 +3883,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3840,7 +3953,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"jobId": c.jobId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3909,7 +4022,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"jobId": c.jobId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3990,7 +4103,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4065,7 +4178,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4140,7 +4253,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4209,7 +4322,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"readGroupSetId": c.readGroupSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4289,7 +4402,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4358,7 +4471,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"readGroupSetId": c.readGroupSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4445,7 +4558,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4523,7 +4636,7 @@
 		"readGroupSetId": c.readGroupSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4609,7 +4722,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4686,7 +4799,7 @@
 		"readGroupSetId": c.readGroupSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4845,7 +4958,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"readGroupSetId": c.readGroupSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4868,7 +4981,6 @@
 	//   ],
 	//   "parameters": {
 	//     "pageSize": {
-	//       "default": "1024",
 	//       "description": "The maximum number of results to return in a single page. If unspecified, defaults to 1024. The maximum value is 2048.",
 	//       "format": "int32",
 	//       "location": "query",
@@ -4977,7 +5089,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5048,7 +5160,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"referenceId": c.referenceId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5132,7 +5244,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5246,7 +5358,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"referenceId": c.referenceId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5275,7 +5387,6 @@
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "default": "200000",
 	//       "description": "Specifies the maximum number of bases to return in a single page.",
 	//       "format": "int32",
 	//       "location": "query",
@@ -5350,7 +5461,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"referenceSetId": c.referenceSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5434,7 +5545,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5507,7 +5618,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5575,7 +5686,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"variantId": c.variantId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5644,7 +5755,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"variantId": c.variantId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5728,7 +5839,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5807,7 +5918,7 @@
 		"variantId": c.variantId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5887,7 +5998,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"variantSetId": c.variantSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5964,7 +6075,7 @@
 		"variantSetId": c.variantSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6044,7 +6155,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"variantSetId": c.variantSetId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6139,7 +6250,7 @@
 		"variantSetId": c.variantSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6235,7 +6346,7 @@
 		"variantSetId": c.variantSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6316,7 +6427,7 @@
 		"variantSetId": c.variantSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6402,7 +6513,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6480,7 +6591,7 @@
 		"variantSetId": c.variantSetId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/gmail/v1/gmail-api.json b/gmail/v1/gmail-api.json
index c551cac..be0cc18 100644
--- a/gmail/v1/gmail-api.json
+++ b/gmail/v1/gmail-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/Z8EmGyPlhp7KjhJWnQbLacCZ3G8\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/5025FW69eRcOdd_mm4_PTDhGzHE\"",
  "discoveryVersion": "v1",
  "id": "gmail:v1",
  "name": "gmail",
  "version": "v1",
- "revision": "20150218",
+ "revision": "20150313",
  "title": "Gmail API",
  "description": "The Gmail REST API.",
  "ownerDomain": "google.com",
@@ -1333,6 +1333,12 @@
        "httpMethod": "POST",
        "description": "Directly inserts a message into only this user's mailbox similar to IMAP APPEND, bypassing most scanning and classification. Does not send a message.",
        "parameters": {
+        "deleted": {
+         "type": "boolean",
+         "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Apps Vault to a Vault administrator. Only used for Google Apps for Work accounts.",
+         "default": "false",
+         "location": "query"
+        },
         "internalDateSource": {
          "type": "string",
          "description": "Source for Gmail's internal date of the message.",
diff --git a/gmail/v1/gmail-gen.go b/gmail/v1/gmail-gen.go
index 5cfbcf3..3a17269 100644
--- a/gmail/v1/gmail-gen.go
+++ b/gmail/v1/gmail-gen.go
@@ -66,12 +66,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Users *UsersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewUsersService(s *Service) *UsersService {
 	rs := &UsersService{s: s}
 	rs.Drafts = NewUsersDraftsService(s)
@@ -472,7 +480,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -619,7 +627,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -632,6 +640,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -738,7 +747,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -830,7 +839,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -955,7 +964,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1115,7 +1124,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1128,6 +1137,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -1300,7 +1310,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1313,6 +1323,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -1473,7 +1484,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1583,7 +1594,7 @@
 		"userId": c.userId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1668,7 +1679,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1749,7 +1760,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1835,7 +1846,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1926,7 +1937,7 @@
 		"id":     c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2025,7 +2036,7 @@
 		"id":     c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2117,7 +2128,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2217,7 +2228,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2440,7 +2451,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2453,6 +2464,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2574,6 +2586,15 @@
 	return c
 }
 
+// Deleted sets the optional parameter "deleted": Mark the email as
+// permanently deleted (not TRASH) and only visible in Google Apps Vault
+// to a Vault administrator. Only used for Google Apps for Work
+// accounts.
+func (c *UsersMessagesInsertCall) Deleted(deleted bool) *UsersMessagesInsertCall {
+	c.opt_["deleted"] = deleted
+	return c
+}
+
 // InternalDateSource sets the optional parameter "internalDateSource":
 // Source for Gmail's internal date of the message.
 func (c *UsersMessagesInsertCall) InternalDateSource(internalDateSource string) *UsersMessagesInsertCall {
@@ -2626,6 +2647,9 @@
 	ctype := "application/json"
 	params := make(url.Values)
 	params.Set("alt", "json")
+	if v, ok := c.opt_["deleted"]; ok {
+		params.Set("deleted", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["internalDateSource"]; ok {
 		params.Set("internalDateSource", fmt.Sprintf("%v", v))
 	}
@@ -2665,7 +2689,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2678,6 +2702,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2719,6 +2744,12 @@
 	//     "userId"
 	//   ],
 	//   "parameters": {
+	//     "deleted": {
+	//       "default": "false",
+	//       "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Apps Vault to a Vault administrator. Only used for Google Apps for Work accounts.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
 	//     "internalDateSource": {
 	//       "default": "receivedTime",
 	//       "description": "Source for Gmail's internal date of the message.",
@@ -2844,7 +2875,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2963,7 +2994,7 @@
 		"id":     c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3119,7 +3150,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3132,6 +3163,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -3237,7 +3269,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3325,7 +3357,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3416,7 +3448,7 @@
 		"messageId": c.messageId,
 		"id":        c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3513,7 +3545,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3613,7 +3645,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3772,7 +3804,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3892,7 +3924,7 @@
 		"id":     c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3983,7 +4015,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4071,7 +4103,7 @@
 		"userId": c.userId,
 		"id":     c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/google-api-go-generator/gen.go b/google-api-go-generator/gen.go
index 4120195..195eb7a 100644
--- a/google-api-go-generator/gen.go
+++ b/google-api-go-generator/gen.go
@@ -24,9 +24,6 @@
 	"unicode"
 )
 
-// goGenVersion is the version of the Go code generator
-const goGenVersion = "0.5"
-
 var (
 	apiToGenerate = flag.String("api", "*", "The API ID to generate, like 'tasks:v1'. A value of '*' means all.")
 	useCache      = flag.Bool("cache", true, "Use cache of discovered Google API discovery documents.")
@@ -468,11 +465,16 @@
 	p("\ntype Service struct {\n")
 	p("\tclient *http.Client\n")
 	p("\tBasePath string // API endpoint base URL\n")
+	pn("\tUserAgent string // optional additional User-Agent fragment")
 
 	for _, res := range reslist {
 		p("\n\t%s\t*%s\n", res.GoField(), res.GoType())
 	}
 	p("}\n")
+	pn("\nfunc (s *Service) userAgent() string {")
+	pn(` if s.UserAgent == "" { return googleapi.UserAgent }`)
+	pn(` return googleapi.UserAgent + " " + s.UserAgent`)
+	pn("}\n")
 
 	for _, res := range reslist {
 		res.generateType()
@@ -1370,7 +1372,7 @@
 	} else if hasContentType {
 		pn(`req.Header.Set("Content-Type", ctype)`)
 	}
-	pn(`req.Header.Set("User-Agent", "google-api-go-client/` + goGenVersion + `")`)
+	pn(`req.Header.Set("User-Agent", c.s.userAgent())`)
 	pn("res, err := c.s.client.Do(req);")
 	pn("if err != nil { return %serr }", nilRet)
 	pn("defer googleapi.CloseBody(res)")
@@ -1380,6 +1382,7 @@
 		pn(` loc := res.Header.Get("Location")`)
 		pn(" rx := &googleapi.ResumableUpload{")
 		pn("  Client:        c.s.client,")
+		pn("  UserAgent:     c.s.userAgent(),")
 		pn("  URI:           loc,")
 		pn("  Media:         c.resumable_,")
 		pn("  MediaType:     c.mediaType_,")
diff --git a/google-api-go-generator/storage_test.go b/google-api-go-generator/storage_test.go
index 797e9ee..fe4ea5c 100644
--- a/google-api-go-generator/storage_test.go
+++ b/google-api-go-generator/storage_test.go
@@ -226,3 +226,34 @@
 		t.Errorf("RequestURI = %q; want %q", g.RequestURI, w)
 	}
 }
+
+func TestUserAgent(t *testing.T) {
+	handler := &myHandler{}
+	server := httptest.NewServer(handler)
+	defer server.Close()
+
+	client := &http.Client{}
+	s, err := storage.New(client)
+	if err != nil {
+		t.Fatalf("unable to create service: %v", err)
+	}
+	s.BasePath = server.URL
+	s.UserAgent = "myagent/1.0"
+
+	f := bytes.NewBufferString("fake media data")
+	o := &storage.Object{
+		Bucket:          "mybucket",
+		Name:            "filename",
+		ContentType:     "plain/text",
+		ContentEncoding: "utf-8",
+		ContentLanguage: "en",
+	}
+	_, err = s.Objects.Insert("mybucket", o).Media(f).Do()
+	if err != nil {
+		t.Fatalf("unable to insert object: %v", err)
+	}
+	g := handler.r
+	if w, k := "google-api-go-client/0.5 myagent/1.0", "User-Agent"; len(g.Header[k]) != 1 || g.Header[k][0] != w {
+		t.Errorf("header %q = %#v; want %q", k, g.Header[k], w)
+	}
+}
diff --git a/google-api-go-generator/testdata/arrayofarray-1.want b/google-api-go-generator/testdata/arrayofarray-1.want
index 57cff00..a1c0cf3 100644
--- a/google-api-go-generator/testdata/arrayofarray-1.want
+++ b/google-api-go-generator/testdata/arrayofarray-1.want
@@ -48,8 +48,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type GeoJsonMultiPolygon struct {
diff --git a/google-api-go-generator/testdata/arrayofmapofobjects.want b/google-api-go-generator/testdata/arrayofmapofobjects.want
index 77c0557..348f0d8 100644
--- a/google-api-go-generator/testdata/arrayofmapofobjects.want
+++ b/google-api-go-generator/testdata/arrayofmapofobjects.want
@@ -48,8 +48,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type Analyze struct {
diff --git a/google-api-go-generator/testdata/arrayofmapofstrings.want b/google-api-go-generator/testdata/arrayofmapofstrings.want
index f6feee9..3d61eae 100644
--- a/google-api-go-generator/testdata/arrayofmapofstrings.want
+++ b/google-api-go-generator/testdata/arrayofmapofstrings.want
@@ -48,8 +48,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type Analyze struct {
diff --git a/google-api-go-generator/testdata/blogger-3.want b/google-api-go-generator/testdata/blogger-3.want
index 9202163..feb4057 100644
--- a/google-api-go-generator/testdata/blogger-3.want
+++ b/google-api-go-generator/testdata/blogger-3.want
@@ -67,8 +67,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BlogUserInfos *BlogUserInfosService
 
@@ -87,6 +88,13 @@
 	Users *UsersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBlogUserInfosService(s *Service) *BlogUserInfosService {
 	rs := &BlogUserInfosService{s: s}
 	return rs
@@ -697,7 +705,7 @@
 		"userId": c.userId,
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -797,7 +805,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -879,7 +887,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -976,7 +984,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1078,7 +1086,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1174,7 +1182,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1263,7 +1271,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1425,7 +1433,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1619,7 +1627,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1730,7 +1738,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1826,7 +1834,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1925,7 +1933,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2019,7 +2027,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2107,7 +2115,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2213,7 +2221,7 @@
 		"blogId": c.blogId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2321,7 +2329,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2443,7 +2451,7 @@
 		"pageId": c.pageId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2540,7 +2548,7 @@
 		"pageId": c.pageId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2642,7 +2650,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2830,7 +2838,7 @@
 		"userId": c.userId,
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2993,7 +3001,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3091,7 +3099,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3217,7 +3225,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3339,7 +3347,7 @@
 		"blogId": c.blogId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3522,7 +3530,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3692,7 +3700,7 @@
 		"postId": c.postId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3791,7 +3799,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3883,7 +3891,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3990,7 +3998,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4105,7 +4113,7 @@
 		"postId": c.postId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4191,7 +4199,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/google-api-go-generator/testdata/getwithoutbody.want b/google-api-go-generator/testdata/getwithoutbody.want
index 3bc29d4..585b648 100644
--- a/google-api-go-generator/testdata/getwithoutbody.want
+++ b/google-api-go-generator/testdata/getwithoutbody.want
@@ -49,12 +49,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	MetricDescriptors *MetricDescriptorsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewMetricDescriptorsService(s *Service) *MetricDescriptorsService {
 	rs := &MetricDescriptorsService{s: s}
 	return rs
@@ -146,7 +154,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/google-api-go-generator/testdata/mapofany.want b/google-api-go-generator/testdata/mapofany.want
index 08d5756..79ca6ed 100644
--- a/google-api-go-generator/testdata/mapofany.want
+++ b/google-api-go-generator/testdata/mapofany.want
@@ -48,8 +48,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type JsonValue interface{}
diff --git a/google-api-go-generator/testdata/mapofarrayofobjects.want b/google-api-go-generator/testdata/mapofarrayofobjects.want
index c079936..b2fa381 100644
--- a/google-api-go-generator/testdata/mapofarrayofobjects.want
+++ b/google-api-go-generator/testdata/mapofarrayofobjects.want
@@ -49,12 +49,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Atlas *AtlasService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAtlasService(s *Service) *AtlasService {
 	rs := &AtlasService{s: s}
 	return rs
@@ -111,7 +119,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/google-api-go-generator/testdata/mapofobjects.want b/google-api-go-generator/testdata/mapofobjects.want
index 7b36af8..8db3828 100644
--- a/google-api-go-generator/testdata/mapofobjects.want
+++ b/google-api-go-generator/testdata/mapofobjects.want
@@ -48,8 +48,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type Entity struct {
diff --git a/google-api-go-generator/testdata/mapofstrings-1.want b/google-api-go-generator/testdata/mapofstrings-1.want
index 8513d81..ec66436 100644
--- a/google-api-go-generator/testdata/mapofstrings-1.want
+++ b/google-api-go-generator/testdata/mapofstrings-1.want
@@ -49,12 +49,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Atlas *AtlasService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAtlasService(s *Service) *AtlasService {
 	rs := &AtlasService{s: s}
 	return rs
@@ -111,7 +119,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/google-api-go-generator/testdata/quotednum.want b/google-api-go-generator/testdata/quotednum.want
index 060aed2..77b36ae 100644
--- a/google-api-go-generator/testdata/quotednum.want
+++ b/google-api-go-generator/testdata/quotednum.want
@@ -56,8 +56,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type Creative struct {
diff --git a/google-api-go-generator/testdata/resource-named-service.want b/google-api-go-generator/testdata/resource-named-service.want
index 918382e..b50e72a 100644
--- a/google-api-go-generator/testdata/resource-named-service.want
+++ b/google-api-go-generator/testdata/resource-named-service.want
@@ -67,8 +67,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BlogUserInfos *BlogUserInfosService
 
@@ -87,6 +88,13 @@
 	Users *UsersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBlogUserInfosService(s *Service) *BlogUserInfosService {
 	rs := &BlogUserInfosService{s: s}
 	return rs
@@ -697,7 +705,7 @@
 		"userId": c.userId,
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -797,7 +805,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -879,7 +887,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -976,7 +984,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1078,7 +1086,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1174,7 +1182,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1263,7 +1271,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1425,7 +1433,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1619,7 +1627,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1730,7 +1738,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1826,7 +1834,7 @@
 		"postId":    c.postId,
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1925,7 +1933,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2019,7 +2027,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2107,7 +2115,7 @@
 		"blogId": c.blogId,
 		"pageId": c.pageId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2213,7 +2221,7 @@
 		"blogId": c.blogId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2321,7 +2329,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2443,7 +2451,7 @@
 		"pageId": c.pageId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2540,7 +2548,7 @@
 		"pageId": c.pageId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2642,7 +2650,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2830,7 +2838,7 @@
 		"userId": c.userId,
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2993,7 +3001,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3091,7 +3099,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3217,7 +3225,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3339,7 +3347,7 @@
 		"blogId": c.blogId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3522,7 +3530,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3692,7 +3700,7 @@
 		"postId": c.postId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3791,7 +3799,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3883,7 +3891,7 @@
 		"blogId": c.blogId,
 		"postId": c.postId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3990,7 +3998,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"blogId": c.blogId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4105,7 +4113,7 @@
 		"postId": c.postId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4191,7 +4199,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/google-api-go-generator/testdata/variants.want b/google-api-go-generator/testdata/variants.want
index 14694c4..0037e38 100644
--- a/google-api-go-generator/testdata/variants.want
+++ b/google-api-go-generator/testdata/variants.want
@@ -48,8 +48,16 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
 }
 
 type GeoJsonGeometry map[string]interface{}
diff --git a/googleapi/googleapi.go b/googleapi/googleapi.go
index 6511b3d..0565972 100644
--- a/googleapi/googleapi.go
+++ b/googleapi/googleapi.go
@@ -48,8 +48,8 @@
 	// statusResumeIncomplete is the code returned by the Google uploader when the transfer is not yet complete.
 	statusResumeIncomplete = 308
 
-	// userAgent is the header string used to identify itself to the Google uploader.
-	userAgent = "google-api-go-client/" + Version
+	// UserAgent is the header string used to identify this package.
+	UserAgent = "google-api-go-client/" + Version
 
 	// uploadPause determines the delay between failed upload attempts
 	uploadPause = 1 * time.Second
@@ -279,7 +279,8 @@
 type ResumableUpload struct {
 	Client *http.Client
 	// URI is the resumable resource destination provided by the server after specifying "&uploadType=resumable".
-	URI string
+	URI       string
+	UserAgent string // User-Agent for header of the request
 	// Media is the object being uploaded.
 	Media io.ReaderAt
 	// MediaType defines the media type, e.g. "image/jpeg".
@@ -312,7 +313,7 @@
 func (rx *ResumableUpload) transferStatus() (int64, *http.Response, error) {
 	req, _ := http.NewRequest("POST", rx.URI, nil)
 	req.ContentLength = 0
-	req.Header.Set("User-Agent", userAgent)
+	req.Header.Set("User-Agent", rx.UserAgent)
 	req.Header.Set("Content-Range", fmt.Sprintf("bytes */%v", rx.ContentLength))
 	res, err := rx.Client.Do(req)
 	if err != nil || res.StatusCode != statusResumeIncomplete {
@@ -357,7 +358,7 @@
 		req.ContentLength = reqSize
 		req.Header.Set("Content-Range", fmt.Sprintf("bytes %v-%v/%v", start, start+reqSize-1, rx.ContentLength))
 		req.Header.Set("Content-Type", rx.MediaType)
-		req.Header.Set("User-Agent", userAgent)
+		req.Header.Set("User-Agent", rx.UserAgent)
 		res, err = rx.Client.Do(req)
 		start += reqSize
 		if err == nil && (res.StatusCode == statusResumeIncomplete || res.StatusCode == http.StatusOK) {
diff --git a/groupsmigration/v1/groupsmigration-api.json b/groupsmigration/v1/groupsmigration-api.json
index 81211bf..0b6a2da 100644
--- a/groupsmigration/v1/groupsmigration-api.json
+++ b/groupsmigration/v1/groupsmigration-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"FrPV2U6xXFUq8eRv_PO3IoAURkc/uMvgRqCygYBIh2d3lXb4f8cUWOw\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/8sBrpk7dyPsmoiW1fArUb0ZoCGY\"",
  "discoveryVersion": "v1",
  "id": "groupsmigration:v1",
  "name": "groupsmigration",
@@ -67,6 +67,15 @@
    "location": "query"
   }
  },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/apps.groups.migration": {
+     "description": "Manage messages in groups on your domain"
+    }
+   }
+  }
+ },
  "schemas": {
   "Groups": {
    "id": "Groups",
@@ -107,6 +116,9 @@
      "response": {
       "$ref": "Groups"
      },
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.groups.migration"
+     ],
      "supportsMediaUpload": true,
      "mediaUpload": {
       "accept": [
diff --git a/groupsmigration/v1/groupsmigration-gen.go b/groupsmigration/v1/groupsmigration-gen.go
index 7315a19..caf56a2 100644
--- a/groupsmigration/v1/groupsmigration-gen.go
+++ b/groupsmigration/v1/groupsmigration-gen.go
@@ -41,6 +41,12 @@
 const apiVersion = "v1"
 const basePath = "https://www.googleapis.com/groups/v1/groups/"
 
+// OAuth2 scopes used by this API.
+const (
+	// Manage messages in groups on your domain
+	AppsGroupsMigrationScope = "https://www.googleapis.com/auth/apps.groups.migration"
+)
+
 func New(client *http.Client) (*Service, error) {
 	if client == nil {
 		return nil, errors.New("client is nil")
@@ -51,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Archive *ArchiveService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewArchiveService(s *Service) *ArchiveService {
 	rs := &ArchiveService{s: s}
 	return rs
@@ -172,7 +186,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -185,6 +199,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -237,6 +252,9 @@
 	//   "response": {
 	//     "$ref": "Groups"
 	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.groups.migration"
+	//   ],
 	//   "supportsMediaUpload": true
 	// }
 
diff --git a/groupssettings/v1/groupssettings-gen.go b/groupssettings/v1/groupssettings-gen.go
index 94856f7..2f4fab4 100644
--- a/groupssettings/v1/groupssettings-gen.go
+++ b/groupssettings/v1/groupssettings-gen.go
@@ -57,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Groups *GroupsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewGroupsService(s *Service) *GroupsService {
 	rs := &GroupsService{s: s}
 	return rs
@@ -216,7 +224,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"groupUniqueId": c.groupUniqueId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -301,7 +309,7 @@
 		"groupUniqueId": c.groupUniqueId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -388,7 +396,7 @@
 		"groupUniqueId": c.groupUniqueId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/identitytoolkit/v3/identitytoolkit-gen.go b/identitytoolkit/v3/identitytoolkit-gen.go
index 6037d61..dac0956 100644
--- a/identitytoolkit/v3/identitytoolkit-gen.go
+++ b/identitytoolkit/v3/identitytoolkit-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Relyingparty *RelyingpartyService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewRelyingpartyService(s *Service) *RelyingpartyService {
 	rs := &RelyingpartyService{s: s}
 	return rs
@@ -574,7 +582,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -643,7 +651,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -712,7 +720,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -781,7 +789,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -850,7 +858,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -911,7 +919,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -977,7 +985,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1046,7 +1054,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1115,7 +1123,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1184,7 +1192,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1253,7 +1261,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/licensing/v1/licensing-api.json b/licensing/v1/licensing-api.json
index caaa60c..b1cfd18 100644
--- a/licensing/v1/licensing-api.json
+++ b/licensing/v1/licensing-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"FrPV2U6xXFUq8eRv_PO3IoAURkc/5nv4m0pBrnwpGqw9jwk2yynQNrg\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/chZbfEJA0-TN8tTaZIdtXJErZX4\"",
  "discoveryVersion": "v1",
  "id": "licensing:v1",
  "name": "licensing",
@@ -66,6 +66,15 @@
    "location": "query"
   }
  },
+ "auth": {
+  "oauth2": {
+   "scopes": {
+    "https://www.googleapis.com/auth/apps.licensing": {
+     "description": "View and manage Google Apps licenses for your domain"
+    }
+   }
+  }
+ },
  "schemas": {
   "LicenseAssignment": {
    "id": "LicenseAssignment",
@@ -190,6 +199,9 @@
       "productId",
       "skuId",
       "userId"
+     ],
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.licensing"
      ]
     },
     "get": {
@@ -224,7 +236,10 @@
      ],
      "response": {
       "$ref": "LicenseAssignment"
-     }
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.licensing"
+     ]
     },
     "insert": {
      "id": "licensing.licenseAssignments.insert",
@@ -254,7 +269,10 @@
      },
      "response": {
       "$ref": "LicenseAssignment"
-     }
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.licensing"
+     ]
     },
     "listForProduct": {
      "id": "licensing.licenseAssignments.listForProduct",
@@ -296,7 +314,10 @@
      ],
      "response": {
       "$ref": "LicenseAssignmentList"
-     }
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.licensing"
+     ]
     },
     "listForProductAndSku": {
      "id": "licensing.licenseAssignments.listForProductAndSku",
@@ -345,7 +366,10 @@
      ],
      "response": {
       "$ref": "LicenseAssignmentList"
-     }
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.licensing"
+     ]
     },
     "patch": {
      "id": "licensing.licenseAssignments.patch",
@@ -382,7 +406,10 @@
      },
      "response": {
       "$ref": "LicenseAssignment"
-     }
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.licensing"
+     ]
     },
     "update": {
      "id": "licensing.licenseAssignments.update",
@@ -419,7 +446,10 @@
      },
      "response": {
       "$ref": "LicenseAssignment"
-     }
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/apps.licensing"
+     ]
     }
    }
   }
diff --git a/licensing/v1/licensing-gen.go b/licensing/v1/licensing-gen.go
index 0c788c6..61af53a 100644
--- a/licensing/v1/licensing-gen.go
+++ b/licensing/v1/licensing-gen.go
@@ -41,6 +41,12 @@
 const apiVersion = "v1"
 const basePath = "https://www.googleapis.com/apps/licensing/v1/product/"
 
+// OAuth2 scopes used by this API.
+const (
+	// View and manage Google Apps licenses for your domain
+	AppsLicensingScope = "https://www.googleapis.com/auth/apps.licensing"
+)
+
 func New(client *http.Client) (*Service, error) {
 	if client == nil {
 		return nil, errors.New("client is nil")
@@ -51,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	LicenseAssignments *LicenseAssignmentsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewLicenseAssignmentsService(s *Service) *LicenseAssignmentsService {
 	rs := &LicenseAssignmentsService{s: s}
 	return rs
@@ -149,7 +163,7 @@
 		"skuId":     c.skuId,
 		"userId":    c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -188,7 +202,10 @@
 	//       "type": "string"
 	//     }
 	//   },
-	//   "path": "{productId}/sku/{skuId}/user/{userId}"
+	//   "path": "{productId}/sku/{skuId}/user/{userId}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.licensing"
+	//   ]
 	// }
 
 }
@@ -236,7 +253,7 @@
 		"skuId":     c.skuId,
 		"userId":    c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -282,7 +299,10 @@
 	//   "path": "{productId}/sku/{skuId}/user/{userId}",
 	//   "response": {
 	//     "$ref": "LicenseAssignment"
-	//   }
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.licensing"
+	//   ]
 	// }
 
 }
@@ -334,7 +354,7 @@
 		"skuId":     c.skuId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -376,7 +396,10 @@
 	//   },
 	//   "response": {
 	//     "$ref": "LicenseAssignment"
-	//   }
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.licensing"
+	//   ]
 	// }
 
 }
@@ -442,7 +465,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"productId": c.productId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -496,7 +519,10 @@
 	//   "path": "{productId}/users",
 	//   "response": {
 	//     "$ref": "LicenseAssignmentList"
-	//   }
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.licensing"
+	//   ]
 	// }
 
 }
@@ -565,7 +591,7 @@
 		"productId": c.productId,
 		"skuId":     c.skuId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -626,7 +652,10 @@
 	//   "path": "{productId}/sku/{skuId}/users",
 	//   "response": {
 	//     "$ref": "LicenseAssignmentList"
-	//   }
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.licensing"
+	//   ]
 	// }
 
 }
@@ -681,7 +710,7 @@
 		"userId":    c.userId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -730,7 +759,10 @@
 	//   },
 	//   "response": {
 	//     "$ref": "LicenseAssignment"
-	//   }
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.licensing"
+	//   ]
 	// }
 
 }
@@ -785,7 +817,7 @@
 		"userId":    c.userId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -834,7 +866,10 @@
 	//   },
 	//   "response": {
 	//     "$ref": "LicenseAssignment"
-	//   }
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/apps.licensing"
+	//   ]
 	// }
 
 }
diff --git a/manager/v1beta2/manager-gen.go b/manager/v1beta2/manager-gen.go
index dae92af..47f84fc 100644
--- a/manager/v1beta2/manager-gen.go
+++ b/manager/v1beta2/manager-gen.go
@@ -75,14 +75,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Deployments *DeploymentsService
 
 	Templates *TemplatesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDeploymentsService(s *Service) *DeploymentsService {
 	rs := &DeploymentsService{s: s}
 	return rs
@@ -630,7 +638,7 @@
 		"region":         c.region,
 		"deploymentName": c.deploymentName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -717,7 +725,7 @@
 		"region":         c.region,
 		"deploymentName": c.deploymentName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -817,7 +825,7 @@
 		"region":    c.region,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -931,7 +939,7 @@
 		"projectId": c.projectId,
 		"region":    c.region,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1031,7 +1039,7 @@
 		"projectId":    c.projectId,
 		"templateName": c.templateName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1109,7 +1117,7 @@
 		"projectId":    c.projectId,
 		"templateName": c.templateName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1200,7 +1208,7 @@
 		"projectId": c.projectId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1302,7 +1310,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/mapsengine/exp2/mapsengine-gen.go b/mapsengine/exp2/mapsengine-gen.go
index 61543b8..19c59d0 100644
--- a/mapsengine/exp2/mapsengine-gen.go
+++ b/mapsengine/exp2/mapsengine-gen.go
@@ -66,8 +66,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Assets *AssetsService
 
@@ -84,6 +85,13 @@
 	Tables *TablesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAssetsService(s *Service) *AssetsService {
 	rs := &AssetsService{s: s}
 	rs.Parents = NewAssetsParentsService(s)
@@ -1684,7 +1692,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1902,7 +1910,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2073,7 +2081,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2161,7 +2169,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2238,7 +2246,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2328,7 +2336,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2403,7 +2411,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2485,7 +2493,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2575,7 +2583,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2790,7 +2798,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2994,7 +3002,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3091,7 +3099,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3163,7 +3171,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3251,7 +3259,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3332,7 +3340,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3431,7 +3439,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3528,7 +3536,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3619,7 +3627,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3698,7 +3706,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3779,7 +3787,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3847,7 +3855,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3929,7 +3937,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4019,7 +4027,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4247,7 +4255,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4462,7 +4470,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4559,7 +4567,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4642,7 +4650,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4723,7 +4731,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4808,7 +4816,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4899,7 +4907,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4978,7 +4986,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5051,7 +5059,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5184,7 +5192,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5197,6 +5205,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -5299,7 +5308,7 @@
 		"projectId": c.projectId,
 		"id":        c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5407,7 +5416,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5495,7 +5504,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5575,7 +5584,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5643,7 +5652,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5712,7 +5721,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5927,7 +5936,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6096,7 +6105,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6168,7 +6177,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6267,7 +6276,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6364,7 +6373,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6455,7 +6464,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6534,7 +6543,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6623,7 +6632,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6715,7 +6724,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6914,7 +6923,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7061,7 +7070,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7130,7 +7139,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7335,7 +7344,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7508,7 +7517,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7580,7 +7589,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7660,7 +7669,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7793,7 +7802,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7806,6 +7815,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -7925,7 +7935,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8022,7 +8032,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8113,7 +8123,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8192,7 +8202,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8273,7 +8283,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8341,7 +8351,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -8419,7 +8429,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8646,7 +8656,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8815,7 +8825,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -8887,7 +8897,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8974,7 +8984,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9050,7 +9060,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9144,7 +9154,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9251,7 +9261,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9347,7 +9357,7 @@
 		"tableId": c.tableId,
 		"id":      c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9545,7 +9555,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9746,7 +9756,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9759,6 +9769,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -9878,7 +9889,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9975,7 +9986,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10066,7 +10077,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10145,7 +10156,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/mapsengine/v1/mapsengine-gen.go b/mapsengine/v1/mapsengine-gen.go
index 721d056..ab508d0 100644
--- a/mapsengine/v1/mapsengine-gen.go
+++ b/mapsengine/v1/mapsengine-gen.go
@@ -66,8 +66,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Assets *AssetsService
 
@@ -84,6 +85,13 @@
 	Tables *TablesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAssetsService(s *Service) *AssetsService {
 	rs := &AssetsService{s: s}
 	rs.Parents = NewAssetsParentsService(s)
@@ -1681,7 +1689,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1899,7 +1907,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2070,7 +2078,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2158,7 +2166,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2235,7 +2243,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2325,7 +2333,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2400,7 +2408,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2482,7 +2490,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2572,7 +2580,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2787,7 +2795,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2981,7 +2989,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3073,7 +3081,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3145,7 +3153,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3233,7 +3241,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3314,7 +3322,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3413,7 +3421,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3510,7 +3518,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3601,7 +3609,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3680,7 +3688,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3761,7 +3769,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3829,7 +3837,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3911,7 +3919,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4001,7 +4009,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4216,7 +4224,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4408,7 +4416,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4500,7 +4508,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4583,7 +4591,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4664,7 +4672,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4749,7 +4757,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4840,7 +4848,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4919,7 +4927,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4992,7 +5000,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5125,7 +5133,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5138,6 +5146,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -5240,7 +5249,7 @@
 		"projectId": c.projectId,
 		"id":        c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5348,7 +5357,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"projectId": c.projectId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5436,7 +5445,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5516,7 +5525,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5584,7 +5593,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5653,7 +5662,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5868,7 +5877,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6037,7 +6046,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6109,7 +6118,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6208,7 +6217,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6305,7 +6314,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6396,7 +6405,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6475,7 +6484,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6564,7 +6573,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6656,7 +6665,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6855,7 +6864,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7002,7 +7011,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7071,7 +7080,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7276,7 +7285,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7449,7 +7458,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7521,7 +7530,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7601,7 +7610,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7734,7 +7743,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7747,6 +7756,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -7866,7 +7876,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7963,7 +7973,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8054,7 +8064,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8133,7 +8143,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8214,7 +8224,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8282,7 +8292,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -8360,7 +8370,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8587,7 +8597,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8756,7 +8766,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -8828,7 +8838,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8915,7 +8925,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8991,7 +9001,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9085,7 +9095,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9192,7 +9202,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9288,7 +9298,7 @@
 		"tableId": c.tableId,
 		"id":      c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9486,7 +9496,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9687,7 +9697,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9700,6 +9710,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -9819,7 +9830,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9916,7 +9927,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10007,7 +10018,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10086,7 +10097,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/mirror/v1/mirror-gen.go b/mirror/v1/mirror-gen.go
index f3a5793..f58af8d 100644
--- a/mirror/v1/mirror-gen.go
+++ b/mirror/v1/mirror-gen.go
@@ -65,8 +65,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 
@@ -81,6 +82,13 @@
 	Timeline *TimelineService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -786,7 +794,7 @@
 		"accountName": c.accountName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -876,7 +884,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -945,7 +953,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1025,7 +1033,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1089,7 +1097,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1163,7 +1171,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1250,7 +1258,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1329,7 +1337,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1402,7 +1410,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1468,7 +1476,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1544,7 +1552,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1617,7 +1625,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1682,7 +1690,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1755,7 +1763,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1834,7 +1842,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1904,7 +1912,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2044,7 +2052,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2057,6 +2065,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2214,7 +2223,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2335,7 +2344,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2482,7 +2491,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2495,6 +2504,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2600,7 +2610,7 @@
 		"itemId":       c.itemId,
 		"attachmentId": c.attachmentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2680,7 +2690,7 @@
 		"itemId":       c.itemId,
 		"attachmentId": c.attachmentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2826,7 +2836,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2839,6 +2849,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2937,7 +2948,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"itemId": c.itemId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/oauth2/v1/oauth2-api.json b/oauth2/v1/oauth2-api.json
index 49e6a57..7d74c8c 100644
--- a/oauth2/v1/oauth2-api.json
+++ b/oauth2/v1/oauth2-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/9Yyv0tXok5k5vzXMjMvbTiT4GAM\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/vv3fLLsrVMZFFO9YpWcdsminG6Y\"",
  "discoveryVersion": "v1",
  "id": "oauth2:v1",
  "name": "oauth2",
  "version": "v1",
- "revision": "20150120",
+ "revision": "20150302",
  "title": "Google OAuth2 API",
  "description": "Lets you access OAuth2 protocol related APIs.",
  "ownerDomain": "google.com",
@@ -160,7 +160,7 @@
     },
     "user_id": {
      "type": "string",
-     "description": "The Gaia obfuscated user id."
+     "description": "The obfuscated user id."
     },
     "verified_email": {
      "type": "boolean",
@@ -194,7 +194,7 @@
     },
     "id": {
      "type": "string",
-     "description": "The focus obfuscated gaia id of the user."
+     "description": "The obfuscated ID of the user."
     },
     "link": {
      "type": "string",
diff --git a/oauth2/v1/oauth2-gen.go b/oauth2/v1/oauth2-gen.go
index f78798b..9de407d 100644
--- a/oauth2/v1/oauth2-gen.go
+++ b/oauth2/v1/oauth2-gen.go
@@ -66,12 +66,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Userinfo *UserinfoService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewUserinfoService(s *Service) *UserinfoService {
 	rs := &UserinfoService{s: s}
 	rs.V2 = NewUserinfoV2Service(s)
@@ -156,7 +164,7 @@
 	// Scope: The space separated list of scopes granted to this token.
 	Scope string `json:"scope,omitempty"`
 
-	// User_id: The Gaia obfuscated user id.
+	// User_id: The obfuscated user id.
 	User_id string `json:"user_id,omitempty"`
 
 	// Verified_email: Boolean flag which is true if the email address is
@@ -181,7 +189,7 @@
 	// user.
 	Hd string `json:"hd,omitempty"`
 
-	// Id: The focus obfuscated gaia id of the user.
+	// Id: The obfuscated ID of the user.
 	Id string `json:"id,omitempty"`
 
 	// Link: URL of the profile page.
@@ -234,7 +242,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -291,7 +299,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -352,7 +360,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"robotEmail": c.robotEmail,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -424,7 +432,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"robotEmail": c.robotEmail,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -511,7 +519,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -581,7 +589,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -645,7 +653,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/oauth2/v2/oauth2-api.json b/oauth2/v2/oauth2-api.json
index e6b6d5c..af28f75 100644
--- a/oauth2/v2/oauth2-api.json
+++ b/oauth2/v2/oauth2-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/x7FThRC1OZmHwbkYbDOWKsWuUA8\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/iTA-R5-0GybzGChq9ZynFCm92Zw\"",
  "discoveryVersion": "v1",
  "id": "oauth2:v2",
  "name": "oauth2",
  "version": "v2",
- "revision": "20150120",
+ "revision": "20150302",
  "title": "Google OAuth2 API",
  "description": "Lets you access OAuth2 protocol related APIs.",
  "ownerDomain": "google.com",
@@ -151,7 +151,7 @@
     },
     "user_id": {
      "type": "string",
-     "description": "The Gaia obfuscated user id."
+     "description": "The obfuscated user id."
     },
     "verified_email": {
      "type": "boolean",
@@ -185,7 +185,7 @@
     },
     "id": {
      "type": "string",
-     "description": "The focus obfuscated gaia id of the user."
+     "description": "The obfuscated ID of the user."
     },
     "link": {
      "type": "string",
diff --git a/oauth2/v2/oauth2-gen.go b/oauth2/v2/oauth2-gen.go
index 9ad0b6f..933b111 100644
--- a/oauth2/v2/oauth2-gen.go
+++ b/oauth2/v2/oauth2-gen.go
@@ -66,12 +66,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Userinfo *UserinfoService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewUserinfoService(s *Service) *UserinfoService {
 	rs := &UserinfoService{s: s}
 	rs.V2 = NewUserinfoV2Service(s)
@@ -147,7 +155,7 @@
 	// Scope: The space separated list of scopes granted to this token.
 	Scope string `json:"scope,omitempty"`
 
-	// User_id: The Gaia obfuscated user id.
+	// User_id: The obfuscated user id.
 	User_id string `json:"user_id,omitempty"`
 
 	// Verified_email: Boolean flag which is true if the email address is
@@ -172,7 +180,7 @@
 	// user.
 	Hd string `json:"hd,omitempty"`
 
-	// Id: The focus obfuscated gaia id of the user.
+	// Id: The obfuscated ID of the user.
 	Id string `json:"id,omitempty"`
 
 	// Link: URL of the profile page.
@@ -225,7 +233,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -300,7 +308,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -367,7 +375,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -430,7 +438,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/pagespeedonline/v1/pagespeedonline-api.json b/pagespeedonline/v1/pagespeedonline-api.json
index 475a261..c7b0153 100644
--- a/pagespeedonline/v1/pagespeedonline-api.json
+++ b/pagespeedonline/v1/pagespeedonline-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/ZxBeTkfCnEKvhvWii3EWvp3ftvE\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/53c1pDum-m_4xRbboeMr9HDsJSk\"",
  "discoveryVersion": "v1",
  "id": "pagespeedonline:v1",
  "name": "pagespeedonline",
  "version": "v1",
- "revision": "20150108",
+ "revision": "20150317",
  "title": "PageSpeed Insights API",
  "description": "Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.",
  "ownerDomain": "google.com",
@@ -73,7 +73,7 @@
    "properties": {
     "formattedResults": {
      "type": "object",
-     "description": "Localized Page Speed results. Contains a ruleResults entry for each Page Speed rule instantiated and run by the server.",
+     "description": "Localized PageSpeed results. Contains a ruleResults entry for each PageSpeed rule instantiated and run by the server.",
      "properties": {
       "locale": {
        "type": "string",
@@ -81,7 +81,7 @@
       },
       "ruleResults": {
        "type": "object",
-       "description": "Dictionary of formatted rule results, with one entry for each Page Speed rule instantiated and run by the server.",
+       "description": "Dictionary of formatted rule results, with one entry for each PageSpeed rule instantiated and run by the server.",
        "additionalProperties": {
         "type": "object",
         "description": "The enum-like identifier for this rule. For instance \"EnableKeepAlive\" or \"AvoidCssImport\". Not localized.",
@@ -296,12 +296,12 @@
     },
     "score": {
      "type": "integer",
-     "description": "The Page Speed Score (0-100), which indicates how much faster a page could be. A high score indicates little room for improvement, while a lower score indicates more room for improvement.",
+     "description": "The PageSpeed Score (0-100), which indicates how much faster a page could be. A high score indicates little room for improvement, while a lower score indicates more room for improvement.",
      "format": "int32"
     },
     "screenshot": {
      "type": "object",
-     "description": "Base64 encoded screenshot of the page that was analyzed.",
+     "description": "Base64-encoded screenshot of the page that was analyzed.",
      "properties": {
       "data": {
        "type": "string",
@@ -330,16 +330,16 @@
     },
     "version": {
      "type": "object",
-     "description": "The version of the Page Speed SDK used to generate these results.",
+     "description": "The version of PageSpeed used to generate these results.",
      "properties": {
       "major": {
        "type": "integer",
-       "description": "The major version number of the Page Speed SDK used to generate these results.",
+       "description": "The major version number of PageSpeed used to generate these results.",
        "format": "int32"
       },
       "minor": {
        "type": "integer",
-       "description": "The minor version number of the Page Speed SDK used to generate these results.",
+       "description": "The minor version number of PageSpeed used to generate these results.",
        "format": "int32"
       }
      }
@@ -354,7 +354,7 @@
      "id": "pagespeedonline.pagespeedapi.runpagespeed",
      "path": "runPagespeed",
      "httpMethod": "GET",
-     "description": "Runs Page Speed analysis on the page at the specified URL, and returns a Page Speed score, a list of suggestions to make that page faster, and other information.",
+     "description": "Runs PageSpeed analysis on the page at the specified URL, and returns a PageSpeed score, a list of suggestions to make that page faster, and other information.",
      "parameters": {
       "filter_third_party_resources": {
        "type": "boolean",
@@ -370,7 +370,7 @@
       },
       "rule": {
        "type": "string",
-       "description": "A Page Speed rule to run; if none are given, all rules are run",
+       "description": "A PageSpeed rule to run; if none are given, all rules are run",
        "pattern": "[a-zA-Z]+",
        "repeated": true,
        "location": "query"
diff --git a/pagespeedonline/v1/pagespeedonline-gen.go b/pagespeedonline/v1/pagespeedonline-gen.go
index ef34aa4..865a038 100644
--- a/pagespeedonline/v1/pagespeedonline-gen.go
+++ b/pagespeedonline/v1/pagespeedonline-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Pagespeedapi *PagespeedapiService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewPagespeedapiService(s *Service) *PagespeedapiService {
 	rs := &PagespeedapiService{s: s}
 	return rs
@@ -67,9 +75,8 @@
 }
 
 type Result struct {
-	// FormattedResults: Localized Page Speed results. Contains a
-	// ruleResults entry for each Page Speed rule instantiated and run by
-	// the server.
+	// FormattedResults: Localized PageSpeed results. Contains a ruleResults
+	// entry for each PageSpeed rule instantiated and run by the server.
 	FormattedResults *ResultFormattedResults `json:"formattedResults,omitempty"`
 
 	// Id: Canonicalized and final URL for the document, after following
@@ -91,19 +98,18 @@
 	// page load. 4xx/5xx indicates an error.
 	ResponseCode int64 `json:"responseCode,omitempty"`
 
-	// Score: The Page Speed Score (0-100), which indicates how much faster
-	// a page could be. A high score indicates little room for improvement,
+	// Score: The PageSpeed Score (0-100), which indicates how much faster a
+	// page could be. A high score indicates little room for improvement,
 	// while a lower score indicates more room for improvement.
 	Score int64 `json:"score,omitempty"`
 
-	// Screenshot: Base64 encoded screenshot of the page that was analyzed.
+	// Screenshot: Base64-encoded screenshot of the page that was analyzed.
 	Screenshot *ResultScreenshot `json:"screenshot,omitempty"`
 
 	// Title: Title of the page, as displayed in the browser's title bar.
 	Title string `json:"title,omitempty"`
 
-	// Version: The version of the Page Speed SDK used to generate these
-	// results.
+	// Version: The version of PageSpeed used to generate these results.
 	Version *ResultVersion `json:"version,omitempty"`
 }
 
@@ -112,7 +118,7 @@
 	Locale string `json:"locale,omitempty"`
 
 	// RuleResults: Dictionary of formatted rule results, with one entry for
-	// each Page Speed rule instantiated and run by the server.
+	// each PageSpeed rule instantiated and run by the server.
 	RuleResults *ResultFormattedResultsRuleResults `json:"ruleResults,omitempty"`
 }
 
@@ -185,12 +191,12 @@
 }
 
 type ResultVersion struct {
-	// Major: The major version number of the Page Speed SDK used to
-	// generate these results.
+	// Major: The major version number of PageSpeed used to generate these
+	// results.
 	Major int64 `json:"major,omitempty"`
 
-	// Minor: The minor version number of the Page Speed SDK used to
-	// generate these results.
+	// Minor: The minor version number of PageSpeed used to generate these
+	// results.
 	Minor int64 `json:"minor,omitempty"`
 }
 
@@ -202,8 +208,8 @@
 	opt_ map[string]interface{}
 }
 
-// Runpagespeed: Runs Page Speed analysis on the page at the specified
-// URL, and returns a Page Speed score, a list of suggestions to make
+// Runpagespeed: Runs PageSpeed analysis on the page at the specified
+// URL, and returns a PageSpeed score, a list of suggestions to make
 // that page faster, and other information.
 func (r *PagespeedapiService) Runpagespeed(url string) *PagespeedapiRunpagespeedCall {
 	c := &PagespeedapiRunpagespeedCall{s: r.s, opt_: make(map[string]interface{})}
@@ -226,7 +232,7 @@
 	return c
 }
 
-// Rule sets the optional parameter "rule": A Page Speed rule to run; if
+// Rule sets the optional parameter "rule": A PageSpeed rule to run; if
 // none are given, all rules are run
 func (c *PagespeedapiRunpagespeedCall) Rule(rule string) *PagespeedapiRunpagespeedCall {
 	c.opt_["rule"] = rule
@@ -282,7 +288,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -297,7 +303,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Runs Page Speed analysis on the page at the specified URL, and returns a Page Speed score, a list of suggestions to make that page faster, and other information.",
+	//   "description": "Runs PageSpeed analysis on the page at the specified URL, and returns a PageSpeed score, a list of suggestions to make that page faster, and other information.",
 	//   "httpMethod": "GET",
 	//   "id": "pagespeedonline.pagespeedapi.runpagespeed",
 	//   "parameterOrder": [
@@ -317,7 +323,7 @@
 	//       "type": "string"
 	//     },
 	//     "rule": {
-	//       "description": "A Page Speed rule to run; if none are given, all rules are run",
+	//       "description": "A PageSpeed rule to run; if none are given, all rules are run",
 	//       "location": "query",
 	//       "pattern": "[a-zA-Z]+",
 	//       "repeated": true,
diff --git a/pagespeedonline/v2/pagespeedonline-api.json b/pagespeedonline/v2/pagespeedonline-api.json
index e1e4b23..8cf13f0 100644
--- a/pagespeedonline/v2/pagespeedonline-api.json
+++ b/pagespeedonline/v2/pagespeedonline-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/y8eCF6QessR8F9s9erx5q0lLF1U\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/jQUdXXqYUml2RtPh0PKouCPciII\"",
  "discoveryVersion": "v1",
  "id": "pagespeedonline:v2",
  "name": "pagespeedonline",
  "version": "v2",
- "revision": "20150108",
+ "revision": "20150317",
  "title": "PageSpeed Insights API",
  "description": "Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.",
  "ownerDomain": "google.com",
@@ -14,7 +14,7 @@
   "x16": "https://www.google.com/images/icons/product/pagespeed-16.png",
   "x32": "https://www.google.com/images/icons/product/pagespeed-32.png"
  },
- "documentationLink": "https://developers.google.com/speed/docs/insights/v1/getting_started",
+ "documentationLink": "https://developers.google.com/speed/docs/insights/v2/getting-started",
  "protocol": "rest",
  "baseUrl": "https://www.googleapis.com/pagespeedonline/v2/",
  "basePath": "/pagespeedonline/v2/",
diff --git a/pagespeedonline/v2/pagespeedonline-gen.go b/pagespeedonline/v2/pagespeedonline-gen.go
index e2eed29..3a6728c 100644
--- a/pagespeedonline/v2/pagespeedonline-gen.go
+++ b/pagespeedonline/v2/pagespeedonline-gen.go
@@ -1,6 +1,6 @@
 // Package pagespeedonline provides access to the PageSpeed Insights API.
 //
-// See https://developers.google.com/speed/docs/insights/v1/getting_started
+// See https://developers.google.com/speed/docs/insights/v2/getting-started
 //
 // Usage example:
 //
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Pagespeedapi *PagespeedapiService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewPagespeedapiService(s *Service) *PagespeedapiService {
 	rs := &PagespeedapiService{s: s}
 	return rs
@@ -366,7 +374,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/plus/v1/plus-gen.go b/plus/v1/plus-gen.go
index 876f6f1..e5a9fa3 100644
--- a/plus/v1/plus-gen.go
+++ b/plus/v1/plus-gen.go
@@ -69,8 +69,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Activities *ActivitiesService
 
@@ -81,6 +82,13 @@
 	People *PeopleService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -1267,7 +1275,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"activityId": c.activityId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1372,7 +1380,7 @@
 		"userId":     c.userId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1521,7 +1529,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1632,7 +1640,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1743,7 +1751,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"activityId": c.activityId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1870,7 +1878,7 @@
 		"collection": c.collection,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2015,7 +2023,7 @@
 		"userId":     c.userId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2129,7 +2137,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2200,7 +2208,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2316,7 +2324,7 @@
 		"userId":     c.userId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2463,7 +2471,7 @@
 		"activityId": c.activityId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2604,7 +2612,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/plusdomains/v1/plusdomains-gen.go b/plusdomains/v1/plusdomains-gen.go
index 7e14d4c..435b27e 100644
--- a/plusdomains/v1/plusdomains-gen.go
+++ b/plusdomains/v1/plusdomains-gen.go
@@ -91,8 +91,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Activities *ActivitiesService
 
@@ -107,6 +108,13 @@
 	People *PeopleService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -1269,7 +1277,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"activityId": c.activityId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1367,7 +1375,7 @@
 		"userId": c.userId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1481,7 +1489,7 @@
 		"userId":     c.userId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1610,7 +1618,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1723,7 +1731,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"circleId": c.circleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1812,7 +1820,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"circleId": c.circleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1897,7 +1905,7 @@
 		"userId": c.userId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2002,7 +2010,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2103,7 +2111,7 @@
 		"circleId": c.circleId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2183,7 +2191,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"circleId": c.circleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2273,7 +2281,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"circleId": c.circleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2363,7 +2371,7 @@
 		"circleId": c.circleId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2443,7 +2451,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"commentId": c.commentId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2528,7 +2536,7 @@
 		"activityId": c.activityId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2642,7 +2650,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"activityId": c.activityId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2820,7 +2828,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2833,6 +2841,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2946,7 +2955,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"userId": c.userId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3063,7 +3072,7 @@
 		"userId":     c.userId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3209,7 +3218,7 @@
 		"activityId": c.activityId,
 		"collection": c.collection,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3341,7 +3350,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"circleId": c.circleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/prediction/v1.2/prediction-gen.go b/prediction/v1.2/prediction-gen.go
index 0e4c0ad..3f0371f 100644
--- a/prediction/v1.2/prediction-gen.go
+++ b/prediction/v1.2/prediction-gen.go
@@ -67,14 +67,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Hostedmodels *HostedmodelsService
 
 	Training *TrainingService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -193,7 +201,7 @@
 		"data": c.data,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -280,7 +288,7 @@
 		"hostedModelName": c.hostedModelName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -359,7 +367,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"data": c.data,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -428,7 +436,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"data": c.data,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -518,7 +526,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -604,7 +612,7 @@
 		"data": c.data,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/prediction/v1.3/prediction-gen.go b/prediction/v1.3/prediction-gen.go
index 02d6b56..63f56f9 100644
--- a/prediction/v1.3/prediction-gen.go
+++ b/prediction/v1.3/prediction-gen.go
@@ -67,14 +67,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Hostedmodels *HostedmodelsService
 
 	Training *TrainingService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -258,7 +266,7 @@
 		"hostedModelName": c.hostedModelName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -337,7 +345,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"data": c.data,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -406,7 +414,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"data": c.data,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -486,7 +494,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -565,7 +573,7 @@
 		"data": c.data,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -652,7 +660,7 @@
 		"data": c.data,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/prediction/v1.4/prediction-gen.go b/prediction/v1.4/prediction-gen.go
index 76a047c..3fb2785 100644
--- a/prediction/v1.4/prediction-gen.go
+++ b/prediction/v1.4/prediction-gen.go
@@ -67,14 +67,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Hostedmodels *HostedmodelsService
 
 	Trainedmodels *TrainedmodelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -281,7 +289,7 @@
 		"hostedModelName": c.hostedModelName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -360,7 +368,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -429,7 +437,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -509,7 +517,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -588,7 +596,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -675,7 +683,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/prediction/v1.5/prediction-gen.go b/prediction/v1.5/prediction-gen.go
index a476b2f..f159425 100644
--- a/prediction/v1.5/prediction-gen.go
+++ b/prediction/v1.5/prediction-gen.go
@@ -67,14 +67,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Hostedmodels *HostedmodelsService
 
 	Trainedmodels *TrainedmodelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -416,7 +424,7 @@
 		"hostedModelName": c.hostedModelName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -496,7 +504,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -572,7 +580,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -641,7 +649,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -721,7 +729,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -807,7 +815,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -894,7 +902,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -981,7 +989,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/prediction/v1.6/prediction-api.json b/prediction/v1.6/prediction-api.json
index ff3dd8b..cc35cc8 100644
--- a/prediction/v1.6/prediction-api.json
+++ b/prediction/v1.6/prediction-api.json
@@ -1,6 +1,6 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/XH5kx6DVwHOxcDh-sCub5wYn1Ss\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/MKubU0FmYvcCiak8-htY8xGlT7I\"",
  "discoveryVersion": "v1",
  "id": "prediction:v1.6",
  "name": "prediction",
@@ -489,9 +489,8 @@
      }
     },
     "outputValue": {
-     "type": "number",
-     "description": "The estimated regression value (Regression models only).",
-     "format": "double"
+     "type": "string",
+     "description": "The estimated regression value (Regression models only)."
     },
     "selfLink": {
      "type": "string",
diff --git a/prediction/v1.6/prediction-gen.go b/prediction/v1.6/prediction-gen.go
index c46e408..726db36 100644
--- a/prediction/v1.6/prediction-gen.go
+++ b/prediction/v1.6/prediction-gen.go
@@ -67,14 +67,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Hostedmodels *HostedmodelsService
 
 	Trainedmodels *TrainedmodelsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -367,7 +375,7 @@
 	OutputMulti []*OutputOutputMulti `json:"outputMulti,omitempty"`
 
 	// OutputValue: The estimated regression value (Regression models only).
-	OutputValue float64 `json:"outputValue,omitempty"`
+	OutputValue string `json:"outputValue,omitempty"`
 
 	// SelfLink: A URL to re-request this resource.
 	SelfLink string `json:"selfLink,omitempty"`
@@ -437,7 +445,7 @@
 		"hostedModelName": c.hostedModelName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -527,7 +535,7 @@
 		"project": c.project,
 		"id":      c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -613,7 +621,7 @@
 		"project": c.project,
 		"id":      c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -692,7 +700,7 @@
 		"project": c.project,
 		"id":      c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -783,7 +791,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -884,7 +892,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -983,7 +991,7 @@
 		"id":      c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1080,7 +1088,7 @@
 		"id":      c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/pubsub/v1beta1/pubsub-gen.go b/pubsub/v1beta1/pubsub-gen.go
index ae065ce..73552ba 100644
--- a/pubsub/v1beta1/pubsub-gen.go
+++ b/pubsub/v1beta1/pubsub-gen.go
@@ -61,14 +61,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Subscriptions *SubscriptionsService
 
 	Topics *TopicsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewSubscriptionsService(s *Service) *SubscriptionsService {
 	rs := &SubscriptionsService{s: s}
 	return rs
@@ -364,7 +372,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -437,7 +445,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -508,7 +516,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"subscription": c.subscription,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -578,7 +586,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"subscription": c.subscription,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -681,7 +689,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -770,7 +778,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -840,7 +848,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -910,7 +918,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -986,7 +994,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1059,7 +1067,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1131,7 +1139,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"topic": c.topic,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1204,7 +1212,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"topic": c.topic,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1307,7 +1315,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1396,7 +1404,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1463,7 +1471,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/pubsub/v1beta1a/pubsub-gen.go b/pubsub/v1beta1a/pubsub-gen.go
index 9fb40b8..86f610f 100644
--- a/pubsub/v1beta1a/pubsub-gen.go
+++ b/pubsub/v1beta1a/pubsub-gen.go
@@ -59,14 +59,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Subscriptions *SubscriptionsService
 
 	Topics *TopicsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewSubscriptionsService(s *Service) *SubscriptionsService {
 	rs := &SubscriptionsService{s: s}
 	return rs
@@ -249,7 +257,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -327,7 +335,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -398,7 +406,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"subscription": c.subscription,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -474,7 +482,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"subscription": c.subscription,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -573,7 +581,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -659,7 +667,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -737,7 +745,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -814,7 +822,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -890,7 +898,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -963,7 +971,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1035,7 +1043,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"topic": c.topic,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1114,7 +1122,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"topic": c.topic,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1213,7 +1221,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1299,7 +1307,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1373,7 +1381,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/pubsub/v1beta2/pubsub-gen.go b/pubsub/v1beta2/pubsub-gen.go
index 67cf151..0f263a7 100644
--- a/pubsub/v1beta2/pubsub-gen.go
+++ b/pubsub/v1beta2/pubsub-gen.go
@@ -58,12 +58,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Projects *ProjectsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Subscriptions = NewProjectsSubscriptionsService(s)
@@ -245,7 +253,7 @@
 		"subscription": c.subscription,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -337,7 +345,7 @@
 		"name": c.name,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -421,7 +429,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"subscription": c.subscription,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -497,7 +505,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"subscription": c.subscription,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -591,7 +599,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -687,7 +695,7 @@
 		"subscription": c.subscription,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -779,7 +787,7 @@
 		"subscription": c.subscription,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -869,7 +877,7 @@
 		"subscription": c.subscription,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -956,7 +964,7 @@
 		"name": c.name,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1039,7 +1047,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"topic": c.topic,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1115,7 +1123,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"topic": c.topic,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1209,7 +1217,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1303,7 +1311,7 @@
 		"topic": c.topic,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1400,7 +1408,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"topic": c.topic,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/qpxexpress/v1/qpxexpress-gen.go b/qpxexpress/v1/qpxexpress-gen.go
index 5beb9f2..43c8929 100644
--- a/qpxexpress/v1/qpxexpress-gen.go
+++ b/qpxexpress/v1/qpxexpress-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Trips *TripsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewTripsService(s *Service) *TripsService {
 	rs := &TripsService{s: s}
 	return rs
@@ -674,7 +682,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/replicapool/v1beta1/replicapool-gen.go b/replicapool/v1beta1/replicapool-gen.go
index 34f35ec..52b9de2 100644
--- a/replicapool/v1beta1/replicapool-gen.go
+++ b/replicapool/v1beta1/replicapool-gen.go
@@ -72,14 +72,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Pools *PoolsService
 
 	Replicas *ReplicasService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewPoolsService(s *Service) *PoolsService {
 	rs := &PoolsService{s: s}
 	return rs
@@ -539,7 +547,7 @@
 		"poolName":    c.poolName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -633,7 +641,7 @@
 		"zone":        c.zone,
 		"poolName":    c.poolName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -738,7 +746,7 @@
 		"zone":        c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -851,7 +859,7 @@
 		"projectName": c.projectName,
 		"zone":        c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -972,7 +980,7 @@
 		"zone":        c.zone,
 		"poolName":    c.poolName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1084,7 +1092,7 @@
 		"poolName":    c.poolName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1189,7 +1197,7 @@
 		"replicaName": c.replicaName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1300,7 +1308,7 @@
 		"poolName":    c.poolName,
 		"replicaName": c.replicaName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1429,7 +1437,7 @@
 		"zone":        c.zone,
 		"poolName":    c.poolName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1546,7 +1554,7 @@
 		"poolName":    c.poolName,
 		"replicaName": c.replicaName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/replicapool/v1beta2/replicapool-gen.go b/replicapool/v1beta2/replicapool-gen.go
index f12edea..0bca277 100644
--- a/replicapool/v1beta2/replicapool-gen.go
+++ b/replicapool/v1beta2/replicapool-gen.go
@@ -64,14 +64,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	InstanceGroupManagers *InstanceGroupManagersService
 
 	ZoneOperations *ZoneOperationsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewInstanceGroupManagersService(s *Service) *InstanceGroupManagersService {
 	rs := &InstanceGroupManagersService{s: s}
 	return rs
@@ -413,7 +421,7 @@
 		"instanceGroupManager": c.instanceGroupManager,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -519,7 +527,7 @@
 		"zone":                 c.zone,
 		"instanceGroupManager": c.instanceGroupManager,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -630,7 +638,7 @@
 		"instanceGroupManager": c.instanceGroupManager,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -733,7 +741,7 @@
 		"zone":                 c.zone,
 		"instanceGroupManager": c.instanceGroupManager,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -843,7 +851,7 @@
 		"zone":    c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -977,7 +985,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1099,7 +1107,7 @@
 		"instanceGroupManager": c.instanceGroupManager,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1208,7 +1216,7 @@
 		"zone":                 c.zone,
 		"instanceGroupManager": c.instanceGroupManager,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1326,7 +1334,7 @@
 		"instanceGroupManager": c.instanceGroupManager,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1439,7 +1447,7 @@
 		"instanceGroupManager": c.instanceGroupManager,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1542,7 +1550,7 @@
 		"zone":      c.zone,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1672,7 +1680,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/replicapoolupdater/v1beta1/replicapoolupdater-api.json b/replicapoolupdater/v1beta1/replicapoolupdater-api.json
index 51ec80c..9c0098e 100644
--- a/replicapoolupdater/v1beta1/replicapoolupdater-api.json
+++ b/replicapoolupdater/v1beta1/replicapoolupdater-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/eJNOa2VAnZWx5ALy5y9ejkM9EKI\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/IuZy-huEI4odldDxlxCkfd4i7iE\"",
  "discoveryVersion": "v1",
  "id": "replicapoolupdater:v1beta1",
  "name": "replicapoolupdater",
  "version": "v1beta1",
- "revision": "20150216",
+ "revision": "20150129",
  "title": "Google Compute Engine Instance Group Updater API",
  "description": "The Google Compute Engine Instance Group Updater API provides services for updating groups of Compute Engine Instances.",
  "ownerDomain": "google.com",
@@ -306,7 +306,7 @@
    "properties": {
     "actionType": {
      "type": "string",
-     "description": "Specifies the action to take for each instance within the instance group. This can be RECREATE which will recreate each instance and is only available for managed instance groups. It can also be REBOOT which performs a soft reboot for each instance and is only available for regular (non-managed) instance groups."
+     "description": "Specifies the action to take for each instance within the instance group. This can be RECREATE which will recreate each instance and is only available for managed instance groups. It can also be REBOOT which performs a soft reboot for each instance and is only available for regular (non-managed) instance groups and explicit lists of instances."
     },
     "creationTimestamp": {
      "type": "string",
@@ -349,16 +349,23 @@
     },
     "instanceGroup": {
      "type": "string",
-     "description": "Fully-qualified URL of an instance group being updated. Exactly one of instanceGroupManager and instanceGroup must be set."
+     "description": "Fully-qualified URL of an instance group being updated. Exactly one of instanceGroupManager, instanceGroup and instance list must be set."
     },
     "instanceGroupManager": {
      "type": "string",
-     "description": "Fully-qualified URL of an instance group manager being updated. Exactly one of instanceGroupManager and instanceGroup must be set."
+     "description": "Fully-qualified URL of an instance group manager being updated. Exactly one of instanceGroupManager, instanceGroup and instance list must be set."
     },
     "instanceTemplate": {
      "type": "string",
      "description": "Fully-qualified URL of an instance template to apply."
     },
+    "instances": {
+     "type": "array",
+     "description": "List of fully-qualified URLs of instances to be updated. Exactly one of instanceGroupManager, instanceGroup and instance list must be set.",
+     "items": {
+      "type": "string"
+     }
+    },
     "kind": {
      "type": "string",
      "description": "[Output Only] Type of the resource.",
@@ -373,17 +380,6 @@
        "description": "Number of instances updated before the update gets automatically paused.",
        "format": "int32"
       },
-      "canary": {
-       "type": "object",
-       "description": "Parameters of a canary phase. If absent, canary will NOT be performed.",
-       "properties": {
-        "numInstances": {
-         "type": "integer",
-         "description": "Number of instances updated as a part of canary phase. If absent, the default number of instances will be used.",
-         "format": "int32"
-        }
-       }
-      },
       "instanceStartupTimeoutSec": {
        "type": "integer",
        "description": "Maximum amount of time we will wait after finishing all steps until we receive HEALTHY state for instance. If this deadline is exceeded instance update is considered as failed.",
diff --git a/replicapoolupdater/v1beta1/replicapoolupdater-gen.go b/replicapoolupdater/v1beta1/replicapoolupdater-gen.go
index 76f32c4..0e5c383 100644
--- a/replicapoolupdater/v1beta1/replicapoolupdater-gen.go
+++ b/replicapoolupdater/v1beta1/replicapoolupdater-gen.go
@@ -64,14 +64,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	RollingUpdates *RollingUpdatesService
 
 	ZoneOperations *ZoneOperationsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewRollingUpdatesService(s *Service) *RollingUpdatesService {
 	rs := &RollingUpdatesService{s: s}
 	return rs
@@ -264,7 +272,8 @@
 	// instance group. This can be RECREATE which will recreate each
 	// instance and is only available for managed instance groups. It can
 	// also be REBOOT which performs a soft reboot for each instance and is
-	// only available for regular (non-managed) instance groups.
+	// only available for regular (non-managed) instance groups and explicit
+	// lists of instances.
 	ActionType string `json:"actionType,omitempty"`
 
 	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
@@ -283,19 +292,24 @@
 	Id string `json:"id,omitempty"`
 
 	// InstanceGroup: Fully-qualified URL of an instance group being
-	// updated. Exactly one of instanceGroupManager and instanceGroup must
-	// be set.
+	// updated. Exactly one of instanceGroupManager, instanceGroup and
+	// instance list must be set.
 	InstanceGroup string `json:"instanceGroup,omitempty"`
 
 	// InstanceGroupManager: Fully-qualified URL of an instance group
-	// manager being updated. Exactly one of instanceGroupManager and
-	// instanceGroup must be set.
+	// manager being updated. Exactly one of instanceGroupManager,
+	// instanceGroup and instance list must be set.
 	InstanceGroupManager string `json:"instanceGroupManager,omitempty"`
 
 	// InstanceTemplate: Fully-qualified URL of an instance template to
 	// apply.
 	InstanceTemplate string `json:"instanceTemplate,omitempty"`
 
+	// Instances: List of fully-qualified URLs of instances to be updated.
+	// Exactly one of instanceGroupManager, instanceGroup and instance list
+	// must be set.
+	Instances []string `json:"instances,omitempty"`
+
 	// Kind: [Output Only] Type of the resource.
 	Kind string `json:"kind,omitempty"`
 
@@ -361,10 +375,6 @@
 	// update gets automatically paused.
 	AutoPauseAfterInstances int64 `json:"autoPauseAfterInstances,omitempty"`
 
-	// Canary: Parameters of a canary phase. If absent, canary will NOT be
-	// performed.
-	Canary *RollingUpdatePolicyCanary `json:"canary,omitempty"`
-
 	// InstanceStartupTimeoutSec: Maximum amount of time we will wait after
 	// finishing all steps until we receive HEALTHY state for instance. If
 	// this deadline is exceeded instance update is considered as failed.
@@ -398,12 +408,6 @@
 	SleepAfterInstanceRestartSec int64 `json:"sleepAfterInstanceRestartSec,omitempty"`
 }
 
-type RollingUpdatePolicyCanary struct {
-	// NumInstances: Number of instances updated as a part of canary phase.
-	// If absent, the default number of instances will be used.
-	NumInstances int64 `json:"numInstances,omitempty"`
-}
-
 type RollingUpdateList struct {
 	// Items: Collection of requested updates.
 	Items []*RollingUpdate `json:"items,omitempty"`
@@ -462,7 +466,7 @@
 		"zone":          c.zone,
 		"rollingUpdate": c.rollingUpdate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -561,7 +565,7 @@
 		"zone":          c.zone,
 		"rollingUpdate": c.rollingUpdate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -666,7 +670,7 @@
 		"zone":    c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -802,7 +806,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -952,7 +956,7 @@
 		"zone":          c.zone,
 		"rollingUpdate": c.rollingUpdate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1073,7 +1077,7 @@
 		"zone":          c.zone,
 		"rollingUpdate": c.rollingUpdate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1173,7 +1177,7 @@
 		"zone":          c.zone,
 		"rollingUpdate": c.rollingUpdate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1274,7 +1278,7 @@
 		"zone":          c.zone,
 		"rollingUpdate": c.rollingUpdate,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1372,7 +1376,7 @@
 		"zone":      c.zone,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/reseller/v1/reseller-gen.go b/reseller/v1/reseller-gen.go
index 1eaaed0..ef410c4 100644
--- a/reseller/v1/reseller-gen.go
+++ b/reseller/v1/reseller-gen.go
@@ -61,14 +61,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Customers *CustomersService
 
 	Subscriptions *SubscriptionsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewCustomersService(s *Service) *CustomersService {
 	rs := &CustomersService{s: s}
 	return rs
@@ -319,7 +327,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"customerId": c.customerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -412,7 +420,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -496,7 +504,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -584,7 +592,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -667,7 +675,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -761,7 +769,7 @@
 		"subscriptionId": c.subscriptionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -858,7 +866,7 @@
 		"subscriptionId": c.subscriptionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -955,7 +963,7 @@
 		"subscriptionId": c.subscriptionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1047,7 +1055,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1145,7 +1153,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1248,7 +1256,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1382,7 +1390,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1481,7 +1489,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1567,7 +1575,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/reseller/v1sandbox/reseller-gen.go b/reseller/v1sandbox/reseller-gen.go
index c60a75c..bb2ad39 100644
--- a/reseller/v1sandbox/reseller-gen.go
+++ b/reseller/v1sandbox/reseller-gen.go
@@ -61,14 +61,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Customers *CustomersService
 
 	Subscriptions *SubscriptionsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewCustomersService(s *Service) *CustomersService {
 	rs := &CustomersService{s: s}
 	return rs
@@ -319,7 +327,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"customerId": c.customerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -412,7 +420,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -496,7 +504,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -584,7 +592,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -667,7 +675,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -761,7 +769,7 @@
 		"subscriptionId": c.subscriptionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -858,7 +866,7 @@
 		"subscriptionId": c.subscriptionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -955,7 +963,7 @@
 		"subscriptionId": c.subscriptionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1047,7 +1055,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1145,7 +1153,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1248,7 +1256,7 @@
 		"customerId": c.customerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1382,7 +1390,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1481,7 +1489,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1567,7 +1575,7 @@
 		"customerId":     c.customerId,
 		"subscriptionId": c.subscriptionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/resourceviews/v1beta1/resourceviews-gen.go b/resourceviews/v1beta1/resourceviews-gen.go
index 7051f7e..ef602c2 100644
--- a/resourceviews/v1beta1/resourceviews-gen.go
+++ b/resourceviews/v1beta1/resourceviews-gen.go
@@ -72,14 +72,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	RegionViews *RegionViewsService
 
 	ZoneViews *ZoneViewsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewRegionViewsService(s *Service) *RegionViewsService {
 	rs := &RegionViewsService{s: s}
 	return rs
@@ -251,7 +259,7 @@
 		"resourceViewName": c.resourceViewName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -345,7 +353,7 @@
 		"region":           c.region,
 		"resourceViewName": c.resourceViewName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -436,7 +444,7 @@
 		"region":           c.region,
 		"resourceViewName": c.resourceViewName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -541,7 +549,7 @@
 		"region":      c.region,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -655,7 +663,7 @@
 		"projectName": c.projectName,
 		"region":      c.region,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -785,7 +793,7 @@
 		"region":           c.region,
 		"resourceViewName": c.resourceViewName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -907,7 +915,7 @@
 		"resourceViewName": c.resourceViewName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1009,7 +1017,7 @@
 		"resourceViewName": c.resourceViewName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1103,7 +1111,7 @@
 		"zone":             c.zone,
 		"resourceViewName": c.resourceViewName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1194,7 +1202,7 @@
 		"zone":             c.zone,
 		"resourceViewName": c.resourceViewName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1299,7 +1307,7 @@
 		"zone":        c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1413,7 +1421,7 @@
 		"projectName": c.projectName,
 		"zone":        c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1543,7 +1551,7 @@
 		"zone":             c.zone,
 		"resourceViewName": c.resourceViewName,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1665,7 +1673,7 @@
 		"resourceViewName": c.resourceViewName,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/resourceviews/v1beta2/resourceviews-gen.go b/resourceviews/v1beta2/resourceviews-gen.go
index 35a46a7..cdca879 100644
--- a/resourceviews/v1beta2/resourceviews-gen.go
+++ b/resourceviews/v1beta2/resourceviews-gen.go
@@ -72,14 +72,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	ZoneOperations *ZoneOperationsService
 
 	ZoneViews *ZoneViewsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewZoneOperationsService(s *Service) *ZoneOperationsService {
 	rs := &ZoneOperationsService{s: s}
 	return rs
@@ -413,7 +421,7 @@
 		"zone":      c.zone,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -546,7 +554,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -668,7 +676,7 @@
 		"resourceView": c.resourceView,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -769,7 +777,7 @@
 		"zone":         c.zone,
 		"resourceView": c.resourceView,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -867,7 +875,7 @@
 		"zone":         c.zone,
 		"resourceView": c.resourceView,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -979,7 +987,7 @@
 		"zone":         c.zone,
 		"resourceView": c.resourceView,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1087,7 +1095,7 @@
 		"zone":    c.zone,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1201,7 +1209,7 @@
 		"project": c.project,
 		"zone":    c.zone,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1364,7 +1372,7 @@
 		"zone":         c.zone,
 		"resourceView": c.resourceView,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1520,7 +1528,7 @@
 		"resourceView": c.resourceView,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1630,7 +1638,7 @@
 		"resourceView": c.resourceView,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/siteverification/v1/siteverification-gen.go b/siteverification/v1/siteverification-gen.go
index b013361..8f4e9cd 100644
--- a/siteverification/v1/siteverification-gen.go
+++ b/siteverification/v1/siteverification-gen.go
@@ -60,12 +60,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	WebResource *WebResourceService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewWebResourceService(s *Service) *WebResourceService {
 	rs := &WebResourceService{s: s}
 	return rs
@@ -175,7 +183,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -244,7 +252,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"id": c.id,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -325,7 +333,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -401,7 +409,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -477,7 +485,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -551,7 +559,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -638,7 +646,7 @@
 		"id": c.id,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/spectrum/v1explorer/spectrum-gen.go b/spectrum/v1explorer/spectrum-gen.go
index 09987e0..cb92874 100644
--- a/spectrum/v1explorer/spectrum-gen.go
+++ b/spectrum/v1explorer/spectrum-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Paws *PawsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewPawsService(s *Service) *PawsService {
 	rs := &PawsService{s: s}
 	return rs
@@ -1004,7 +1012,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1074,7 +1082,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1144,7 +1152,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1217,7 +1225,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1288,7 +1296,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1360,7 +1368,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/sqladmin/v1beta1/sqladmin-gen.go b/sqladmin/v1beta1/sqladmin-gen.go
index 102ec50..5d52dc5 100644
--- a/sqladmin/v1beta1/sqladmin-gen.go
+++ b/sqladmin/v1beta1/sqladmin-gen.go
@@ -63,8 +63,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BackupRuns *BackupRunsService
 
@@ -75,6 +76,13 @@
 	Tiers *TiersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBackupRunsService(s *Service) *BackupRunsService {
 	rs := &BackupRunsService{s: s}
 	return rs
@@ -528,7 +536,7 @@
 		"instance":            c.instance,
 		"backupConfiguration": c.backupConfiguration,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -655,7 +663,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -760,7 +768,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -856,7 +864,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -946,7 +954,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1042,7 +1050,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1136,7 +1144,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1238,7 +1246,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1340,7 +1348,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1430,7 +1438,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1523,7 +1531,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1634,7 +1642,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1729,7 +1737,7 @@
 		"instance":  c.instance,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1846,7 +1854,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1938,7 +1946,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/sqladmin/v1beta3/sqladmin-gen.go b/sqladmin/v1beta3/sqladmin-gen.go
index f949232..4c99801 100644
--- a/sqladmin/v1beta3/sqladmin-gen.go
+++ b/sqladmin/v1beta3/sqladmin-gen.go
@@ -65,8 +65,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BackupRuns *BackupRunsService
 
@@ -81,6 +82,13 @@
 	Tiers *TiersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBackupRunsService(s *Service) *BackupRunsService {
 	rs := &BackupRunsService{s: s}
 	return rs
@@ -872,7 +880,7 @@
 		"instance":            c.instance,
 		"backupConfiguration": c.backupConfiguration,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -997,7 +1005,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1096,7 +1104,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1170,7 +1178,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1253,7 +1261,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1349,7 +1357,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1438,7 +1446,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1534,7 +1542,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1628,7 +1636,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1730,7 +1738,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1830,7 +1838,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1921,7 +1929,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2009,7 +2017,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2096,7 +2104,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2189,7 +2197,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2299,7 +2307,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2397,7 +2405,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2492,7 +2500,7 @@
 		"instance":  c.instance,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2608,7 +2616,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2709,7 +2717,7 @@
 		"instance":        c.instance,
 		"sha1Fingerprint": c.sha1Fingerprint,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2807,7 +2815,7 @@
 		"instance":        c.instance,
 		"sha1Fingerprint": c.sha1Fingerprint,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2910,7 +2918,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3001,7 +3009,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3086,7 +3094,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/sqladmin/v1beta4/sqladmin-gen.go b/sqladmin/v1beta4/sqladmin-gen.go
index cac5fb4..c90b563 100644
--- a/sqladmin/v1beta4/sqladmin-gen.go
+++ b/sqladmin/v1beta4/sqladmin-gen.go
@@ -67,8 +67,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BackupRuns *BackupRunsService
 
@@ -87,6 +88,13 @@
 	Users *UsersService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBackupRunsService(s *Service) *BackupRunsService {
 	rs := &BackupRunsService{s: s}
 	return rs
@@ -929,7 +937,7 @@
 		"instance": c.instance,
 		"id":       strconv.FormatInt(c.id, 10),
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1047,7 +1055,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1149,7 +1157,7 @@
 		"instance": c.instance,
 		"database": c.database,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1247,7 +1255,7 @@
 		"instance": c.instance,
 		"database": c.database,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1350,7 +1358,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1440,7 +1448,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1539,7 +1547,7 @@
 		"database": c.database,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1648,7 +1656,7 @@
 		"database": c.database,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1739,7 +1747,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1817,7 +1825,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1907,7 +1915,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2003,7 +2011,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2093,7 +2101,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2189,7 +2197,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2283,7 +2291,7 @@
 		"project": c.project,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2385,7 +2393,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2487,7 +2495,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2578,7 +2586,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2669,7 +2677,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2756,7 +2764,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2851,7 +2859,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2941,7 +2949,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3028,7 +3036,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3125,7 +3133,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3217,7 +3225,7 @@
 		"project":   c.project,
 		"operation": c.operation,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3327,7 +3335,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3429,7 +3437,7 @@
 		"instance":        c.instance,
 		"sha1Fingerprint": c.sha1Fingerprint,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3528,7 +3536,7 @@
 		"instance":        c.instance,
 		"sha1Fingerprint": c.sha1Fingerprint,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3632,7 +3640,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3722,7 +3730,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3807,7 +3815,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"project": c.project,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3893,7 +3901,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4002,7 +4010,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4092,7 +4100,7 @@
 		"project":  c.project,
 		"instance": c.instance,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4193,7 +4201,7 @@
 		"instance": c.instance,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/storage/v1/storage-gen.go b/storage/v1/storage-gen.go
index 5c9c619..0d7fa6c 100644
--- a/storage/v1/storage-gen.go
+++ b/storage/v1/storage-gen.go
@@ -71,8 +71,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BucketAccessControls *BucketAccessControlsService
 
@@ -87,6 +88,13 @@
 	Objects *ObjectsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBucketAccessControlsService(s *Service) *BucketAccessControlsService {
 	rs := &BucketAccessControlsService{s: s}
 	return rs
@@ -693,7 +701,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -773,7 +781,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -864,7 +872,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -943,7 +951,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1031,7 +1039,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1128,7 +1136,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1236,7 +1244,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1353,7 +1361,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1497,7 +1505,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1671,7 +1679,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1843,7 +1851,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2052,7 +2060,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2202,7 +2210,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2271,7 +2279,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2351,7 +2359,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2443,7 +2451,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2545,7 +2553,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2645,7 +2653,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2742,7 +2750,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2846,7 +2854,7 @@
 		"object": c.object,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2953,7 +2961,7 @@
 		"object": c.object,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3071,7 +3079,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3177,7 +3185,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3292,7 +3300,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3416,7 +3424,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3560,7 +3568,7 @@
 		"destinationObject": c.destinationObject,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3827,7 +3835,7 @@
 		"destinationObject": c.destinationObject,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4079,7 +4087,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4256,7 +4264,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4544,7 +4552,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4557,6 +4565,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -4792,7 +4801,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5000,7 +5009,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5239,7 +5248,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5466,7 +5475,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/storage/v1beta1/storage-gen.go b/storage/v1beta1/storage-gen.go
index 9c97cec..dbf1287 100644
--- a/storage/v1beta1/storage-gen.go
+++ b/storage/v1beta1/storage-gen.go
@@ -66,8 +66,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BucketAccessControls *BucketAccessControlsService
 
@@ -78,6 +79,13 @@
 	Objects *ObjectsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBucketAccessControlsService(s *Service) *BucketAccessControlsService {
 	rs := &BucketAccessControlsService{s: s}
 	return rs
@@ -435,7 +443,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -515,7 +523,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -606,7 +614,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -685,7 +693,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -773,7 +781,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -870,7 +878,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -956,7 +964,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1036,7 +1044,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1143,7 +1151,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1257,7 +1265,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1379,7 +1387,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1490,7 +1498,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1590,7 +1598,7 @@
 		"object": c.object,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1680,7 +1688,7 @@
 		"object": c.object,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1781,7 +1789,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1870,7 +1878,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1968,7 +1976,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2075,7 +2083,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2171,7 +2179,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2261,7 +2269,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2449,7 +2457,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2462,6 +2470,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -2636,7 +2645,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2772,7 +2781,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2893,7 +2902,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/storage/v1beta2/storage-gen.go b/storage/v1beta2/storage-gen.go
index bd4702f..9fce74c 100644
--- a/storage/v1beta2/storage-gen.go
+++ b/storage/v1beta2/storage-gen.go
@@ -68,8 +68,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BucketAccessControls *BucketAccessControlsService
 
@@ -84,6 +85,13 @@
 	Objects *ObjectsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBucketAccessControlsService(s *Service) *BucketAccessControlsService {
 	rs := &BucketAccessControlsService{s: s}
 	return rs
@@ -658,7 +666,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -738,7 +746,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -829,7 +837,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -908,7 +916,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -996,7 +1004,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1093,7 +1101,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1203,7 +1211,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1319,7 +1327,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1441,7 +1449,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1564,7 +1572,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1709,7 +1717,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1856,7 +1864,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1965,7 +1973,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2033,7 +2041,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2113,7 +2121,7 @@
 		"bucket": c.bucket,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2205,7 +2213,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2307,7 +2315,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2407,7 +2415,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2504,7 +2512,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2608,7 +2616,7 @@
 		"object": c.object,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2715,7 +2723,7 @@
 		"object": c.object,
 		"entity": c.entity,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2833,7 +2841,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2939,7 +2947,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3054,7 +3062,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3178,7 +3186,7 @@
 		"entity": c.entity,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3311,7 +3319,7 @@
 		"destinationObject": c.destinationObject,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3545,7 +3553,7 @@
 		"destinationObject": c.destinationObject,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3775,7 +3783,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3951,7 +3959,7 @@
 		"bucket": c.bucket,
 		"object": c.object,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4214,7 +4222,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4227,6 +4235,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -4435,7 +4444,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"bucket": c.bucket,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4632,7 +4641,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4839,7 +4848,7 @@
 		"object": c.object,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5044,7 +5053,7 @@
 		"bucket": c.bucket,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/tagmanager/v1/tagmanager-gen.go b/tagmanager/v1/tagmanager-gen.go
index 396f5e4..9457a96 100644
--- a/tagmanager/v1/tagmanager-gen.go
+++ b/tagmanager/v1/tagmanager-gen.go
@@ -75,12 +75,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Accounts *AccountsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Containers = NewAccountsContainersService(s)
@@ -787,7 +795,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -861,7 +869,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -947,7 +955,7 @@
 		"accountId": c.accountId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1039,7 +1047,7 @@
 		"accountId": c.accountId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1121,7 +1129,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1200,7 +1208,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1284,7 +1292,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1383,7 +1391,7 @@
 		"containerId": c.containerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1485,7 +1493,7 @@
 		"containerId": c.containerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1577,7 +1585,7 @@
 		"containerId": c.containerId,
 		"macroId":     c.macroId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -1666,7 +1674,7 @@
 		"containerId": c.containerId,
 		"macroId":     c.macroId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1760,7 +1768,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1868,7 +1876,7 @@
 		"macroId":     c.macroId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1977,7 +1985,7 @@
 		"containerId": c.containerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2069,7 +2077,7 @@
 		"containerId": c.containerId,
 		"ruleId":      c.ruleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2158,7 +2166,7 @@
 		"containerId": c.containerId,
 		"ruleId":      c.ruleId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2252,7 +2260,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2360,7 +2368,7 @@
 		"ruleId":      c.ruleId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2469,7 +2477,7 @@
 		"containerId": c.containerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2561,7 +2569,7 @@
 		"containerId": c.containerId,
 		"tagId":       c.tagId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -2650,7 +2658,7 @@
 		"containerId": c.containerId,
 		"tagId":       c.tagId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2744,7 +2752,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2852,7 +2860,7 @@
 		"tagId":       c.tagId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -2961,7 +2969,7 @@
 		"containerId": c.containerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3053,7 +3061,7 @@
 		"containerId": c.containerId,
 		"triggerId":   c.triggerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3142,7 +3150,7 @@
 		"containerId": c.containerId,
 		"triggerId":   c.triggerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3236,7 +3244,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3345,7 +3353,7 @@
 		"triggerId":   c.triggerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3454,7 +3462,7 @@
 		"containerId": c.containerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3546,7 +3554,7 @@
 		"containerId": c.containerId,
 		"variableId":  c.variableId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3635,7 +3643,7 @@
 		"containerId": c.containerId,
 		"variableId":  c.variableId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3729,7 +3737,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3838,7 +3846,7 @@
 		"variableId":  c.variableId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3947,7 +3955,7 @@
 		"containerId": c.containerId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4039,7 +4047,7 @@
 		"containerId":        c.containerId,
 		"containerVersionId": c.containerVersionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4128,7 +4136,7 @@
 		"containerId":        c.containerId,
 		"containerVersionId": c.containerVersionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4233,7 +4241,7 @@
 		"accountId":   c.accountId,
 		"containerId": c.containerId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4341,7 +4349,7 @@
 		"containerId":        c.containerId,
 		"containerVersionId": c.containerVersionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4445,7 +4453,7 @@
 		"containerId":        c.containerId,
 		"containerVersionId": c.containerVersionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4541,7 +4549,7 @@
 		"containerId":        c.containerId,
 		"containerVersionId": c.containerVersionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4656,7 +4664,7 @@
 		"containerVersionId": c.containerVersionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4762,7 +4770,7 @@
 		"accountId": c.accountId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4845,7 +4853,7 @@
 		"accountId":    c.accountId,
 		"permissionId": c.permissionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -4924,7 +4932,7 @@
 		"accountId":    c.accountId,
 		"permissionId": c.permissionId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5008,7 +5016,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"accountId": c.accountId,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5095,7 +5103,7 @@
 		"permissionId": c.permissionId,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/taskqueue/v1beta1/taskqueue-gen.go b/taskqueue/v1beta1/taskqueue-gen.go
index bed465d..74ed4d0 100644
--- a/taskqueue/v1beta1/taskqueue-gen.go
+++ b/taskqueue/v1beta1/taskqueue-gen.go
@@ -61,14 +61,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Taskqueues *TaskqueuesService
 
 	Tasks *TasksService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewTaskqueuesService(s *Service) *TaskqueuesService {
 	rs := &TaskqueuesService{s: s}
 	return rs
@@ -227,7 +235,7 @@
 		"project":   c.project,
 		"taskqueue": c.taskqueue,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -322,7 +330,7 @@
 		"taskqueue": c.taskqueue,
 		"task":      c.task,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -412,7 +420,7 @@
 		"taskqueue": c.taskqueue,
 		"task":      c.task,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -512,7 +520,7 @@
 		"project":   c.project,
 		"taskqueue": c.taskqueue,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -615,7 +623,7 @@
 		"project":   c.project,
 		"taskqueue": c.taskqueue,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/taskqueue/v1beta2/taskqueue-gen.go b/taskqueue/v1beta2/taskqueue-gen.go
index 7d780ab..7648158 100644
--- a/taskqueue/v1beta2/taskqueue-gen.go
+++ b/taskqueue/v1beta2/taskqueue-gen.go
@@ -61,14 +61,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Taskqueues *TaskqueuesService
 
 	Tasks *TasksService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewTaskqueuesService(s *Service) *TaskqueuesService {
 	rs := &TaskqueuesService{s: s}
 	return rs
@@ -234,7 +242,7 @@
 		"project":   c.project,
 		"taskqueue": c.taskqueue,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -329,7 +337,7 @@
 		"taskqueue": c.taskqueue,
 		"task":      c.task,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -419,7 +427,7 @@
 		"taskqueue": c.taskqueue,
 		"task":      c.task,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -521,7 +529,7 @@
 		"taskqueue": c.taskqueue,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -639,7 +647,7 @@
 		"project":   c.project,
 		"taskqueue": c.taskqueue,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -752,7 +760,7 @@
 		"project":   c.project,
 		"taskqueue": c.taskqueue,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -854,7 +862,7 @@
 		"task":      c.task,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -971,7 +979,7 @@
 		"task":      c.task,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/tasks/v1/tasks-gen.go b/tasks/v1/tasks-gen.go
index 6fc7283..4d93301 100644
--- a/tasks/v1/tasks-gen.go
+++ b/tasks/v1/tasks-gen.go
@@ -61,14 +61,22 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Tasklists *TasklistsService
 
 	Tasks *TasksService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewTasklistsService(s *Service) *TasklistsService {
 	rs := &TasklistsService{s: s}
 	return rs
@@ -248,7 +256,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"tasklist": c.tasklistid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -317,7 +325,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"tasklist": c.tasklistid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -399,7 +407,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -483,7 +491,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -571,7 +579,7 @@
 		"tasklist": c.tasklistid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -658,7 +666,7 @@
 		"tasklist": c.tasklistid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -739,7 +747,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"tasklist": c.tasklistid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -811,7 +819,7 @@
 		"tasklist": c.tasklistid,
 		"task":     c.taskid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -890,7 +898,7 @@
 		"tasklist": c.tasklistid,
 		"task":     c.taskid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1003,7 +1011,7 @@
 		"tasklist": c.tasklistid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1200,7 +1208,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"tasklist": c.tasklistid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1355,7 +1363,7 @@
 		"tasklist": c.tasklistid,
 		"task":     c.taskid,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1460,7 +1468,7 @@
 		"task":     c.taskid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1557,7 +1565,7 @@
 		"task":     c.taskid,
 	})
 	req.Header.Set("Content-Type", ctype)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/translate/v2/translate-gen.go b/translate/v2/translate-gen.go
index fa59c86..38257c5 100644
--- a/translate/v2/translate-gen.go
+++ b/translate/v2/translate-gen.go
@@ -53,8 +53,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Detections *DetectionsService
 
@@ -63,6 +64,13 @@
 	Translations *TranslationsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewDetectionsService(s *Service) *DetectionsService {
 	rs := &DetectionsService{s: s}
 	return rs
@@ -177,7 +185,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -257,7 +265,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -359,7 +367,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/urlshortener/v1/urlshortener-gen.go b/urlshortener/v1/urlshortener-gen.go
index 600aca7..f2f241c 100644
--- a/urlshortener/v1/urlshortener-gen.go
+++ b/urlshortener/v1/urlshortener-gen.go
@@ -57,12 +57,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Url *UrlService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewUrlService(s *Service) *UrlService {
 	rs := &UrlService{s: s}
 	return rs
@@ -215,7 +223,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -307,7 +315,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -391,7 +399,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/webfonts/v1/webfonts-gen.go b/webfonts/v1/webfonts-gen.go
index 305e0e4..9e4c5db 100644
--- a/webfonts/v1/webfonts-gen.go
+++ b/webfonts/v1/webfonts-gen.go
@@ -51,12 +51,20 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Webfonts *WebfontsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewWebfontsService(s *Service) *WebfontsService {
 	rs := &WebfontsService{s: s}
 	return rs
@@ -145,7 +153,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
diff --git a/webmasters/v3/webmasters-gen.go b/webmasters/v3/webmasters-gen.go
index 3266c53..6894a48 100644
--- a/webmasters/v3/webmasters-gen.go
+++ b/webmasters/v3/webmasters-gen.go
@@ -63,8 +63,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Sitemaps *SitemapsService
 
@@ -75,6 +76,13 @@
 	Urlcrawlerrorssamples *UrlcrawlerrorssamplesService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewSitemapsService(s *Service) *SitemapsService {
 	rs := &SitemapsService{s: s}
 	return rs
@@ -274,7 +282,7 @@
 		"siteUrl":  c.siteUrl,
 		"feedpath": c.feedpath,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -353,7 +361,7 @@
 		"siteUrl":  c.siteUrl,
 		"feedpath": c.feedpath,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -447,7 +455,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"siteUrl": c.siteUrl,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -532,7 +540,7 @@
 		"siteUrl":  c.siteUrl,
 		"feedpath": c.feedpath,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -608,7 +616,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"siteUrl": c.siteUrl,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -678,7 +686,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"siteUrl": c.siteUrl,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -747,7 +755,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"siteUrl": c.siteUrl,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -820,7 +828,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -919,7 +927,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"siteUrl": c.siteUrl,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1051,7 +1059,7 @@
 		"siteUrl": c.siteUrl,
 		"url":     c.url,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1186,7 +1194,7 @@
 	googleapi.Expand(req.URL, map[string]string{
 		"siteUrl": c.siteUrl,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1317,7 +1325,7 @@
 		"siteUrl": c.siteUrl,
 		"url":     c.url,
 	})
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
diff --git a/youtube/v3/youtube-api.json b/youtube/v3/youtube-api.json
index 61e44cf..c3ddaee 100644
--- a/youtube/v3/youtube-api.json
+++ b/youtube/v3/youtube-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/e9llQCBHLfl4GdN8_SFJWpjcLpU\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/HVk1_aaqWFJChNS_pb8qXf9T_6g\"",
  "discoveryVersion": "v1",
  "id": "youtube:v3",
  "name": "youtube",
  "canonicalName": "YouTube",
  "version": "v3",
- "revision": "20150218",
+ "revision": "20150309",
  "title": "YouTube Data API",
  "description": "Programmatic access to YouTube features.",
  "ownerDomain": "google.com",
@@ -73,6 +73,9 @@
     "https://www.googleapis.com/auth/youtube": {
      "description": "Manage your YouTube account"
     },
+    "https://www.googleapis.com/auth/youtube.force-ssl": {
+     "description": "Manage your YouTube account"
+    },
     "https://www.googleapis.com/auth/youtube.readonly": {
      "description": "View your YouTube account"
     },
@@ -5551,7 +5554,8 @@
       "$ref": "Activity"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "list": {
@@ -5621,6 +5625,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly"
      ]
     }
@@ -5648,6 +5653,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.upload"
      ],
      "supportsMediaUpload": true,
@@ -5697,6 +5703,7 @@
      ],
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -5734,6 +5741,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -5778,6 +5786,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -5811,6 +5820,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     }
@@ -5888,6 +5898,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner",
       "https://www.googleapis.com/auth/youtubepartner-channel-audit"
@@ -5922,6 +5933,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     }
@@ -5966,6 +5978,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -6001,6 +6014,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -6036,6 +6050,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -6086,7 +6101,8 @@
       "$ref": "LiveBroadcast"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "control": {
@@ -6143,7 +6159,8 @@
       "$ref": "LiveBroadcast"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "delete": {
@@ -6173,7 +6190,8 @@
       "id"
      ],
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "insert": {
@@ -6209,7 +6227,8 @@
       "$ref": "LiveBroadcast"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "list": {
@@ -6284,6 +6303,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly"
      ]
     },
@@ -6341,7 +6361,8 @@
       "$ref": "LiveBroadcast"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "update": {
@@ -6377,7 +6398,8 @@
       "$ref": "LiveBroadcast"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     }
    }
@@ -6411,7 +6433,8 @@
       "id"
      ],
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "insert": {
@@ -6447,7 +6470,8 @@
       "$ref": "LiveStream"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     },
     "list": {
@@ -6505,6 +6529,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly"
      ]
     },
@@ -6541,7 +6566,8 @@
       "$ref": "LiveStream"
      },
      "scopes": [
-      "https://www.googleapis.com/auth/youtube"
+      "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl"
      ]
     }
    }
@@ -6566,6 +6592,7 @@
      ],
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -6598,6 +6625,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -6656,6 +6684,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ],
@@ -6685,6 +6714,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     }
@@ -6715,6 +6745,7 @@
      ],
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -6752,6 +6783,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -6815,6 +6847,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -6848,6 +6881,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     }
@@ -7151,6 +7185,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -7177,6 +7212,7 @@
      ],
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -7204,6 +7240,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -7293,6 +7330,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -7327,6 +7365,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.upload",
       "https://www.googleapis.com/auth/youtubepartner"
      ],
@@ -7391,6 +7430,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -7422,6 +7462,7 @@
      ],
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -7451,6 +7492,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -7504,6 +7546,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.upload",
       "https://www.googleapis.com/auth/youtubepartner"
      ],
@@ -7616,6 +7659,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.readonly",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
@@ -7660,6 +7704,7 @@
      ],
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     },
@@ -7692,6 +7737,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     }
@@ -7725,6 +7771,7 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtube.upload",
       "https://www.googleapis.com/auth/youtubepartner"
      ],
@@ -7771,6 +7818,7 @@
      ],
      "scopes": [
       "https://www.googleapis.com/auth/youtube",
+      "https://www.googleapis.com/auth/youtube.force-ssl",
       "https://www.googleapis.com/auth/youtubepartner"
      ]
     }
diff --git a/youtube/v3/youtube-gen.go b/youtube/v3/youtube-gen.go
index 0fbbdaa..aa18c51 100644
--- a/youtube/v3/youtube-gen.go
+++ b/youtube/v3/youtube-gen.go
@@ -46,6 +46,9 @@
 	// Manage your YouTube account
 	YoutubeScope = "https://www.googleapis.com/auth/youtube"
 
+	// Manage your YouTube account
+	YoutubeForceSslScope = "https://www.googleapis.com/auth/youtube.force-ssl"
+
 	// View your YouTube account
 	YoutubeReadonlyScope = "https://www.googleapis.com/auth/youtube.readonly"
 
@@ -86,8 +89,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	Activities *ActivitiesService
 
@@ -124,6 +128,13 @@
 	Watermarks *WatermarksService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -3220,7 +3231,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3257,7 +3268,8 @@
 	//     "$ref": "Activity"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -3401,7 +3413,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3482,6 +3494,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly"
 	//   ]
 	// }
@@ -3621,7 +3634,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3634,6 +3647,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -3689,6 +3703,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.upload"
 	//   ],
 	//   "supportsMediaUpload": true
@@ -3753,7 +3768,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -3786,6 +3801,7 @@
 	//   "path": "channelSections",
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -3888,7 +3904,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -3936,6 +3952,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -4034,7 +4051,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4089,6 +4106,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -4161,7 +4179,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4204,6 +4222,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -4357,7 +4376,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4441,6 +4460,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner",
 	//     "https://www.googleapis.com/auth/youtubepartner-channel-audit"
@@ -4510,7 +4530,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4553,6 +4573,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -4629,7 +4650,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4680,6 +4701,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -4732,7 +4754,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4773,6 +4795,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -4825,7 +4848,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -4866,6 +4889,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -4978,7 +5002,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5034,7 +5058,8 @@
 	//     "$ref": "LiveBroadcast"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -5179,7 +5204,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5247,7 +5272,8 @@
 	//     "$ref": "LiveBroadcast"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -5341,7 +5367,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -5378,7 +5404,8 @@
 	//   },
 	//   "path": "liveBroadcasts",
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -5480,7 +5507,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5527,7 +5554,8 @@
 	//     "$ref": "LiveBroadcast"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -5680,7 +5708,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5766,6 +5794,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly"
 	//   ]
 	// }
@@ -5872,7 +5901,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -5940,7 +5969,8 @@
 	//     "$ref": "LiveBroadcast"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -6044,7 +6074,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6091,7 +6121,8 @@
 	//     "$ref": "LiveBroadcast"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -6185,7 +6216,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6222,7 +6253,8 @@
 	//   },
 	//   "path": "liveStreams",
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -6326,7 +6358,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6373,7 +6405,8 @@
 	//     "$ref": "LiveStream"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -6516,7 +6549,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6585,6 +6618,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly"
 	//   ]
 	// }
@@ -6689,7 +6723,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6736,7 +6770,8 @@
 	//     "$ref": "LiveStream"
 	//   },
 	//   "scopes": [
-	//     "https://www.googleapis.com/auth/youtube"
+	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl"
 	//   ]
 	// }
 
@@ -6777,7 +6812,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -6805,6 +6840,7 @@
 	//   "path": "playlistItems",
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -6876,7 +6912,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -6919,6 +6955,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -7042,7 +7079,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7111,6 +7148,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ],
@@ -7163,7 +7201,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7201,6 +7239,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -7264,7 +7303,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -7297,6 +7336,7 @@
 	//   "path": "playlists",
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -7399,7 +7439,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7447,6 +7487,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -7601,7 +7642,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7675,6 +7716,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -7748,7 +7790,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -7791,6 +7833,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -8194,7 +8237,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8504,6 +8547,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -8546,7 +8590,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -8574,6 +8618,7 @@
 	//   "path": "subscriptions",
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -8623,7 +8668,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8661,6 +8706,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -8846,7 +8892,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -8946,6 +8992,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -9069,7 +9116,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9082,6 +9129,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -9143,6 +9191,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.upload",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ],
@@ -9220,7 +9269,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9271,6 +9320,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -9335,7 +9385,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -9368,6 +9418,7 @@
 	//   "path": "videos",
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -9432,7 +9483,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9472,6 +9523,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -9667,7 +9719,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -9680,6 +9732,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -9764,6 +9817,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.upload",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ],
@@ -9945,7 +9999,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10049,6 +10103,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.readonly",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
@@ -10117,7 +10172,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -10167,6 +10222,7 @@
 	//   "path": "videos/rate",
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -10238,7 +10294,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -10281,6 +10337,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
@@ -10407,7 +10464,7 @@
 	} else {
 		req.Header.Set("Content-Type", ctype)
 	}
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -10420,6 +10477,7 @@
 		loc := res.Header.Get("Location")
 		rx := &googleapi.ResumableUpload{
 			Client:        c.s.client,
+			UserAgent:     c.s.userAgent(),
 			URI:           loc,
 			Media:         c.resumable_,
 			MediaType:     c.mediaType_,
@@ -10477,6 +10535,7 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtube.upload",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ],
@@ -10538,7 +10597,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("POST", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -10571,6 +10630,7 @@
 	//   "path": "watermarks/unset",
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/youtube",
+	//     "https://www.googleapis.com/auth/youtube.force-ssl",
 	//     "https://www.googleapis.com/auth/youtubepartner"
 	//   ]
 	// }
diff --git a/youtubeanalytics/v1/youtubeanalytics-api.json b/youtubeanalytics/v1/youtubeanalytics-api.json
index b2be6cb..5913f52 100644
--- a/youtubeanalytics/v1/youtubeanalytics-api.json
+++ b/youtubeanalytics/v1/youtubeanalytics-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/mgPC2o6emzAE7yocMVmScgLphrM\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/lfXuvexGjLWvv2bGYOX_MVmrKM4\"",
  "discoveryVersion": "v1",
  "id": "youtubeAnalytics:v1",
  "name": "youtubeAnalytics",
  "canonicalName": "YouTube Analytics",
  "version": "v1",
- "revision": "20150213",
+ "revision": "20150304",
  "title": "YouTube Analytics API",
  "description": "Retrieve your YouTube Analytics reports.",
  "ownerDomain": "google.com",
@@ -638,6 +638,12 @@
      "httpMethod": "GET",
      "description": "Retrieve your YouTube Analytics reports.",
      "parameters": {
+      "currency": {
+       "type": "string",
+       "description": "The currency to which financial metrics should be converted. The default is US Dollar (USD). If the result contains no financial metrics, this flag will be ignored. Responds with an error if the specified currency is not recognized.",
+       "pattern": "[A-Z]{3}",
+       "location": "query"
+      },
       "dimensions": {
        "type": "string",
        "description": "A comma-separated list of YouTube Analytics dimensions, such as views or ageGroup,gender. See the Available Reports document for a list of the reports that you can retrieve and the dimensions used for those reports. Also see the Dimensions document for definitions of those dimensions.",
diff --git a/youtubeanalytics/v1/youtubeanalytics-gen.go b/youtubeanalytics/v1/youtubeanalytics-gen.go
index ae2451e..f7a5036 100644
--- a/youtubeanalytics/v1/youtubeanalytics-gen.go
+++ b/youtubeanalytics/v1/youtubeanalytics-gen.go
@@ -73,8 +73,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BatchReportDefinitions *BatchReportDefinitionsService
 
@@ -87,6 +88,13 @@
 	Reports *ReportsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBatchReportDefinitionsService(s *Service) *BatchReportDefinitionsService {
 	rs := &BatchReportDefinitionsService{s: s}
 	return rs
@@ -352,7 +360,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -431,7 +439,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -536,7 +544,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -637,7 +645,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -735,7 +743,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -840,7 +848,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -941,7 +949,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1061,7 +1069,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1173,7 +1181,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1234,6 +1242,16 @@
 	return c
 }
 
+// Currency sets the optional parameter "currency": The currency to
+// which financial metrics should be converted. The default is US Dollar
+// (USD). If the result contains no financial metrics, this flag will be
+// ignored. Responds with an error if the specified currency is not
+// recognized.
+func (c *ReportsQueryCall) Currency(currency string) *ReportsQueryCall {
+	c.opt_["currency"] = currency
+	return c
+}
+
 // Dimensions sets the optional parameter "dimensions": A
 // comma-separated list of YouTube Analytics dimensions, such as views
 // or ageGroup,gender. See the Available Reports document for a list of
@@ -1300,6 +1318,9 @@
 	params.Set("ids", fmt.Sprintf("%v", c.ids))
 	params.Set("metrics", fmt.Sprintf("%v", c.metrics))
 	params.Set("start-date", fmt.Sprintf("%v", c.startDate))
+	if v, ok := c.opt_["currency"]; ok {
+		params.Set("currency", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["dimensions"]; ok {
 		params.Set("dimensions", fmt.Sprintf("%v", v))
 	}
@@ -1322,7 +1343,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1347,6 +1368,12 @@
 	//     "metrics"
 	//   ],
 	//   "parameters": {
+	//     "currency": {
+	//       "description": "The currency to which financial metrics should be converted. The default is US Dollar (USD). If the result contains no financial metrics, this flag will be ignored. Responds with an error if the specified currency is not recognized.",
+	//       "location": "query",
+	//       "pattern": "[A-Z]{3}",
+	//       "type": "string"
+	//     },
 	//     "dimensions": {
 	//       "description": "A comma-separated list of YouTube Analytics dimensions, such as views or ageGroup,gender. See the Available Reports document for a list of the reports that you can retrieve and the dimensions used for those reports. Also see the Dimensions document for definitions of those dimensions.",
 	//       "location": "query",
diff --git a/youtubeanalytics/v1beta1/youtubeanalytics-api.json b/youtubeanalytics/v1beta1/youtubeanalytics-api.json
index c84bd6e..e79008b 100644
--- a/youtubeanalytics/v1beta1/youtubeanalytics-api.json
+++ b/youtubeanalytics/v1beta1/youtubeanalytics-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/qYnCbO50tBJQh7cxSXJ680n-meg\"",
+ "etag": "\"ye6orv2F-1npMW3u9suM3a7C5Bo/ID2nf7n7eRyIPf4mFz5QF1inEVE\"",
  "discoveryVersion": "v1",
  "id": "youtubeAnalytics:v1beta1",
  "name": "youtubeAnalytics",
  "canonicalName": "YouTube Analytics",
  "version": "v1beta1",
- "revision": "20150213",
+ "revision": "20150304",
  "title": "YouTube Analytics API",
  "description": "Retrieve your YouTube Analytics reports.",
  "ownerDomain": "google.com",
@@ -641,6 +641,12 @@
      "httpMethod": "GET",
      "description": "Retrieve your YouTube Analytics reports.",
      "parameters": {
+      "currency": {
+       "type": "string",
+       "description": "The currency to which financial metrics should be converted. The default is US Dollar (USD). If the result contains no financial metrics, this flag will be ignored. Responds with an error if the specified currency is not recognized.",
+       "pattern": "[A-Z]{3}",
+       "location": "query"
+      },
       "dimensions": {
        "type": "string",
        "description": "A comma-separated list of YouTube Analytics dimensions, such as views or ageGroup,gender. See the Available Reports document for a list of the reports that you can retrieve and the dimensions used for those reports. Also see the Dimensions document for definitions of those dimensions.",
diff --git a/youtubeanalytics/v1beta1/youtubeanalytics-gen.go b/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
index e1e8d6c..5a00729 100644
--- a/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
+++ b/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
@@ -73,8 +73,9 @@
 }
 
 type Service struct {
-	client   *http.Client
-	BasePath string // API endpoint base URL
+	client    *http.Client
+	BasePath  string // API endpoint base URL
+	UserAgent string // optional additional User-Agent fragment
 
 	BatchReportDefinitions *BatchReportDefinitionsService
 
@@ -87,6 +88,13 @@
 	Reports *ReportsService
 }
 
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
 func NewBatchReportDefinitionsService(s *Service) *BatchReportDefinitionsService {
 	rs := &BatchReportDefinitionsService{s: s}
 	return rs
@@ -352,7 +360,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -431,7 +439,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -536,7 +544,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -637,7 +645,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -735,7 +743,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -840,7 +848,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("DELETE", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return err
@@ -941,7 +949,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1061,7 +1069,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1173,7 +1181,7 @@
 	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")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1234,6 +1242,16 @@
 	return c
 }
 
+// Currency sets the optional parameter "currency": The currency to
+// which financial metrics should be converted. The default is US Dollar
+// (USD). If the result contains no financial metrics, this flag will be
+// ignored. Responds with an error if the specified currency is not
+// recognized.
+func (c *ReportsQueryCall) Currency(currency string) *ReportsQueryCall {
+	c.opt_["currency"] = currency
+	return c
+}
+
 // Dimensions sets the optional parameter "dimensions": A
 // comma-separated list of YouTube Analytics dimensions, such as views
 // or ageGroup,gender. See the Available Reports document for a list of
@@ -1300,6 +1318,9 @@
 	params.Set("ids", fmt.Sprintf("%v", c.ids))
 	params.Set("metrics", fmt.Sprintf("%v", c.metrics))
 	params.Set("start-date", fmt.Sprintf("%v", c.startDate))
+	if v, ok := c.opt_["currency"]; ok {
+		params.Set("currency", fmt.Sprintf("%v", v))
+	}
 	if v, ok := c.opt_["dimensions"]; ok {
 		params.Set("dimensions", fmt.Sprintf("%v", v))
 	}
@@ -1322,7 +1343,7 @@
 	urls += "?" + params.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	googleapi.SetOpaque(req.URL)
-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+	req.Header.Set("User-Agent", c.s.userAgent())
 	res, err := c.s.client.Do(req)
 	if err != nil {
 		return nil, err
@@ -1347,6 +1368,12 @@
 	//     "metrics"
 	//   ],
 	//   "parameters": {
+	//     "currency": {
+	//       "description": "The currency to which financial metrics should be converted. The default is US Dollar (USD). If the result contains no financial metrics, this flag will be ignored. Responds with an error if the specified currency is not recognized.",
+	//       "location": "query",
+	//       "pattern": "[A-Z]{3}",
+	//       "type": "string"
+	//     },
 	//     "dimensions": {
 	//       "description": "A comma-separated list of YouTube Analytics dimensions, such as views or ageGroup,gender. See the Available Reports document for a list of the reports that you can retrieve and the dimensions used for those reports. Also see the Dimensions document for definitions of those dimensions.",
 	//       "location": "query",