diff --git a/debugger/apiv2/controller2_client.go b/debugger/apiv2/controller2_client.go
index 24e7a14..041f99f 100644
--- a/debugger/apiv2/controller2_client.go
+++ b/debugger/apiv2/controller2_client.go
@@ -57,17 +57,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &Controller2CallOptions{
 		RegisterDebuggee:       retry[[2]string{"default", "non_idempotent"}],
diff --git a/debugger/apiv2/debugger2_client.go b/debugger/apiv2/debugger2_client.go
index b5c39a2..b50aa2a 100644
--- a/debugger/apiv2/debugger2_client.go
+++ b/debugger/apiv2/debugger2_client.go
@@ -59,17 +59,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &Debugger2CallOptions{
 		SetBreakpoint:    retry[[2]string{"default", "non_idempotent"}],
diff --git a/debugger/apiv2/doc.go b/debugger/apiv2/doc.go
index 03b288f..f0b10ca 100644
--- a/debugger/apiv2/doc.go
+++ b/debugger/apiv2/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package debugger is an experimental, auto-generated package for the
-// debugger API.
+// Stackdriver Debugger API.
 //
 // Examines the call stack and variables of a running application
 // without stopping or slowing it down.
@@ -35,6 +35,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/debugger/apiv2/mock_test.go b/debugger/apiv2/mock_test.go
index ed29d4a..8295dfc 100644
--- a/debugger/apiv2/mock_test.go
+++ b/debugger/apiv2/mock_test.go
@@ -39,6 +39,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -241,7 +242,7 @@
 
 func TestDebugger2SetBreakpointError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDebugger2.err = grpc.Errorf(errCode, "test error")
+	mockDebugger2.err = gstatus.Error(errCode, "test error")
 
 	var debuggeeId string = "debuggeeId-997255898"
 	var breakpoint *clouddebuggerpb.Breakpoint = &clouddebuggerpb.Breakpoint{}
@@ -259,7 +260,9 @@
 
 	resp, err := c.SetBreakpoint(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -303,7 +306,7 @@
 
 func TestDebugger2GetBreakpointError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDebugger2.err = grpc.Errorf(errCode, "test error")
+	mockDebugger2.err = gstatus.Error(errCode, "test error")
 
 	var debuggeeId string = "debuggeeId-997255898"
 	var breakpointId string = "breakpointId498424873"
@@ -321,7 +324,9 @@
 
 	resp, err := c.GetBreakpoint(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -362,7 +367,7 @@
 
 func TestDebugger2DeleteBreakpointError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDebugger2.err = grpc.Errorf(errCode, "test error")
+	mockDebugger2.err = gstatus.Error(errCode, "test error")
 
 	var debuggeeId string = "debuggeeId-997255898"
 	var breakpointId string = "breakpointId498424873"
@@ -380,7 +385,9 @@
 
 	err = c.DeleteBreakpoint(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -424,7 +431,7 @@
 
 func TestDebugger2ListBreakpointsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDebugger2.err = grpc.Errorf(errCode, "test error")
+	mockDebugger2.err = gstatus.Error(errCode, "test error")
 
 	var debuggeeId string = "debuggeeId-997255898"
 	var clientVersion string = "clientVersion-1506231196"
@@ -440,7 +447,9 @@
 
 	resp, err := c.ListBreakpoints(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -482,7 +491,7 @@
 
 func TestDebugger2ListDebuggeesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDebugger2.err = grpc.Errorf(errCode, "test error")
+	mockDebugger2.err = gstatus.Error(errCode, "test error")
 
 	var project string = "project-309310695"
 	var clientVersion string = "clientVersion-1506231196"
@@ -498,7 +507,9 @@
 
 	resp, err := c.ListDebuggees(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -538,7 +549,7 @@
 
 func TestController2RegisterDebuggeeError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockController2.err = grpc.Errorf(errCode, "test error")
+	mockController2.err = gstatus.Error(errCode, "test error")
 
 	var debuggee *clouddebuggerpb.Debuggee = &clouddebuggerpb.Debuggee{}
 	var request = &clouddebuggerpb.RegisterDebuggeeRequest{
@@ -552,7 +563,9 @@
 
 	resp, err := c.RegisterDebuggee(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -597,7 +610,7 @@
 
 func TestController2ListActiveBreakpointsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockController2.err = grpc.Errorf(errCode, "test error")
+	mockController2.err = gstatus.Error(errCode, "test error")
 
 	var debuggeeId string = "debuggeeId-997255898"
 	var request = &clouddebuggerpb.ListActiveBreakpointsRequest{
@@ -611,7 +624,9 @@
 
 	resp, err := c.ListActiveBreakpoints(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -653,7 +668,7 @@
 
 func TestController2UpdateActiveBreakpointError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockController2.err = grpc.Errorf(errCode, "test error")
+	mockController2.err = gstatus.Error(errCode, "test error")
 
 	var debuggeeId string = "debuggeeId-997255898"
 	var breakpoint *clouddebuggerpb.Breakpoint = &clouddebuggerpb.Breakpoint{}
@@ -669,7 +684,9 @@
 
 	resp, err := c.UpdateActiveBreakpoint(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/errorreporting/apiv1beta1/doc.go b/errorreporting/apiv1beta1/doc.go
index 404b83f..351bf6f 100644
--- a/errorreporting/apiv1beta1/doc.go
+++ b/errorreporting/apiv1beta1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package errorreporting is an experimental, auto-generated package for the
-// errorreporting API.
+// Stackdriver Error Reporting API.
 //
 // Stackdriver Error Reporting groups and counts similar errors from cloud
 // services. The Stackdriver Error Reporting API provides a way to report new
@@ -34,6 +34,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/errorreporting/apiv1beta1/error_stats_client_example_test.go b/errorreporting/apiv1beta1/error_stats_client_example_test.go
index 6f7e9e6..edebae0 100644
--- a/errorreporting/apiv1beta1/error_stats_client_example_test.go
+++ b/errorreporting/apiv1beta1/error_stats_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/errorreporting/apiv1beta1"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	clouderrorreportingpb "google.golang.org/genproto/googleapis/devtools/clouderrorreporting/v1beta1"
 )
 
@@ -45,9 +46,11 @@
 	it := c.ListGroupStats(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -67,9 +70,11 @@
 	it := c.ListEvents(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/errorreporting/apiv1beta1/mock_test.go b/errorreporting/apiv1beta1/mock_test.go
index 3aea875..ccb9fe8 100644
--- a/errorreporting/apiv1beta1/mock_test.go
+++ b/errorreporting/apiv1beta1/mock_test.go
@@ -38,6 +38,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -234,7 +235,7 @@
 
 func TestErrorGroupServiceGetGroupError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockErrorGroup.err = grpc.Errorf(errCode, "test error")
+	mockErrorGroup.err = gstatus.Error(errCode, "test error")
 
 	var formattedGroupName string = ErrorGroupGroupPath("[PROJECT]", "[GROUP]")
 	var request = &clouderrorreportingpb.GetGroupRequest{
@@ -248,7 +249,9 @@
 
 	resp, err := c.GetGroup(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -293,7 +296,7 @@
 
 func TestErrorGroupServiceUpdateGroupError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockErrorGroup.err = grpc.Errorf(errCode, "test error")
+	mockErrorGroup.err = gstatus.Error(errCode, "test error")
 
 	var group *clouderrorreportingpb.ErrorGroup = &clouderrorreportingpb.ErrorGroup{}
 	var request = &clouderrorreportingpb.UpdateGroupRequest{
@@ -307,7 +310,9 @@
 
 	resp, err := c.UpdateGroup(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -365,7 +370,7 @@
 
 func TestErrorStatsServiceListGroupStatsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockErrorStats.err = grpc.Errorf(errCode, "test error")
+	mockErrorStats.err = gstatus.Error(errCode, "test error")
 
 	var formattedProjectName string = ErrorStatsProjectPath("[PROJECT]")
 	var timeRange *clouderrorreportingpb.QueryTimeRange = &clouderrorreportingpb.QueryTimeRange{}
@@ -381,7 +386,9 @@
 
 	resp, err := c.ListGroupStats(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -439,7 +446,7 @@
 
 func TestErrorStatsServiceListEventsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockErrorStats.err = grpc.Errorf(errCode, "test error")
+	mockErrorStats.err = gstatus.Error(errCode, "test error")
 
 	var formattedProjectName string = ErrorStatsProjectPath("[PROJECT]")
 	var groupId string = "groupId506361563"
@@ -455,7 +462,9 @@
 
 	resp, err := c.ListEvents(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -495,7 +504,7 @@
 
 func TestErrorStatsServiceDeleteEventsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockErrorStats.err = grpc.Errorf(errCode, "test error")
+	mockErrorStats.err = gstatus.Error(errCode, "test error")
 
 	var formattedProjectName string = ErrorStatsProjectPath("[PROJECT]")
 	var request = &clouderrorreportingpb.DeleteEventsRequest{
@@ -509,7 +518,9 @@
 
 	resp, err := c.DeleteEvents(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -551,7 +562,7 @@
 
 func TestReportErrorsServiceReportErrorEventError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockReportErrors.err = grpc.Errorf(errCode, "test error")
+	mockReportErrors.err = gstatus.Error(errCode, "test error")
 
 	var formattedProjectName string = ReportErrorsProjectPath("[PROJECT]")
 	var event *clouderrorreportingpb.ReportedErrorEvent = &clouderrorreportingpb.ReportedErrorEvent{}
@@ -567,7 +578,9 @@
 
 	resp, err := c.ReportErrorEvent(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/errorreporting/apiv1beta1/report_errors_client.go b/errorreporting/apiv1beta1/report_errors_client.go
index 49f53f5..189b85e 100644
--- a/errorreporting/apiv1beta1/report_errors_client.go
+++ b/errorreporting/apiv1beta1/report_errors_client.go
@@ -17,8 +17,6 @@
 package errorreporting
 
 import (
-	"time"
-
 	"cloud.google.com/go/internal/version"
 	gax "github.com/googleapis/gax-go"
 	"golang.org/x/net/context"
@@ -26,7 +24,6 @@
 	"google.golang.org/api/transport"
 	clouderrorreportingpb "google.golang.org/genproto/googleapis/devtools/clouderrorreporting/v1beta1"
 	"google.golang.org/grpc"
-	"google.golang.org/grpc/codes"
 )
 
 var (
@@ -46,19 +43,7 @@
 }
 
 func defaultReportErrorsCallOptions() *ReportErrorsCallOptions {
-	retry := map[[2]string][]gax.CallOption{
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
-	}
+	retry := map[[2]string][]gax.CallOption{}
 	return &ReportErrorsCallOptions{
 		ReportErrorEvent: retry[[2]string{"default", "non_idempotent"}],
 	}
diff --git a/iam/admin/apiv1/doc.go b/iam/admin/apiv1/doc.go
index 9fabd40..825facd 100644
--- a/iam/admin/apiv1/doc.go
+++ b/iam/admin/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package admin is an experimental, auto-generated package for the
-// admin API.
+// Google Identity and Access Management (IAM) API.
 //
 // Manages identity and access control for Google Cloud Platform resources,
 // including the creation of service accounts, which you can use to
@@ -34,6 +34,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/iam/admin/apiv1/iam_client.go b/iam/admin/apiv1/iam_client.go
index 1f222e5..89dff8e 100644
--- a/iam/admin/apiv1/iam_client.go
+++ b/iam/admin/apiv1/iam_client.go
@@ -77,17 +77,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &IamCallOptions{
 		ListServiceAccounts:     retry[[2]string{"default", "idempotent"}],
diff --git a/iam/admin/apiv1/iam_client_example_test.go b/iam/admin/apiv1/iam_client_example_test.go
index 983d48e..901fcb9 100644
--- a/iam/admin/apiv1/iam_client_example_test.go
+++ b/iam/admin/apiv1/iam_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/iam/admin/apiv1"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	adminpb "google.golang.org/genproto/googleapis/iam/admin/v1"
 	iampb "google.golang.org/genproto/googleapis/iam/v1"
 )
@@ -46,9 +47,11 @@
 	it := c.ListServiceAccounts(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/iam/admin/apiv1/mock_test.go b/iam/admin/apiv1/mock_test.go
index b3e576c..43ff01b 100644
--- a/iam/admin/apiv1/mock_test.go
+++ b/iam/admin/apiv1/mock_test.go
@@ -40,6 +40,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -309,7 +310,7 @@
 
 func TestIamListServiceAccountsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamProjectPath("[PROJECT]")
 	var request = &adminpb.ListServiceAccountsRequest{
@@ -323,7 +324,9 @@
 
 	resp, err := c.ListServiceAccounts(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -378,7 +381,7 @@
 
 func TestIamGetServiceAccountError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var request = &adminpb.GetServiceAccountRequest{
@@ -392,7 +395,9 @@
 
 	resp, err := c.GetServiceAccount(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -449,7 +454,7 @@
 
 func TestIamCreateServiceAccountError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamProjectPath("[PROJECT]")
 	var accountId string = "accountId-803333011"
@@ -465,7 +470,9 @@
 
 	resp, err := c.CreateServiceAccount(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -520,7 +527,7 @@
 
 func TestIamUpdateServiceAccountError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var etag []byte = []byte("21")
 	var request = &adminpb.ServiceAccount{
@@ -534,7 +541,9 @@
 
 	resp, err := c.UpdateServiceAccount(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -571,7 +580,7 @@
 
 func TestIamDeleteServiceAccountError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var request = &adminpb.DeleteServiceAccountRequest{
@@ -585,7 +594,9 @@
 
 	err = c.DeleteServiceAccount(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -624,7 +635,7 @@
 
 func TestIamListServiceAccountKeysError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var request = &adminpb.ListServiceAccountKeysRequest{
@@ -638,7 +649,9 @@
 
 	resp, err := c.ListServiceAccountKeys(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -685,7 +698,7 @@
 
 func TestIamGetServiceAccountKeyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamKeyPath("[PROJECT]", "[SERVICE_ACCOUNT]", "[KEY]")
 	var request = &adminpb.GetServiceAccountKeyRequest{
@@ -699,7 +712,9 @@
 
 	resp, err := c.GetServiceAccountKey(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -746,7 +761,7 @@
 
 func TestIamCreateServiceAccountKeyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var request = &adminpb.CreateServiceAccountKeyRequest{
@@ -760,7 +775,9 @@
 
 	resp, err := c.CreateServiceAccountKey(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -797,7 +814,7 @@
 
 func TestIamDeleteServiceAccountKeyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamKeyPath("[PROJECT]", "[SERVICE_ACCOUNT]", "[KEY]")
 	var request = &adminpb.DeleteServiceAccountKeyRequest{
@@ -811,7 +828,9 @@
 
 	err = c.DeleteServiceAccountKey(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -857,7 +876,7 @@
 
 func TestIamSignBlobError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var bytesToSign []byte = []byte("45")
@@ -873,7 +892,9 @@
 
 	resp, err := c.SignBlob(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -918,7 +939,7 @@
 
 func TestIamGetIamPolicyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var request = &iampb.GetIamPolicyRequest{
@@ -932,7 +953,9 @@
 
 	resp, err := c.getIamPolicy(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -979,7 +1002,7 @@
 
 func TestIamSetIamPolicyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var policy *iampb.Policy = &iampb.Policy{}
@@ -995,7 +1018,9 @@
 
 	resp, err := c.setIamPolicy(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1037,7 +1062,7 @@
 
 func TestIamTestIamPermissionsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = IamServiceAccountPath("[PROJECT]", "[SERVICE_ACCOUNT]")
 	var permissions []string = nil
@@ -1053,7 +1078,9 @@
 
 	resp, err := c.TestIamPermissions(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1093,7 +1120,7 @@
 
 func TestIamQueryGrantableRolesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockIam.err = grpc.Errorf(errCode, "test error")
+	mockIam.err = gstatus.Error(errCode, "test error")
 
 	var fullResourceName string = "fullResourceName1300993644"
 	var request = &adminpb.QueryGrantableRolesRequest{
@@ -1107,7 +1134,9 @@
 
 	resp, err := c.QueryGrantableRoles(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/internal/version/version.go b/internal/version/version.go
index 33f1cdb..5eb06ba 100644
--- a/internal/version/version.go
+++ b/internal/version/version.go
@@ -26,7 +26,7 @@
 
 // Repo is the current version of the client libraries in this
 // repo. It should be a date in YYYYMMDD format.
-const Repo = "20170404"
+const Repo = "20170621"
 
 // Go returns the Go runtime version. The returned string
 // has no whitespace.
diff --git a/language/apiv1/doc.go b/language/apiv1/doc.go
index 73b0f5c..34d357e 100644
--- a/language/apiv1/doc.go
+++ b/language/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package language is an experimental, auto-generated package for the
-// language API.
+// Google Cloud Natural Language API.
 //
 // Google Cloud Natural Language API provides natural language understanding
 // technologies to developers. Examples include sentiment analysis, entity
@@ -34,6 +34,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/language/apiv1/mock_test.go b/language/apiv1/mock_test.go
index b241bce..2c21479 100644
--- a/language/apiv1/mock_test.go
+++ b/language/apiv1/mock_test.go
@@ -38,6 +38,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -174,7 +175,7 @@
 
 func TestLanguageServiceAnalyzeSentimentError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var request = &languagepb.AnalyzeSentimentRequest{
@@ -188,7 +189,9 @@
 
 	resp, err := c.AnalyzeSentiment(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -233,7 +236,7 @@
 
 func TestLanguageServiceAnalyzeEntitiesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var encodingType languagepb.EncodingType = languagepb.EncodingType_NONE
@@ -249,7 +252,9 @@
 
 	resp, err := c.AnalyzeEntities(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -294,7 +299,7 @@
 
 func TestLanguageServiceAnalyzeSyntaxError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var encodingType languagepb.EncodingType = languagepb.EncodingType_NONE
@@ -310,7 +315,9 @@
 
 	resp, err := c.AnalyzeSyntax(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -357,7 +364,7 @@
 
 func TestLanguageServiceAnnotateTextError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var features *languagepb.AnnotateTextRequest_Features = &languagepb.AnnotateTextRequest_Features{}
@@ -375,7 +382,9 @@
 
 	resp, err := c.AnnotateText(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/language/apiv1beta2/doc.go b/language/apiv1beta2/doc.go
index d0313d9..e43233f 100644
--- a/language/apiv1beta2/doc.go
+++ b/language/apiv1beta2/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package language is an experimental, auto-generated package for the
-// language API.
+// Google Cloud Natural Language API.
 //
 // Google Cloud Natural Language API provides natural language understanding
 // technologies to developers. Examples include sentiment analysis, entity
@@ -34,6 +34,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/language/apiv1beta2/mock_test.go b/language/apiv1beta2/mock_test.go
index 2db4e1e..33972a8 100644
--- a/language/apiv1beta2/mock_test.go
+++ b/language/apiv1beta2/mock_test.go
@@ -38,6 +38,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -186,7 +187,7 @@
 
 func TestLanguageServiceAnalyzeSentimentError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var request = &languagepb.AnalyzeSentimentRequest{
@@ -200,7 +201,9 @@
 
 	resp, err := c.AnalyzeSentiment(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -245,7 +248,7 @@
 
 func TestLanguageServiceAnalyzeEntitiesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var encodingType languagepb.EncodingType = languagepb.EncodingType_NONE
@@ -261,7 +264,9 @@
 
 	resp, err := c.AnalyzeEntities(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -306,7 +311,7 @@
 
 func TestLanguageServiceAnalyzeEntitySentimentError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var encodingType languagepb.EncodingType = languagepb.EncodingType_NONE
@@ -322,7 +327,9 @@
 
 	resp, err := c.AnalyzeEntitySentiment(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -367,7 +374,7 @@
 
 func TestLanguageServiceAnalyzeSyntaxError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var encodingType languagepb.EncodingType = languagepb.EncodingType_NONE
@@ -383,7 +390,9 @@
 
 	resp, err := c.AnalyzeSyntax(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -430,7 +439,7 @@
 
 func TestLanguageServiceAnnotateTextError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLanguage.err = grpc.Errorf(errCode, "test error")
+	mockLanguage.err = gstatus.Error(errCode, "test error")
 
 	var document *languagepb.Document = &languagepb.Document{}
 	var features *languagepb.AnnotateTextRequest_Features = &languagepb.AnnotateTextRequest_Features{}
@@ -448,7 +457,9 @@
 
 	resp, err := c.AnnotateText(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/logging/apiv2/WriteLogEntries_smoke_test.go b/logging/apiv2/WriteLogEntries_smoke_test.go
index b4d91ab..23f5108 100644
--- a/logging/apiv2/WriteLogEntries_smoke_test.go
+++ b/logging/apiv2/WriteLogEntries_smoke_test.go
@@ -54,7 +54,7 @@
 	}
 
 	var entries []*loggingpb.LogEntry = nil
-	var formattedLogName string = LoggingLogPath(projectId, "test-"+strconv.FormatInt(time.Now().UnixNano(), 10)+"")
+	var formattedLogName string = LogPath(projectId, "test-"+strconv.FormatInt(time.Now().UnixNano(), 10)+"")
 	var request = &loggingpb.WriteLogEntriesRequest{
 		Entries: entries,
 		LogName: formattedLogName,
diff --git a/logging/apiv2/config_client.go b/logging/apiv2/config_client.go
index 417769b..c8e171c 100644
--- a/logging/apiv2/config_client.go
+++ b/logging/apiv2/config_client.go
@@ -58,17 +58,7 @@
 			gax.WithRetry(func() gax.Retryer {
 				return gax.OnCodes([]codes.Code{
 					codes.DeadlineExceeded,
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        1000 * time.Millisecond,
-					Multiplier: 1.2,
-				})
-			}),
-		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
+					codes.Internal,
 					codes.Unavailable,
 				}, gax.Backoff{
 					Initial:    100 * time.Millisecond,
diff --git a/logging/apiv2/config_client_example_test.go b/logging/apiv2/config_client_example_test.go
index 620aa65..7369260 100644
--- a/logging/apiv2/config_client_example_test.go
+++ b/logging/apiv2/config_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/logging/apiv2"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	loggingpb "google.golang.org/genproto/googleapis/logging/v2"
 )
 
@@ -45,9 +46,11 @@
 	it := c.ListSinks(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/logging/apiv2/doc.go b/logging/apiv2/doc.go
index 3963c8b..0398913 100644
--- a/logging/apiv2/doc.go
+++ b/logging/apiv2/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package logging is an experimental, auto-generated package for the
-// logging API.
+// Stackdriver Logging API.
 //
 // The Stackdriver Logging API lets you write log entries and manage your
 // logs, log sinks and logs-based metrics.
@@ -35,6 +35,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/logging/apiv2/logging_client.go b/logging/apiv2/logging_client.go
index 603893b..9458ed4 100644
--- a/logging/apiv2/logging_client.go
+++ b/logging/apiv2/logging_client.go
@@ -59,17 +59,7 @@
 			gax.WithRetry(func() gax.Retryer {
 				return gax.OnCodes([]codes.Code{
 					codes.DeadlineExceeded,
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        1000 * time.Millisecond,
-					Multiplier: 1.2,
-				})
-			}),
-		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
+					codes.Internal,
 					codes.Unavailable,
 				}, gax.Backoff{
 					Initial:    100 * time.Millisecond,
@@ -82,6 +72,7 @@
 			gax.WithRetry(func() gax.Retryer {
 				return gax.OnCodes([]codes.Code{
 					codes.DeadlineExceeded,
+					codes.Internal,
 					codes.Unavailable,
 				}, gax.Backoff{
 					Initial:    100 * time.Millisecond,
@@ -153,8 +144,8 @@
 	c.xGoogHeader = []string{gax.XGoogHeader(kv...)}
 }
 
-// LoggingProjectPath returns the path for the project resource.
-func LoggingProjectPath(project string) string {
+// ProjectPath returns the path for the project resource.
+func ProjectPath(project string) string {
 	path, err := loggingProjectPathTemplate.Render(map[string]string{
 		"project": project,
 	})
@@ -164,8 +155,8 @@
 	return path
 }
 
-// LoggingLogPath returns the path for the log resource.
-func LoggingLogPath(project, log string) string {
+// LogPath returns the path for the log resource.
+func LogPath(project, log string) string {
 	path, err := loggingLogPathTemplate.Render(map[string]string{
 		"project": project,
 		"log":     log,
diff --git a/logging/apiv2/logging_client_example_test.go b/logging/apiv2/logging_client_example_test.go
index 6dc537f..e4321f1 100644
--- a/logging/apiv2/logging_client_example_test.go
+++ b/logging/apiv2/logging_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/logging/apiv2"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	loggingpb "google.golang.org/genproto/googleapis/logging/v2"
 )
 
@@ -79,9 +80,11 @@
 	it := c.ListLogEntries(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -101,9 +104,11 @@
 	it := c.ListMonitoredResourceDescriptors(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -123,9 +128,11 @@
 	it := c.ListLogs(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/logging/apiv2/metrics_client.go b/logging/apiv2/metrics_client.go
index ba2af92..62ec7e7 100644
--- a/logging/apiv2/metrics_client.go
+++ b/logging/apiv2/metrics_client.go
@@ -58,17 +58,7 @@
 			gax.WithRetry(func() gax.Retryer {
 				return gax.OnCodes([]codes.Code{
 					codes.DeadlineExceeded,
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        1000 * time.Millisecond,
-					Multiplier: 1.2,
-				})
-			}),
-		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
+					codes.Internal,
 					codes.Unavailable,
 				}, gax.Backoff{
 					Initial:    100 * time.Millisecond,
diff --git a/logging/apiv2/metrics_client_example_test.go b/logging/apiv2/metrics_client_example_test.go
index c924120..4bc3eef 100644
--- a/logging/apiv2/metrics_client_example_test.go
+++ b/logging/apiv2/metrics_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/logging/apiv2"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	loggingpb "google.golang.org/genproto/googleapis/logging/v2"
 )
 
@@ -45,9 +46,11 @@
 	it := c.ListLogMetrics(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/logging/apiv2/mock_test.go b/logging/apiv2/mock_test.go
index 30083a2..746dcd2 100644
--- a/logging/apiv2/mock_test.go
+++ b/logging/apiv2/mock_test.go
@@ -40,6 +40,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -312,7 +313,7 @@
 
 	mockLogging.resps = append(mockLogging.resps[:0], expectedResponse)
 
-	var formattedLogName string = LoggingLogPath("[PROJECT]", "[LOG]")
+	var formattedLogName string = LogPath("[PROJECT]", "[LOG]")
 	var request = &loggingpb.DeleteLogRequest{
 		LogName: formattedLogName,
 	}
@@ -336,9 +337,9 @@
 
 func TestLoggingServiceV2DeleteLogError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLogging.err = grpc.Errorf(errCode, "test error")
+	mockLogging.err = gstatus.Error(errCode, "test error")
 
-	var formattedLogName string = LoggingLogPath("[PROJECT]", "[LOG]")
+	var formattedLogName string = LogPath("[PROJECT]", "[LOG]")
 	var request = &loggingpb.DeleteLogRequest{
 		LogName: formattedLogName,
 	}
@@ -350,7 +351,9 @@
 
 	err = c.DeleteLog(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -389,7 +392,7 @@
 
 func TestLoggingServiceV2WriteLogEntriesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLogging.err = grpc.Errorf(errCode, "test error")
+	mockLogging.err = gstatus.Error(errCode, "test error")
 
 	var entries []*loggingpb.LogEntry = nil
 	var request = &loggingpb.WriteLogEntriesRequest{
@@ -403,7 +406,9 @@
 
 	resp, err := c.WriteLogEntries(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -459,7 +464,7 @@
 
 func TestLoggingServiceV2ListLogEntriesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLogging.err = grpc.Errorf(errCode, "test error")
+	mockLogging.err = gstatus.Error(errCode, "test error")
 
 	var resourceNames []string = nil
 	var request = &loggingpb.ListLogEntriesRequest{
@@ -473,7 +478,9 @@
 
 	resp, err := c.ListLogEntries(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -526,7 +533,7 @@
 
 func TestLoggingServiceV2ListMonitoredResourceDescriptorsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLogging.err = grpc.Errorf(errCode, "test error")
+	mockLogging.err = gstatus.Error(errCode, "test error")
 
 	var request *loggingpb.ListMonitoredResourceDescriptorsRequest = &loggingpb.ListMonitoredResourceDescriptorsRequest{}
 
@@ -537,7 +544,9 @@
 
 	resp, err := c.ListMonitoredResourceDescriptors(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -556,7 +565,7 @@
 
 	mockLogging.resps = append(mockLogging.resps[:0], expectedResponse)
 
-	var formattedParent string = LoggingProjectPath("[PROJECT]")
+	var formattedParent string = ProjectPath("[PROJECT]")
 	var request = &loggingpb.ListLogsRequest{
 		Parent: formattedParent,
 	}
@@ -593,9 +602,9 @@
 
 func TestLoggingServiceV2ListLogsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockLogging.err = grpc.Errorf(errCode, "test error")
+	mockLogging.err = gstatus.Error(errCode, "test error")
 
-	var formattedParent string = LoggingProjectPath("[PROJECT]")
+	var formattedParent string = ProjectPath("[PROJECT]")
 	var request = &loggingpb.ListLogsRequest{
 		Parent: formattedParent,
 	}
@@ -607,7 +616,9 @@
 
 	resp, err := c.ListLogs(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -663,7 +674,7 @@
 
 func TestConfigServiceV2ListSinksError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockConfig.err = grpc.Errorf(errCode, "test error")
+	mockConfig.err = gstatus.Error(errCode, "test error")
 
 	var formattedParent string = ConfigProjectPath("[PROJECT]")
 	var request = &loggingpb.ListSinksRequest{
@@ -677,7 +688,9 @@
 
 	resp, err := c.ListSinks(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -728,7 +741,7 @@
 
 func TestConfigServiceV2GetSinkError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockConfig.err = grpc.Errorf(errCode, "test error")
+	mockConfig.err = gstatus.Error(errCode, "test error")
 
 	var formattedSinkName string = ConfigSinkPath("[PROJECT]", "[SINK]")
 	var request = &loggingpb.GetSinkRequest{
@@ -742,7 +755,9 @@
 
 	resp, err := c.GetSink(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -795,7 +810,7 @@
 
 func TestConfigServiceV2CreateSinkError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockConfig.err = grpc.Errorf(errCode, "test error")
+	mockConfig.err = gstatus.Error(errCode, "test error")
 
 	var formattedParent string = ConfigProjectPath("[PROJECT]")
 	var sink *loggingpb.LogSink = &loggingpb.LogSink{}
@@ -811,7 +826,9 @@
 
 	resp, err := c.CreateSink(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -864,7 +881,7 @@
 
 func TestConfigServiceV2UpdateSinkError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockConfig.err = grpc.Errorf(errCode, "test error")
+	mockConfig.err = gstatus.Error(errCode, "test error")
 
 	var formattedSinkName string = ConfigSinkPath("[PROJECT]", "[SINK]")
 	var sink *loggingpb.LogSink = &loggingpb.LogSink{}
@@ -880,7 +897,9 @@
 
 	resp, err := c.UpdateSink(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -917,7 +936,7 @@
 
 func TestConfigServiceV2DeleteSinkError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockConfig.err = grpc.Errorf(errCode, "test error")
+	mockConfig.err = gstatus.Error(errCode, "test error")
 
 	var formattedSinkName string = ConfigSinkPath("[PROJECT]", "[SINK]")
 	var request = &loggingpb.DeleteSinkRequest{
@@ -931,7 +950,9 @@
 
 	err = c.DeleteSink(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -986,7 +1007,7 @@
 
 func TestMetricsServiceV2ListLogMetricsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetrics.err = grpc.Errorf(errCode, "test error")
+	mockMetrics.err = gstatus.Error(errCode, "test error")
 
 	var formattedParent string = MetricsProjectPath("[PROJECT]")
 	var request = &loggingpb.ListLogMetricsRequest{
@@ -1000,7 +1021,9 @@
 
 	resp, err := c.ListLogMetrics(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1047,7 +1070,7 @@
 
 func TestMetricsServiceV2GetLogMetricError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetrics.err = grpc.Errorf(errCode, "test error")
+	mockMetrics.err = gstatus.Error(errCode, "test error")
 
 	var formattedMetricName string = MetricsMetricPath("[PROJECT]", "[METRIC]")
 	var request = &loggingpb.GetLogMetricRequest{
@@ -1061,7 +1084,9 @@
 
 	resp, err := c.GetLogMetric(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1110,7 +1135,7 @@
 
 func TestMetricsServiceV2CreateLogMetricError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetrics.err = grpc.Errorf(errCode, "test error")
+	mockMetrics.err = gstatus.Error(errCode, "test error")
 
 	var formattedParent string = MetricsProjectPath("[PROJECT]")
 	var metric *loggingpb.LogMetric = &loggingpb.LogMetric{}
@@ -1126,7 +1151,9 @@
 
 	resp, err := c.CreateLogMetric(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1175,7 +1202,7 @@
 
 func TestMetricsServiceV2UpdateLogMetricError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetrics.err = grpc.Errorf(errCode, "test error")
+	mockMetrics.err = gstatus.Error(errCode, "test error")
 
 	var formattedMetricName string = MetricsMetricPath("[PROJECT]", "[METRIC]")
 	var metric *loggingpb.LogMetric = &loggingpb.LogMetric{}
@@ -1191,7 +1218,9 @@
 
 	resp, err := c.UpdateLogMetric(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1228,7 +1257,7 @@
 
 func TestMetricsServiceV2DeleteLogMetricError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetrics.err = grpc.Errorf(errCode, "test error")
+	mockMetrics.err = gstatus.Error(errCode, "test error")
 
 	var formattedMetricName string = MetricsMetricPath("[PROJECT]", "[METRIC]")
 	var request = &loggingpb.DeleteLogMetricRequest{
@@ -1242,7 +1271,9 @@
 
 	err = c.DeleteLogMetric(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
diff --git a/longrunning/autogen/doc.go b/longrunning/autogen/doc.go
index 8e3789b..2196806 100644
--- a/longrunning/autogen/doc.go
+++ b/longrunning/autogen/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package longrunning is an experimental, auto-generated package for the
-// longrunning API.
+// Google Long Running Operations API.
 //
 //
 // Use the client at cloud.google.com/go/longrunning in preference to this.
@@ -33,6 +33,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{}
 }
diff --git a/longrunning/autogen/mock_test.go b/longrunning/autogen/mock_test.go
index 95e02be..ddbee22 100644
--- a/longrunning/autogen/mock_test.go
+++ b/longrunning/autogen/mock_test.go
@@ -39,6 +39,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -177,7 +178,7 @@
 
 func TestOperationsGetOperationError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockOperations.err = grpc.Errorf(errCode, "test error")
+	mockOperations.err = gstatus.Error(errCode, "test error")
 
 	var name string = "name3373707"
 	var request = &longrunningpb.GetOperationRequest{
@@ -191,7 +192,9 @@
 
 	resp, err := c.GetOperation(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -249,7 +252,7 @@
 
 func TestOperationsListOperationsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockOperations.err = grpc.Errorf(errCode, "test error")
+	mockOperations.err = gstatus.Error(errCode, "test error")
 
 	var name string = "name3373707"
 	var filter string = "filter-1274492040"
@@ -265,7 +268,9 @@
 
 	resp, err := c.ListOperations(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -302,7 +307,7 @@
 
 func TestOperationsCancelOperationError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockOperations.err = grpc.Errorf(errCode, "test error")
+	mockOperations.err = gstatus.Error(errCode, "test error")
 
 	var name string = "name3373707"
 	var request = &longrunningpb.CancelOperationRequest{
@@ -316,7 +321,9 @@
 
 	err = c.CancelOperation(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -352,7 +359,7 @@
 
 func TestOperationsDeleteOperationError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockOperations.err = grpc.Errorf(errCode, "test error")
+	mockOperations.err = gstatus.Error(errCode, "test error")
 
 	var name string = "name3373707"
 	var request = &longrunningpb.DeleteOperationRequest{
@@ -366,7 +373,9 @@
 
 	err = c.DeleteOperation(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
diff --git a/longrunning/autogen/operations_client_example_test.go b/longrunning/autogen/operations_client_example_test.go
index 02de149..646faea 100644
--- a/longrunning/autogen/operations_client_example_test.go
+++ b/longrunning/autogen/operations_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/longrunning/autogen"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	longrunningpb "google.golang.org/genproto/googleapis/longrunning"
 )
 
@@ -63,9 +64,11 @@
 	it := c.ListOperations(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/monitoring/apiv3/doc.go b/monitoring/apiv3/doc.go
index b57411b..ca72c8e 100644
--- a/monitoring/apiv3/doc.go
+++ b/monitoring/apiv3/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package monitoring is an experimental, auto-generated package for the
-// monitoring API.
+// Stackdriver Monitoring API.
 //
 // Manages your Stackdriver Monitoring data and configurations. Most projects
 // must be associated with a Stackdriver account, with a few exceptions as
@@ -34,6 +34,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/monitoring/apiv3/group_client.go b/monitoring/apiv3/group_client.go
index 765b151..e861d7d 100644
--- a/monitoring/apiv3/group_client.go
+++ b/monitoring/apiv3/group_client.go
@@ -68,17 +68,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &GroupCallOptions{
 		ListGroups:       retry[[2]string{"default", "idempotent"}],
diff --git a/monitoring/apiv3/group_client_example_test.go b/monitoring/apiv3/group_client_example_test.go
index 095661a..cae59bf 100644
--- a/monitoring/apiv3/group_client_example_test.go
+++ b/monitoring/apiv3/group_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/monitoring/apiv3"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3"
 )
 
@@ -45,9 +46,11 @@
 	it := c.ListGroups(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -137,9 +140,11 @@
 	it := c.ListGroupMembers(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/monitoring/apiv3/metric_client.go b/monitoring/apiv3/metric_client.go
index 53dced8..4b24b6d 100644
--- a/monitoring/apiv3/metric_client.go
+++ b/monitoring/apiv3/metric_client.go
@@ -72,17 +72,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &MetricCallOptions{
 		ListMonitoredResourceDescriptors: retry[[2]string{"default", "idempotent"}],
diff --git a/monitoring/apiv3/metric_client_example_test.go b/monitoring/apiv3/metric_client_example_test.go
index 5dbb5ef..a768489 100644
--- a/monitoring/apiv3/metric_client_example_test.go
+++ b/monitoring/apiv3/metric_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/monitoring/apiv3"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3"
 )
 
@@ -45,9 +46,11 @@
 	it := c.ListMonitoredResourceDescriptors(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -85,9 +88,11 @@
 	it := c.ListMetricDescriptors(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -159,9 +164,11 @@
 	it := c.ListTimeSeries(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/monitoring/apiv3/mock_test.go b/monitoring/apiv3/mock_test.go
index 54e6899..25aa2a7 100644
--- a/monitoring/apiv3/mock_test.go
+++ b/monitoring/apiv3/mock_test.go
@@ -41,6 +41,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -327,7 +328,7 @@
 
 func TestGroupServiceListGroupsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockGroup.err = grpc.Errorf(errCode, "test error")
+	mockGroup.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = GroupProjectPath("[PROJECT]")
 	var request = &monitoringpb.ListGroupsRequest{
@@ -341,7 +342,9 @@
 
 	resp, err := c.ListGroups(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -392,7 +395,7 @@
 
 func TestGroupServiceGetGroupError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockGroup.err = grpc.Errorf(errCode, "test error")
+	mockGroup.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = GroupGroupPath("[PROJECT]", "[GROUP]")
 	var request = &monitoringpb.GetGroupRequest{
@@ -406,7 +409,9 @@
 
 	resp, err := c.GetGroup(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -459,7 +464,7 @@
 
 func TestGroupServiceCreateGroupError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockGroup.err = grpc.Errorf(errCode, "test error")
+	mockGroup.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = GroupProjectPath("[PROJECT]")
 	var group *monitoringpb.Group = &monitoringpb.Group{}
@@ -475,7 +480,9 @@
 
 	resp, err := c.CreateGroup(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -526,7 +533,7 @@
 
 func TestGroupServiceUpdateGroupError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockGroup.err = grpc.Errorf(errCode, "test error")
+	mockGroup.err = gstatus.Error(errCode, "test error")
 
 	var group *monitoringpb.Group = &monitoringpb.Group{}
 	var request = &monitoringpb.UpdateGroupRequest{
@@ -540,7 +547,9 @@
 
 	resp, err := c.UpdateGroup(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -577,7 +586,7 @@
 
 func TestGroupServiceDeleteGroupError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockGroup.err = grpc.Errorf(errCode, "test error")
+	mockGroup.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = GroupGroupPath("[PROJECT]", "[GROUP]")
 	var request = &monitoringpb.DeleteGroupRequest{
@@ -591,7 +600,9 @@
 
 	err = c.DeleteGroup(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -648,7 +659,7 @@
 
 func TestGroupServiceListGroupMembersError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockGroup.err = grpc.Errorf(errCode, "test error")
+	mockGroup.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = GroupGroupPath("[PROJECT]", "[GROUP]")
 	var request = &monitoringpb.ListGroupMembersRequest{
@@ -662,7 +673,9 @@
 
 	resp, err := c.ListGroupMembers(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -718,7 +731,7 @@
 
 func TestMetricServiceListMonitoredResourceDescriptorsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricProjectPath("[PROJECT]")
 	var request = &monitoringpb.ListMonitoredResourceDescriptorsRequest{
@@ -732,7 +745,9 @@
 
 	resp, err := c.ListMonitoredResourceDescriptors(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -781,7 +796,7 @@
 
 func TestMetricServiceGetMonitoredResourceDescriptorError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricMonitoredResourceDescriptorPath("[PROJECT]", "[MONITORED_RESOURCE_DESCRIPTOR]")
 	var request = &monitoringpb.GetMonitoredResourceDescriptorRequest{
@@ -795,7 +810,9 @@
 
 	resp, err := c.GetMonitoredResourceDescriptor(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -851,7 +868,7 @@
 
 func TestMetricServiceListMetricDescriptorsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricProjectPath("[PROJECT]")
 	var request = &monitoringpb.ListMetricDescriptorsRequest{
@@ -865,7 +882,9 @@
 
 	resp, err := c.ListMetricDescriptors(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -916,7 +935,7 @@
 
 func TestMetricServiceGetMetricDescriptorError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricMetricDescriptorPath("[PROJECT]", "[METRIC_DESCRIPTOR]")
 	var request = &monitoringpb.GetMetricDescriptorRequest{
@@ -930,7 +949,9 @@
 
 	resp, err := c.GetMetricDescriptor(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -983,7 +1004,7 @@
 
 func TestMetricServiceCreateMetricDescriptorError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricProjectPath("[PROJECT]")
 	var metricDescriptor *metricpb.MetricDescriptor = &metricpb.MetricDescriptor{}
@@ -999,7 +1020,9 @@
 
 	resp, err := c.CreateMetricDescriptor(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1036,7 +1059,7 @@
 
 func TestMetricServiceDeleteMetricDescriptorError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricMetricDescriptorPath("[PROJECT]", "[METRIC_DESCRIPTOR]")
 	var request = &monitoringpb.DeleteMetricDescriptorRequest{
@@ -1050,7 +1073,9 @@
 
 	err = c.DeleteMetricDescriptor(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -1111,7 +1136,7 @@
 
 func TestMetricServiceListTimeSeriesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricProjectPath("[PROJECT]")
 	var filter string = "filter-1274492040"
@@ -1131,7 +1156,9 @@
 
 	resp, err := c.ListTimeSeries(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1170,7 +1197,7 @@
 
 func TestMetricServiceCreateTimeSeriesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockMetric.err = grpc.Errorf(errCode, "test error")
+	mockMetric.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = MetricProjectPath("[PROJECT]")
 	var timeSeries []*monitoringpb.TimeSeries = nil
@@ -1186,7 +1213,9 @@
 
 	err = c.CreateTimeSeries(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
diff --git a/pubsub/apiv1/doc.go b/pubsub/apiv1/doc.go
index 6d884a8..6a4addc 100644
--- a/pubsub/apiv1/doc.go
+++ b/pubsub/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package pubsub is an experimental, auto-generated package for the
-// pubsub API.
+// Google Cloud Pub/Sub API.
 //
 // Provides reliable, many-to-many, asynchronous messaging between
 // applications.
@@ -35,6 +35,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/pubsub/apiv1/mock_test.go b/pubsub/apiv1/mock_test.go
index e5935b1..eddd8e5 100644
--- a/pubsub/apiv1/mock_test.go
+++ b/pubsub/apiv1/mock_test.go
@@ -41,6 +41,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -452,7 +453,7 @@
 
 func TestPublisherCreateTopicError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockPublisher.err = grpc.Errorf(errCode, "test error")
+	mockPublisher.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = PublisherTopicPath("[PROJECT]", "[TOPIC]")
 	var request = &pubsubpb.Topic{
@@ -466,7 +467,9 @@
 
 	resp, err := c.CreateTopic(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -516,7 +519,7 @@
 
 func TestPublisherPublishError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockPublisher.err = grpc.Errorf(errCode, "test error")
+	mockPublisher.err = gstatus.Error(errCode, "test error")
 
 	var formattedTopic string = PublisherTopicPath("[PROJECT]", "[TOPIC]")
 	var data []byte = []byte("-86")
@@ -536,7 +539,9 @@
 
 	resp, err := c.Publish(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -579,7 +584,7 @@
 
 func TestPublisherGetTopicError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockPublisher.err = grpc.Errorf(errCode, "test error")
+	mockPublisher.err = gstatus.Error(errCode, "test error")
 
 	var formattedTopic string = PublisherTopicPath("[PROJECT]", "[TOPIC]")
 	var request = &pubsubpb.GetTopicRequest{
@@ -593,7 +598,9 @@
 
 	resp, err := c.GetTopic(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -649,7 +656,7 @@
 
 func TestPublisherListTopicsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockPublisher.err = grpc.Errorf(errCode, "test error")
+	mockPublisher.err = gstatus.Error(errCode, "test error")
 
 	var formattedProject string = PublisherProjectPath("[PROJECT]")
 	var request = &pubsubpb.ListTopicsRequest{
@@ -663,7 +670,9 @@
 
 	resp, err := c.ListTopics(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -719,7 +728,7 @@
 
 func TestPublisherListTopicSubscriptionsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockPublisher.err = grpc.Errorf(errCode, "test error")
+	mockPublisher.err = gstatus.Error(errCode, "test error")
 
 	var formattedTopic string = PublisherTopicPath("[PROJECT]", "[TOPIC]")
 	var request = &pubsubpb.ListTopicSubscriptionsRequest{
@@ -733,7 +742,9 @@
 
 	resp, err := c.ListTopicSubscriptions(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -770,7 +781,7 @@
 
 func TestPublisherDeleteTopicError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockPublisher.err = grpc.Errorf(errCode, "test error")
+	mockPublisher.err = gstatus.Error(errCode, "test error")
 
 	var formattedTopic string = PublisherTopicPath("[PROJECT]", "[TOPIC]")
 	var request = &pubsubpb.DeleteTopicRequest{
@@ -784,7 +795,9 @@
 
 	err = c.DeleteTopic(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -834,7 +847,7 @@
 
 func TestSubscriberCreateSubscriptionError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var formattedTopic string = SubscriberTopicPath("[PROJECT]", "[TOPIC]")
@@ -850,7 +863,9 @@
 
 	resp, err := c.CreateSubscription(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -899,7 +914,7 @@
 
 func TestSubscriberGetSubscriptionError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var request = &pubsubpb.GetSubscriptionRequest{
@@ -913,7 +928,9 @@
 
 	resp, err := c.GetSubscription(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -964,7 +981,7 @@
 
 func TestSubscriberUpdateSubscriptionError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var subscription *pubsubpb.Subscription = &pubsubpb.Subscription{}
 	var updateMask *field_maskpb.FieldMask = &field_maskpb.FieldMask{}
@@ -980,7 +997,9 @@
 
 	resp, err := c.UpdateSubscription(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1036,7 +1055,7 @@
 
 func TestSubscriberListSubscriptionsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedProject string = SubscriberProjectPath("[PROJECT]")
 	var request = &pubsubpb.ListSubscriptionsRequest{
@@ -1050,7 +1069,9 @@
 
 	resp, err := c.ListSubscriptions(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1087,7 +1108,7 @@
 
 func TestSubscriberDeleteSubscriptionError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var request = &pubsubpb.DeleteSubscriptionRequest{
@@ -1101,7 +1122,9 @@
 
 	err = c.DeleteSubscription(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -1141,7 +1164,7 @@
 
 func TestSubscriberModifyAckDeadlineError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var ackIds []string = nil
@@ -1159,7 +1182,9 @@
 
 	err = c.ModifyAckDeadline(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -1197,7 +1222,7 @@
 
 func TestSubscriberAcknowledgeError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var ackIds []string = nil
@@ -1213,7 +1238,9 @@
 
 	err = c.Acknowledge(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -1254,7 +1281,7 @@
 
 func TestSubscriberPullError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var maxMessages int32 = 496131527
@@ -1270,13 +1297,19 @@
 
 	resp, err := c.Pull(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
 }
 func TestSubscriberStreamingPull(t *testing.T) {
-	var expectedResponse *pubsubpb.StreamingPullResponse = &pubsubpb.StreamingPullResponse{}
+	var receivedMessagesElement *pubsubpb.ReceivedMessage = &pubsubpb.ReceivedMessage{}
+	var receivedMessages = []*pubsubpb.ReceivedMessage{receivedMessagesElement}
+	var expectedResponse = &pubsubpb.StreamingPullResponse{
+		ReceivedMessages: receivedMessages,
+	}
 
 	mockSubscriber.err = nil
 	mockSubscriber.reqs = nil
@@ -1322,7 +1355,7 @@
 
 func TestSubscriberStreamingPullError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var streamAckDeadlineSeconds int32 = 1875467245
@@ -1348,7 +1381,9 @@
 	}
 	resp, err := stream.Recv()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1387,7 +1422,7 @@
 
 func TestSubscriberModifyPushConfigError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var pushConfig *pubsubpb.PushConfig = &pubsubpb.PushConfig{}
@@ -1403,7 +1438,9 @@
 
 	err = c.ModifyPushConfig(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -1458,7 +1495,7 @@
 
 func TestSubscriberListSnapshotsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedProject string = SubscriberProjectPath("[PROJECT]")
 	var request = &pubsubpb.ListSnapshotsRequest{
@@ -1472,7 +1509,9 @@
 
 	resp, err := c.ListSnapshots(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1519,7 +1558,7 @@
 
 func TestSubscriberCreateSnapshotError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = SubscriberSnapshotPath("[PROJECT]", "[SNAPSHOT]")
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
@@ -1535,7 +1574,9 @@
 
 	resp, err := c.CreateSnapshot(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -1572,7 +1613,7 @@
 
 func TestSubscriberDeleteSnapshotError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSnapshot string = SubscriberSnapshotPath("[PROJECT]", "[SNAPSHOT]")
 	var request = &pubsubpb.DeleteSnapshotRequest{
@@ -1586,7 +1627,9 @@
 
 	err = c.DeleteSnapshot(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -1625,7 +1668,7 @@
 
 func TestSubscriberSeekError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSubscriber.err = grpc.Errorf(errCode, "test error")
+	mockSubscriber.err = gstatus.Error(errCode, "test error")
 
 	var formattedSubscription string = SubscriberSubscriptionPath("[PROJECT]", "[SUBSCRIPTION]")
 	var request = &pubsubpb.SeekRequest{
@@ -1639,7 +1682,9 @@
 
 	resp, err := c.Seek(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/pubsub/apiv1/publisher_client_example_test.go b/pubsub/apiv1/publisher_client_example_test.go
index 6e63f80..ad77ce8 100644
--- a/pubsub/apiv1/publisher_client_example_test.go
+++ b/pubsub/apiv1/publisher_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/pubsub/apiv1"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	pubsubpb "google.golang.org/genproto/googleapis/pubsub/v1"
 )
 
@@ -133,9 +134,11 @@
 	it := c.ListTopics(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -155,9 +158,11 @@
 	it := c.ListTopicSubscriptions(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/pubsub/apiv1/subscriber_client.go b/pubsub/apiv1/subscriber_client.go
index 2e26b6e..29fc439 100644
--- a/pubsub/apiv1/subscriber_client.go
+++ b/pubsub/apiv1/subscriber_client.go
@@ -78,28 +78,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
-		{"messaging", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 		{"messaging", "pull"}: {
 			gax.WithRetry(func() gax.Retryer {
 				return gax.OnCodes([]codes.Code{
diff --git a/pubsub/apiv1/subscriber_client_example_test.go b/pubsub/apiv1/subscriber_client_example_test.go
index 53c0661..066fca1 100644
--- a/pubsub/apiv1/subscriber_client_example_test.go
+++ b/pubsub/apiv1/subscriber_client_example_test.go
@@ -21,6 +21,7 @@
 
 	"cloud.google.com/go/pubsub/apiv1"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	pubsubpb "google.golang.org/genproto/googleapis/pubsub/v1"
 )
 
@@ -135,9 +136,11 @@
 	it := c.ListSubscriptions(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -273,9 +276,11 @@
 	it := c.ListSnapshots(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/spanner/admin/database/apiv1/database_admin_client.go b/spanner/admin/database/apiv1/database_admin_client.go
index 95d6230..65506b6 100644
--- a/spanner/admin/database/apiv1/database_admin_client.go
+++ b/spanner/admin/database/apiv1/database_admin_client.go
@@ -74,17 +74,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    1000 * time.Millisecond,
-					Max:        32000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &DatabaseAdminCallOptions{
 		ListDatabases:      retry[[2]string{"default", "idempotent"}],
diff --git a/spanner/admin/database/apiv1/database_admin_client_example_test.go b/spanner/admin/database/apiv1/database_admin_client_example_test.go
index 0769d11..f0e4006 100644
--- a/spanner/admin/database/apiv1/database_admin_client_example_test.go
+++ b/spanner/admin/database/apiv1/database_admin_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/spanner/admin/database/apiv1"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	iampb "google.golang.org/genproto/googleapis/iam/v1"
 	databasepb "google.golang.org/genproto/googleapis/spanner/admin/database/v1"
 )
@@ -46,9 +47,11 @@
 	it := c.ListDatabases(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/spanner/admin/database/apiv1/doc.go b/spanner/admin/database/apiv1/doc.go
index 46eaaae..03ee144 100644
--- a/spanner/admin/database/apiv1/doc.go
+++ b/spanner/admin/database/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package database is an experimental, auto-generated package for the
-// database API.
+// Cloud Spanner Database Admin API.
 //
 package database // import "cloud.google.com/go/spanner/admin/database/apiv1"
 
@@ -31,6 +31,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/spanner/admin/database/apiv1/mock_test.go b/spanner/admin/database/apiv1/mock_test.go
index accd30c..36393ff 100644
--- a/spanner/admin/database/apiv1/mock_test.go
+++ b/spanner/admin/database/apiv1/mock_test.go
@@ -41,6 +41,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -250,7 +251,7 @@
 
 func TestDatabaseAdminListDatabasesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDatabaseAdmin.err = grpc.Errorf(errCode, "test error")
+	mockDatabaseAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedParent string = DatabaseAdminInstancePath("[PROJECT]", "[INSTANCE]")
 	var request = &databasepb.ListDatabasesRequest{
@@ -264,7 +265,9 @@
 
 	resp, err := c.ListDatabases(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -351,7 +354,9 @@
 	}
 	resp, err := respLRO.Wait(context.Background())
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -394,7 +399,7 @@
 
 func TestDatabaseAdminGetDatabaseError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDatabaseAdmin.err = grpc.Errorf(errCode, "test error")
+	mockDatabaseAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = DatabaseAdminDatabasePath("[PROJECT]", "[INSTANCE]", "[DATABASE]")
 	var request = &databasepb.GetDatabaseRequest{
@@ -408,7 +413,9 @@
 
 	resp, err := c.GetDatabase(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -489,7 +496,9 @@
 	}
 	err = respLRO.Wait(context.Background())
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -525,7 +534,7 @@
 
 func TestDatabaseAdminDropDatabaseError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDatabaseAdmin.err = grpc.Errorf(errCode, "test error")
+	mockDatabaseAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedDatabase string = DatabaseAdminDatabasePath("[PROJECT]", "[INSTANCE]", "[DATABASE]")
 	var request = &databasepb.DropDatabaseRequest{
@@ -539,7 +548,9 @@
 
 	err = c.DropDatabase(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -578,7 +589,7 @@
 
 func TestDatabaseAdminGetDatabaseDdlError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDatabaseAdmin.err = grpc.Errorf(errCode, "test error")
+	mockDatabaseAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedDatabase string = DatabaseAdminDatabasePath("[PROJECT]", "[INSTANCE]", "[DATABASE]")
 	var request = &databasepb.GetDatabaseDdlRequest{
@@ -592,7 +603,9 @@
 
 	resp, err := c.GetDatabaseDdl(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -639,7 +652,7 @@
 
 func TestDatabaseAdminSetIamPolicyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDatabaseAdmin.err = grpc.Errorf(errCode, "test error")
+	mockDatabaseAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = DatabaseAdminDatabasePath("[PROJECT]", "[INSTANCE]", "[DATABASE]")
 	var policy *iampb.Policy = &iampb.Policy{}
@@ -655,7 +668,9 @@
 
 	resp, err := c.SetIamPolicy(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -700,7 +715,7 @@
 
 func TestDatabaseAdminGetIamPolicyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDatabaseAdmin.err = grpc.Errorf(errCode, "test error")
+	mockDatabaseAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = DatabaseAdminDatabasePath("[PROJECT]", "[INSTANCE]", "[DATABASE]")
 	var request = &iampb.GetIamPolicyRequest{
@@ -714,7 +729,9 @@
 
 	resp, err := c.GetIamPolicy(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -756,7 +773,7 @@
 
 func TestDatabaseAdminTestIamPermissionsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockDatabaseAdmin.err = grpc.Errorf(errCode, "test error")
+	mockDatabaseAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = DatabaseAdminDatabasePath("[PROJECT]", "[INSTANCE]", "[DATABASE]")
 	var permissions []string = nil
@@ -772,7 +789,9 @@
 
 	resp, err := c.TestIamPermissions(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/spanner/admin/instance/apiv1/doc.go b/spanner/admin/instance/apiv1/doc.go
index b0c9821..dd4ea68 100644
--- a/spanner/admin/instance/apiv1/doc.go
+++ b/spanner/admin/instance/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package instance is an experimental, auto-generated package for the
-// instance API.
+// Cloud Spanner Instance Admin API.
 //
 package instance // import "cloud.google.com/go/spanner/admin/instance/apiv1"
 
@@ -31,6 +31,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/spanner/admin/instance/apiv1/instance_admin_client.go b/spanner/admin/instance/apiv1/instance_admin_client.go
index 138e813..281433d 100644
--- a/spanner/admin/instance/apiv1/instance_admin_client.go
+++ b/spanner/admin/instance/apiv1/instance_admin_client.go
@@ -76,17 +76,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    1000 * time.Millisecond,
-					Max:        32000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &InstanceAdminCallOptions{
 		ListInstanceConfigs: retry[[2]string{"default", "idempotent"}],
diff --git a/spanner/admin/instance/apiv1/instance_admin_client_example_test.go b/spanner/admin/instance/apiv1/instance_admin_client_example_test.go
index ee807fd..ba506fc 100644
--- a/spanner/admin/instance/apiv1/instance_admin_client_example_test.go
+++ b/spanner/admin/instance/apiv1/instance_admin_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/spanner/admin/instance/apiv1"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	iampb "google.golang.org/genproto/googleapis/iam/v1"
 	instancepb "google.golang.org/genproto/googleapis/spanner/admin/instance/v1"
 )
@@ -46,9 +47,11 @@
 	it := c.ListInstanceConfigs(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
@@ -86,9 +89,11 @@
 	it := c.ListInstances(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/spanner/admin/instance/apiv1/mock_test.go b/spanner/admin/instance/apiv1/mock_test.go
index 8728d0b..0b2bb2f 100644
--- a/spanner/admin/instance/apiv1/mock_test.go
+++ b/spanner/admin/instance/apiv1/mock_test.go
@@ -42,6 +42,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -263,7 +264,7 @@
 
 func TestInstanceAdminListInstanceConfigsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedParent string = InstanceAdminProjectPath("[PROJECT]")
 	var request = &instancepb.ListInstanceConfigsRequest{
@@ -277,7 +278,9 @@
 
 	resp, err := c.ListInstanceConfigs(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -322,7 +325,7 @@
 
 func TestInstanceAdminGetInstanceConfigError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = InstanceAdminInstanceConfigPath("[PROJECT]", "[INSTANCE_CONFIG]")
 	var request = &instancepb.GetInstanceConfigRequest{
@@ -336,7 +339,9 @@
 
 	resp, err := c.GetInstanceConfig(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -392,7 +397,7 @@
 
 func TestInstanceAdminListInstancesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedParent string = InstanceAdminProjectPath("[PROJECT]")
 	var request = &instancepb.ListInstancesRequest{
@@ -406,7 +411,9 @@
 
 	resp, err := c.ListInstances(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -455,7 +462,7 @@
 
 func TestInstanceAdminGetInstanceError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = InstanceAdminInstancePath("[PROJECT]", "[INSTANCE]")
 	var request = &instancepb.GetInstanceRequest{
@@ -469,7 +476,9 @@
 
 	resp, err := c.GetInstance(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -566,7 +575,9 @@
 	}
 	resp, err := respLRO.Wait(context.Background())
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -659,7 +670,9 @@
 	}
 	resp, err := respLRO.Wait(context.Background())
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -696,7 +709,7 @@
 
 func TestInstanceAdminDeleteInstanceError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedName string = InstanceAdminInstancePath("[PROJECT]", "[INSTANCE]")
 	var request = &instancepb.DeleteInstanceRequest{
@@ -710,7 +723,9 @@
 
 	err = c.DeleteInstance(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -756,7 +771,7 @@
 
 func TestInstanceAdminSetIamPolicyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = InstanceAdminInstancePath("[PROJECT]", "[INSTANCE]")
 	var policy *iampb.Policy = &iampb.Policy{}
@@ -772,7 +787,9 @@
 
 	resp, err := c.SetIamPolicy(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -817,7 +834,7 @@
 
 func TestInstanceAdminGetIamPolicyError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = InstanceAdminInstancePath("[PROJECT]", "[INSTANCE]")
 	var request = &iampb.GetIamPolicyRequest{
@@ -831,7 +848,9 @@
 
 	resp, err := c.GetIamPolicy(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -873,7 +892,7 @@
 
 func TestInstanceAdminTestIamPermissionsError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockInstanceAdmin.err = grpc.Errorf(errCode, "test error")
+	mockInstanceAdmin.err = gstatus.Error(errCode, "test error")
 
 	var formattedResource string = InstanceAdminInstancePath("[PROJECT]", "[INSTANCE]")
 	var permissions []string = nil
@@ -889,7 +908,9 @@
 
 	resp, err := c.TestIamPermissions(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/speech/apiv1/doc.go b/speech/apiv1/doc.go
index a50a2a8..c884fa9 100644
--- a/speech/apiv1/doc.go
+++ b/speech/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package speech is an experimental, auto-generated package for the
-// speech API.
+// Google Cloud Speech API.
 //
 // Google Cloud Speech API.
 package speech // import "cloud.google.com/go/speech/apiv1"
@@ -32,6 +32,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/speech/apiv1/mock_test.go b/speech/apiv1/mock_test.go
index 2416c72..331e0d6 100644
--- a/speech/apiv1/mock_test.go
+++ b/speech/apiv1/mock_test.go
@@ -39,6 +39,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -187,7 +188,7 @@
 
 func TestSpeechRecognizeError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSpeech.err = grpc.Errorf(errCode, "test error")
+	mockSpeech.err = gstatus.Error(errCode, "test error")
 
 	var encoding speechpb.RecognitionConfig_AudioEncoding = speechpb.RecognitionConfig_FLAC
 	var sampleRateHertz int32 = 44100
@@ -215,7 +216,9 @@
 
 	resp, err := c.Recognize(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -323,7 +326,9 @@
 	}
 	resp, err := respLRO.Wait(context.Background())
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -370,7 +375,7 @@
 
 func TestSpeechStreamingRecognizeError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSpeech.err = grpc.Errorf(errCode, "test error")
+	mockSpeech.err = gstatus.Error(errCode, "test error")
 
 	var request *speechpb.StreamingRecognizeRequest = &speechpb.StreamingRecognizeRequest{}
 
@@ -391,7 +396,9 @@
 	}
 	resp, err := stream.Recv()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/speech/apiv1/speech_client.go b/speech/apiv1/speech_client.go
index 1ae84db..fa6eedc 100644
--- a/speech/apiv1/speech_client.go
+++ b/speech/apiv1/speech_client.go
@@ -60,17 +60,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &CallOptions{
 		Recognize:            retry[[2]string{"default", "idempotent"}],
diff --git a/speech/apiv1beta1/doc.go b/speech/apiv1beta1/doc.go
index 97f9095..1bd7911 100644
--- a/speech/apiv1beta1/doc.go
+++ b/speech/apiv1beta1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package speech is an experimental, auto-generated package for the
-// speech API.
+// Google Cloud Speech API.
 //
 // Google Cloud Speech API.
 package speech // import "cloud.google.com/go/speech/apiv1beta1"
@@ -32,6 +32,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/speech/apiv1beta1/mock_test.go b/speech/apiv1beta1/mock_test.go
index 2a2f328..03cd96f 100644
--- a/speech/apiv1beta1/mock_test.go
+++ b/speech/apiv1beta1/mock_test.go
@@ -39,6 +39,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -185,7 +186,7 @@
 
 func TestSpeechSyncRecognizeError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSpeech.err = grpc.Errorf(errCode, "test error")
+	mockSpeech.err = gstatus.Error(errCode, "test error")
 
 	var encoding speechpb.RecognitionConfig_AudioEncoding = speechpb.RecognitionConfig_FLAC
 	var sampleRate int32 = 44100
@@ -211,7 +212,9 @@
 
 	resp, err := c.SyncRecognize(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -315,7 +318,9 @@
 	}
 	resp, err := respLRO.Wait(context.Background())
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -365,7 +370,7 @@
 
 func TestSpeechStreamingRecognizeError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockSpeech.err = grpc.Errorf(errCode, "test error")
+	mockSpeech.err = gstatus.Error(errCode, "test error")
 
 	var request *speechpb.StreamingRecognizeRequest = &speechpb.StreamingRecognizeRequest{}
 
@@ -386,7 +391,9 @@
 	}
 	resp, err := stream.Recv()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/speech/apiv1beta1/speech_client.go b/speech/apiv1beta1/speech_client.go
index 4b04919..609d7b2 100644
--- a/speech/apiv1beta1/speech_client.go
+++ b/speech/apiv1beta1/speech_client.go
@@ -60,17 +60,6 @@
 				})
 			}),
 		},
-		{"default", "non_idempotent"}: {
-			gax.WithRetry(func() gax.Retryer {
-				return gax.OnCodes([]codes.Code{
-					codes.Unavailable,
-				}, gax.Backoff{
-					Initial:    100 * time.Millisecond,
-					Max:        60000 * time.Millisecond,
-					Multiplier: 1.3,
-				})
-			}),
-		},
 	}
 	return &CallOptions{
 		SyncRecognize:      retry[[2]string{"default", "idempotent"}],
diff --git a/trace/apiv1/doc.go b/trace/apiv1/doc.go
index 0b04376..b5878ca 100644
--- a/trace/apiv1/doc.go
+++ b/trace/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package trace is an experimental, auto-generated package for the
-// trace API.
+// Stackdriver Trace API.
 //
 // Send and retrieve trace data from Stackdriver Trace. Data is generated and
 // available by default for all App Engine applications. Data from other
@@ -37,6 +37,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/trace/apiv1/mock_test.go b/trace/apiv1/mock_test.go
index b8f338a..c69283b 100644
--- a/trace/apiv1/mock_test.go
+++ b/trace/apiv1/mock_test.go
@@ -39,6 +39,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -159,7 +160,7 @@
 
 func TestTraceServicePatchTracesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockTrace.err = grpc.Errorf(errCode, "test error")
+	mockTrace.err = gstatus.Error(errCode, "test error")
 
 	var projectId string = "projectId-1969970175"
 	var traces *cloudtracepb.Traces = &cloudtracepb.Traces{}
@@ -175,7 +176,9 @@
 
 	err = c.PatchTraces(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 }
@@ -221,7 +224,7 @@
 
 func TestTraceServiceGetTraceError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockTrace.err = grpc.Errorf(errCode, "test error")
+	mockTrace.err = gstatus.Error(errCode, "test error")
 
 	var projectId string = "projectId-1969970175"
 	var traceId string = "traceId1270300245"
@@ -237,7 +240,9 @@
 
 	resp, err := c.GetTrace(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
@@ -293,7 +298,7 @@
 
 func TestTraceServiceListTracesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockTrace.err = grpc.Errorf(errCode, "test error")
+	mockTrace.err = gstatus.Error(errCode, "test error")
 
 	var projectId string = "projectId-1969970175"
 	var request = &cloudtracepb.ListTracesRequest{
@@ -307,7 +312,9 @@
 
 	resp, err := c.ListTraces(context.Background(), request).Next()
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/trace/apiv1/trace_client_example_test.go b/trace/apiv1/trace_client_example_test.go
index 733c591..ee885a7 100644
--- a/trace/apiv1/trace_client_example_test.go
+++ b/trace/apiv1/trace_client_example_test.go
@@ -19,6 +19,7 @@
 import (
 	"cloud.google.com/go/trace/apiv1"
 	"golang.org/x/net/context"
+	"google.golang.org/api/iterator"
 	cloudtracepb "google.golang.org/genproto/googleapis/devtools/cloudtrace/v1"
 )
 
@@ -79,9 +80,11 @@
 	it := c.ListTraces(ctx, req)
 	for {
 		resp, err := it.Next()
+		if err == iterator.Done {
+			break
+		}
 		if err != nil {
 			// TODO: Handle error.
-			break
 		}
 		// TODO: Use resp.
 		_ = resp
diff --git a/videointelligence/apiv1beta1/doc.go b/videointelligence/apiv1beta1/doc.go
index 70ec302..0240b18 100644
--- a/videointelligence/apiv1beta1/doc.go
+++ b/videointelligence/apiv1beta1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package videointelligence is an experimental, auto-generated package for the
-// videointelligence API.
+// Google Cloud Video Intelligence API.
 //
 // Google Cloud Video Intelligence API.
 //
@@ -34,6 +34,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/videointelligence/apiv1beta1/mock_test.go b/videointelligence/apiv1beta1/mock_test.go
index df5c8a7..7615da5 100644
--- a/videointelligence/apiv1beta1/mock_test.go
+++ b/videointelligence/apiv1beta1/mock_test.go
@@ -39,6 +39,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -124,7 +125,7 @@
 		Features: features,
 	}
 
-	c, err := NewVideoIntelligenceClient(context.Background(), clientOpt)
+	c, err := NewClient(context.Background(), clientOpt)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -169,7 +170,7 @@
 		Features: features,
 	}
 
-	c, err := NewVideoIntelligenceClient(context.Background(), clientOpt)
+	c, err := NewClient(context.Background(), clientOpt)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -180,7 +181,9 @@
 	}
 	resp, err := respLRO.Wait(context.Background())
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
diff --git a/videointelligence/apiv1beta1/video_intelligence_client.go b/videointelligence/apiv1beta1/video_intelligence_client.go
index 9ad1746..13cfbba 100644
--- a/videointelligence/apiv1beta1/video_intelligence_client.go
+++ b/videointelligence/apiv1beta1/video_intelligence_client.go
@@ -32,19 +32,19 @@
 	"google.golang.org/grpc/codes"
 )
 
-// VideoIntelligenceCallOptions contains the retry settings for each method of VideoIntelligenceClient.
-type VideoIntelligenceCallOptions struct {
+// CallOptions contains the retry settings for each method of Client.
+type CallOptions struct {
 	AnnotateVideo []gax.CallOption
 }
 
-func defaultVideoIntelligenceClientOptions() []option.ClientOption {
+func defaultClientOptions() []option.ClientOption {
 	return []option.ClientOption{
 		option.WithEndpoint("videointelligence.googleapis.com:443"),
 		option.WithScopes(DefaultAuthScopes()...),
 	}
 }
 
-func defaultVideoIntelligenceCallOptions() *VideoIntelligenceCallOptions {
+func defaultCallOptions() *CallOptions {
 	retry := map[[2]string][]gax.CallOption{
 		{"default", "idempotent"}: {
 			gax.WithRetry(func() gax.Retryer {
@@ -59,18 +59,18 @@
 			}),
 		},
 	}
-	return &VideoIntelligenceCallOptions{
+	return &CallOptions{
 		AnnotateVideo: retry[[2]string{"default", "idempotent"}],
 	}
 }
 
-// VideoIntelligenceClient is a client for interacting with Google Cloud Video Intelligence API.
-type VideoIntelligenceClient struct {
+// Client is a client for interacting with Google Cloud Video Intelligence API.
+type Client struct {
 	// The connection to the service.
 	conn *grpc.ClientConn
 
 	// The gRPC API client.
-	videoIntelligenceClient videointelligencepb.VideoIntelligenceServiceClient
+	client videointelligencepb.VideoIntelligenceServiceClient
 
 	// LROClient is used internally to handle longrunning operations.
 	// It is exposed so that its CallOptions can be modified if required.
@@ -78,25 +78,25 @@
 	LROClient *lroauto.OperationsClient
 
 	// The call options for this service.
-	CallOptions *VideoIntelligenceCallOptions
+	CallOptions *CallOptions
 
 	// The metadata to be sent with each request.
 	xGoogHeader []string
 }
 
-// NewVideoIntelligenceClient creates a new video intelligence service client.
+// NewClient creates a new video intelligence service client.
 //
 // Service that implements Google Cloud Video Intelligence API.
-func NewVideoIntelligenceClient(ctx context.Context, opts ...option.ClientOption) (*VideoIntelligenceClient, error) {
-	conn, err := transport.DialGRPC(ctx, append(defaultVideoIntelligenceClientOptions(), opts...)...)
+func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
+	conn, err := transport.DialGRPC(ctx, append(defaultClientOptions(), opts...)...)
 	if err != nil {
 		return nil, err
 	}
-	c := &VideoIntelligenceClient{
+	c := &Client{
 		conn:        conn,
-		CallOptions: defaultVideoIntelligenceCallOptions(),
+		CallOptions: defaultCallOptions(),
 
-		videoIntelligenceClient: videointelligencepb.NewVideoIntelligenceServiceClient(conn),
+		client: videointelligencepb.NewVideoIntelligenceServiceClient(conn),
 	}
 	c.SetGoogleClientInfo()
 
@@ -114,20 +114,20 @@
 }
 
 // Connection returns the client's connection to the API service.
-func (c *VideoIntelligenceClient) Connection() *grpc.ClientConn {
+func (c *Client) Connection() *grpc.ClientConn {
 	return c.conn
 }
 
 // Close closes the connection to the API service. The user should invoke this when
 // the client is no longer required.
-func (c *VideoIntelligenceClient) Close() error {
+func (c *Client) Close() error {
 	return c.conn.Close()
 }
 
 // SetGoogleClientInfo sets the name and version of the application in
 // the `x-goog-api-client` header passed on each request. Intended for
 // use by Google-written clients.
-func (c *VideoIntelligenceClient) SetGoogleClientInfo(keyval ...string) {
+func (c *Client) SetGoogleClientInfo(keyval ...string) {
 	kv := append([]string{"gl-go", version.Go()}, keyval...)
 	kv = append(kv, "gapic", version.Repo, "gax", gax.Version, "grpc", grpc.Version)
 	c.xGoogHeader = []string{gax.XGoogHeader(kv...)}
@@ -137,13 +137,13 @@
 // retrieved through the `google.longrunning.Operations` interface.
 // `Operation.metadata` contains `AnnotateVideoProgress` (progress).
 // `Operation.response` contains `AnnotateVideoResponse` (results).
-func (c *VideoIntelligenceClient) AnnotateVideo(ctx context.Context, req *videointelligencepb.AnnotateVideoRequest, opts ...gax.CallOption) (*AnnotateVideoOperation, error) {
+func (c *Client) AnnotateVideo(ctx context.Context, req *videointelligencepb.AnnotateVideoRequest, opts ...gax.CallOption) (*AnnotateVideoOperation, error) {
 	ctx = insertXGoog(ctx, c.xGoogHeader)
 	opts = append(c.CallOptions.AnnotateVideo[0:len(c.CallOptions.AnnotateVideo):len(c.CallOptions.AnnotateVideo)], opts...)
 	var resp *longrunningpb.Operation
 	err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
 		var err error
-		resp, err = c.videoIntelligenceClient.AnnotateVideo(ctx, req, settings.GRPC...)
+		resp, err = c.client.AnnotateVideo(ctx, req, settings.GRPC...)
 		return err
 	}, opts...)
 	if err != nil {
@@ -161,7 +161,7 @@
 
 // AnnotateVideoOperation returns a new AnnotateVideoOperation from a given name.
 // The name must be that of a previously created AnnotateVideoOperation, possibly from a different process.
-func (c *VideoIntelligenceClient) AnnotateVideoOperation(name string) *AnnotateVideoOperation {
+func (c *Client) AnnotateVideoOperation(name string) *AnnotateVideoOperation {
 	return &AnnotateVideoOperation{
 		lro: longrunning.InternalNewOperation(c.LROClient, &longrunningpb.Operation{Name: name}),
 	}
diff --git a/videointelligence/apiv1beta1/video_intelligence_client_example_test.go b/videointelligence/apiv1beta1/video_intelligence_client_example_test.go
index 6ee4079..b858b39 100644
--- a/videointelligence/apiv1beta1/video_intelligence_client_example_test.go
+++ b/videointelligence/apiv1beta1/video_intelligence_client_example_test.go
@@ -22,9 +22,9 @@
 	videointelligencepb "google.golang.org/genproto/googleapis/cloud/videointelligence/v1beta1"
 )
 
-func ExampleNewVideoIntelligenceClient() {
+func ExampleNewClient() {
 	ctx := context.Background()
-	c, err := videointelligence.NewVideoIntelligenceClient(ctx)
+	c, err := videointelligence.NewClient(ctx)
 	if err != nil {
 		// TODO: Handle error.
 	}
@@ -32,9 +32,9 @@
 	_ = c
 }
 
-func ExampleVideoIntelligenceClient_AnnotateVideo() {
+func ExampleClient_AnnotateVideo() {
 	ctx := context.Background()
-	c, err := videointelligence.NewVideoIntelligenceClient(ctx)
+	c, err := videointelligence.NewClient(ctx)
 	if err != nil {
 		// TODO: Handle error.
 	}
diff --git a/vision/apiv1/doc.go b/vision/apiv1/doc.go
index a26220c..b86cca3 100644
--- a/vision/apiv1/doc.go
+++ b/vision/apiv1/doc.go
@@ -15,7 +15,7 @@
 // AUTO-GENERATED CODE. DO NOT EDIT.
 
 // Package vision is an experimental, auto-generated package for the
-// vision API.
+// Google Cloud Vision API.
 //
 // Integrates Google Vision features, including image labeling, face, logo,
 // and landmark detection, optical character recognition (OCR), and detection
@@ -36,6 +36,8 @@
 	return metadata.NewOutgoingContext(ctx, md)
 }
 
+// DefaultAuthScopes reports the authentication scopes required
+// by this package.
 func DefaultAuthScopes() []string {
 	return []string{
 		"https://www.googleapis.com/auth/cloud-platform",
diff --git a/vision/apiv1/mock_test.go b/vision/apiv1/mock_test.go
index 03446c1..9d47da7 100644
--- a/vision/apiv1/mock_test.go
+++ b/vision/apiv1/mock_test.go
@@ -38,6 +38,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/metadata"
+	gstatus "google.golang.org/grpc/status"
 )
 
 var _ = io.EOF
@@ -135,7 +136,7 @@
 
 func TestImageAnnotatorBatchAnnotateImagesError(t *testing.T) {
 	errCode := codes.PermissionDenied
-	mockImageAnnotator.err = grpc.Errorf(errCode, "test error")
+	mockImageAnnotator.err = gstatus.Error(errCode, "test error")
 
 	var requests []*visionpb.AnnotateImageRequest = nil
 	var request = &visionpb.BatchAnnotateImagesRequest{
@@ -149,7 +150,9 @@
 
 	resp, err := c.BatchAnnotateImages(context.Background(), request)
 
-	if c := grpc.Code(err); c != errCode {
+	if st, ok := gstatus.FromError(err); !ok {
+		t.Errorf("got error %v, expected grpc error", err)
+	} else if c := st.Code(); c != errCode {
 		t.Errorf("got error code %q, want %q", c, errCode)
 	}
 	_ = resp
