From 2bc43ea8ca67d3b641d9fa263056dd2b49c65091 Mon Sep 17 00:00:00 2001 From: Maggie Nolan Date: Wed, 17 Jun 2020 16:19:18 -0700 Subject: [PATCH] Squashed 'third_party/googleapis/' changes from cd3ce2651..251d93587 251d93587 fix: migrate videointelligence/v1p3beta1 to grpc_service_config 13883b8fa fix: migrate videointelligence/v1p2beta1 to grpc_service_config b89b7a0ec fix: migrate videointelligence/v1p1beta1 to grpc_service_config 76dba26d5 fix: migrate videointelligence/v1beta2 to grpc_service_config c00a3bc9d fix: migrate videointelligence/v1 to grpc_service_config 923b98367 fix: migrate tasks/v2beta2 to grpc_service_config 8c53b2cb7 fix: migrate tasks/v2beta3 to grpc_service_config 7272af32a fix: migrate tasks/v2 to grpc_service_config 0802ed4df fix: migrate scheduler/v1 to grpc_service_config c62551667 fix: migrate speech/v1 to grpc_service_config 791505db4 fix: migrate speech/v1p1beta1 to grpc_service_config 1c25156bc Add protos and configs for the Google Analytics Data API v1 alpha. 3dcb344dd feat: added support for condition in Feed docs: updated existing docs. c1ba5ba3f fix: migrate securitycenter/settings/v1beta1 to grpc_service_config 714a5f10f Specify allowed fields for UpdateNotificationConfig 88ee692c9 fix: migrate scheduler/v1beta1 to grpc_service_config 57e72ebf7 fix: migrate redis/v1beta1 to grpc_service_config cdca6d8c0 Fix a format issue and missing document content. 45051b73c fix: migrate secrets/v1beta1 to grpc_service_config f92415eb3 fix: migrate secretmanager/v1 to grpc_service_config 1174f4ab1 fix: migrate redis/v1 to grpc_service_config 9b170a4f3 feat: retry CommitRequests that fail with UNAVAILABLE 9ba904b23 fix: migrate memcache/v1beta2 to grpc_service_config 864dfeafd fix: remove "com." prefix in config service names 8cbfef5dd chore: update gapic-generator to v2.2.0 184661793 fix: use protoc-docs-plugin 0.8.0 e176585e0 fix: migrate recommender/v1beta1 to grpc_service_config 8d07e2a5d fix: migrate recommender/v1 to grpc_service_config b5653ef55 chore: set Ruby namespace in proto options 1c722ced8 fix: migrate recommendationengine/v1beta1 to grpc_service_config 90a86b592 Introduce notion of "dimensionless" units earlier in descriptive text. 6b2d14d2f fix!:Provide C# namespace option for consistent capitalization. 77e7fa104 fix: migrate osconfig & agentendpoint to grpc_service_config c829fa0bf chore: set Ruby namespace in proto options 66f959b51 chore: set Ruby namespace in proto options 10f05cf8d chore: set Ruby namespace in proto options de8e811fc chore: set Ruby namespace in proto options 94fe36375 chore: set Ruby namespace in proto options e0558da52 chore: set Ruby namespace in proto options cbaf1b693 fix: migrate recaptchaenterprise/v1beta1 to grpc_service_config 77e8ca70c fix: migrate recaptchaenterprise/v1 to grpc_service_config 500ecc44a fix: migrate phishingprotection/v1beta1 to grpc_service_config 433a11ac9 chore: set Ruby namespace in proto options 36b349fba fix: migrate oslogin/v1beta to grpc_service_config 91b7e0e58 fix: migrate oslogin/v1 to grpc_service_config cf1a64d9a chore: remove unused documentai/v1beta1 atman dfacde6f1 fix: migrate kms/v1 to grpc_service_config 0edf3ff66 fix: migrate documentai/v1beta2 to grpc_service_config 2e34b87de fix: migrate documentai/v1beta1 to grpc_service_config b789f7905 fix!: Fix the version casing in the C# namespace option BREAKING CHANGE: This would break any C# code already generated, but this file is very new, so is unlikely to break anyone. a19b46e54 docs: Add a link to Pub/Sub filtering language public documentation to pubsub.proto bc25a1022 fix: migrate mediatranslation/v1beta1 to grpc_service_config 85b490ab5 fix: migrate managedidentities/v1 to grpc_service_config 0aa979424 fix: migrate servicemanagement/v1 to grpc_service_config 6c72f274c fix: migrate functions/v1beta2 to grpc_service_config a8ebb52bc fix: migrate asset/v1p2beta1 to grpc_service_config 00de455b5 fix: migrate asset/v1beta1 to grpc_service_config 81226871c docs: Change relative URLs to absolute URLs to fix broken links. 203ed2605 fix: migrate asset/v1p1beta1 to grpc_service_config 8a81e7e3e fix: migrate asset/v1p4beta1 to grpc_service_config e49496351 fix: migrate binaryauth/v1beta1 to grpc_service_config a927c3518 fix: update method_signature annotation for list RPC 027e9775e feat: Add Resource to the vp1beta1 NotificationMessage, which contains resource-related fields associated to the Finding notification. 49e84e1df feat: added support for ListAssets API Beta. 3e7056405 feat: Add Resource to the v1 NotificationMessage, which contains resource-related fields associated to the Finding notification. docs: Adjusted wording from Cloud SCC to Security Command Center, and updated filtering docs for List APIs. ed1174659 fix!: Provide C#, Ruby and PHP namespace/package options. ca1372c6d Regular update of Google API service config with clarification of documentations. 60c7a4c6e fix: increase dataproc lro polling timeouts 148a3caa5 fix: dataproc/v1 raise workflow template service timeouts in gapic v2 3c5166c1d Add support for secondary_aggregation and Monitoring Query Language. 0fb2fbf04 chore: update gapic-generator to v2.1.0 dd244bb3a docs: Fixed broken links in the reference documentation 40a354b0f chore: add protoc proto3_optional flag in bazelrc cd804bab0 docs: cleaned docs for the Agents service and resource. 68c72c1d1 Use gapic-generator-typescript v1.0.0 for TypeScript libraries continuous integration. 150cfa0d9 fix: dataproc/v1 raise timeouts in gapic v2 ef180e07d docs: change relative URLs to absolute URLs to fix broken links. 86285bbd5 Add "detached" bool to Subscription 8070bcb14 docs: Remove a broken link from the documentation. c77929eb8 docs: fix a broken link in the docs. 51362f378 docs: change relative URLs to absolute URLs to fix broken links. 8f41c697c docs: fix several broken links in the docs. 1db88f2a4 Update open-sourced google/api/servicecontrol/v1 to 2020/06/01 e45a2f54d docs: change relative URLs to absolute URLs to fix broken links. 8dbe1d7f9 fix: Fix Recommendationengine bazel dependencies c1fae183d docs: change relative URLs to absolute URLs to fix broken links. 3b775158c Remove Tasks service from Remote Workers API. f72c3a53f docs: fix several broken links in the docs. d5fe42c39 firestore: add BatchWrite 8be377046 docs: change relative URLs to absolute URLs to fix broken links. 55094be64 docs: change relative URLs to absolute URLs to fix broken links. ce56112c3 chore: fix all deps on LRO in go_gapic_library 3a4894c4f chore: update gapic-generator and go microgen cb986db8a AdMob API v1 20200601 1. Get rid of cloud package [breaking change]; 2. Add AD_TYPE dimension to Network report; 3. Add time_zone to the Network and Mediation report; 4. Update the proto comments. 907754d70 - Add CreateCapacityCommitment method to BigQuery Reservation v1beta1. - Update missing child_type annotations for v1 and v1beta1 proto annotations. - Revert name of bi_reservation back to reservation for v1beta1 service. ded05197d fix: use grpc_service_config in nodejs_gapic_library 19541c49d chore: update gapic-generator to v2.0.2 9309ee734 chore: enable gapicv2 for oslogin/v1beta1 API fb21971be Drop the experimental tag on the Subscription filter and retry policy fields Clarify some retry policy comments 27e6443a6 fix: update configuration artifacts for bigquery connection API code generation f4bd71cc1 docs: Add comment for MessageStoragePolicy message eafa840ce Use correct resource type for DetachSubscriptionRequest c4e37010d bazel: update protobuf, rules_go, gazelle, and gapic-generator-go versions - protobuf v3.12.1 - rules_go v0.23.0 - gazelle v0.21.0 - gapic-generator-go v0.14.1 576234f17 feat: add one additional binding for SearchAgents API; clean up deps; update Go library. docs: update doc links for intent. 890817827 - Update SamplePlayableLocations minimum spacing documentation - Add client library configurations f5f268f52 Add DetachSubscription RPC af7903d2f Cloud Billing Budget API v1alpha1 Add support for subaccounts and labels filter fields. f563b1dff docs: Properly format literal strings. 973c67182 Update grpc config files to be consistent. cd43cbb44 feat: use https://github.com/googleapis/gapic-generator-typescript for generating Node.js (TypeScript) libraries. acdadb2d1 chore: add default_host and oauth_scopes annotations to support new client library generators. dec320417 Upgrade protoc-docs-plugin version to 0.7.0 to fix unstable docstrings. 1b101f55a Cloud Billing Budget API v1beta1 Add support for subaccounts and labels filter fields. 747dfd171 Updated annotations!: Changing method signatures and 'REQUIRED' annotations to reflect the need to always include 'partial_failure' parameter in calls to certain conversion-related services. d8a17933f fix: inconsistent json and yaml spanner configs a175708ac fix: bigtable v2 retry config settings to disable streaming RPC retries cdf59a761 Update bigtable grpc service config 7a8875d4b feat!: additional client library annotations feat: reload information in the Document resource BREAKING CHANGE: additional long-running operation annotations BREAKING CHANGE: some existing request fields are now explicitly required BREAKING CHANGE: the order of the Session resource patterns has changed 247c65147 Export protos for pubsublite.googleapis.com. git-subtree-dir: third_party/googleapis git-subtree-split: 251d9358730b5cec7625d9f42879444a7d5369d5 --- .bazelrc | 1 + WORKSPACE | 75 ++- google/ads/admob/v1/BUILD.bazel | 21 +- google/ads/admob/v1/admob_api.proto | 15 +- google/ads/admob/v1/admob_gapic.yaml | 10 +- google/ads/admob/v1/admob_resources.proto | 61 +- google/ads/googleads/v1/common/bidding.proto | 2 +- .../v1/common/keyword_plan_common.proto | 8 +- google/ads/googleads/v1/common/metrics.proto | 2 +- .../keyword_plan_competition_level.proto | 6 +- .../googleads/v1/errors/customer_error.proto | 1 - google/ads/googleads/v1/resources/ad.proto | 1 + .../ads/googleads/v1/resources/campaign.proto | 62 +- .../v1/resources/keyword_plan_campaign.proto | 1 - .../v1/resources/recommendation.proto | 66 +- ...conversion_adjustment_upload_service.proto | 6 +- .../services/conversion_upload_service.proto | 12 +- .../v1/services/customer_service.proto | 1 - .../v1/services/keyword_plan_service.proto | 2 +- google/ads/googleads/v2/common/bidding.proto | 2 +- .../v2/common/keyword_plan_common.proto | 8 +- google/ads/googleads/v2/common/metrics.proto | 2 +- .../keyword_plan_competition_level.proto | 6 +- .../googleads/v2/errors/customer_error.proto | 1 - google/ads/googleads/v2/resources/ad.proto | 1 + .../ads/googleads/v2/resources/campaign.proto | 34 +- .../ads/googleads/v2/resources/invoice.proto | 1 - .../v2/resources/keyword_plan_campaign.proto | 1 - .../v2/resources/recommendation.proto | 78 +-- ...conversion_adjustment_upload_service.proto | 6 +- .../services/conversion_upload_service.proto | 12 +- .../v2/services/keyword_plan_service.proto | 2 +- .../v2/services/reach_plan_service.proto | 21 +- google/analytics/data/v1alpha/BUILD.bazel | 358 ++++++++++ .../data/v1alpha/analytics_data_api.proto | 306 +++++++++ .../analytics_data_grpc_service_config.json | 36 + .../data/v1alpha/analyticsdata_gapic.yaml | 18 + .../data/v1alpha/analyticsdata_v1alpha.yaml | 23 + google/analytics/data/v1alpha/data.proto | 614 ++++++++++++++++++ .../analytics/management/v1alpha/BUILD.bazel | 2 +- google/api/auth.proto | 14 +- google/api/backend.proto | 3 +- google/api/billing.proto | 28 +- google/api/client.proto | 3 +- google/api/config_change.proto | 3 +- google/api/context.proto | 3 +- google/api/control.proto | 3 +- google/api/distribution.proto | 3 +- google/api/documentation.proto | 9 +- google/api/endpoint.proto | 6 +- google/api/field_behavior.proto | 3 +- google/api/http.proto | 3 +- google/api/httpbody.proto | 3 +- google/api/label.proto | 3 +- google/api/launch_stage.proto | 9 +- google/api/log.proto | 3 +- google/api/logging.proto | 3 +- google/api/metric.proto | 60 +- google/api/monitored_resource.proto | 51 +- google/api/monitoring.proto | 3 +- google/api/quota.proto | 8 +- google/api/resource.proto | 24 +- google/api/service.proto | 9 +- google/api/servicecontrol/v1/BUILD.bazel | 3 +- .../api/servicecontrol/v1/check_error.proto | 59 +- google/api/servicecontrol/v1/log_entry.proto | 1 - .../api/servicecontrol/v1/metric_value.proto | 7 +- google/api/servicecontrol/v1/operation.proto | 17 +- .../servicecontrol/v1/quota_controller.proto | 29 +- .../v1/service_controller.proto | 71 +- google/api/servicemanagement/v1/BUILD.bazel | 6 +- google/api/source_info.proto | 3 +- google/api/system_parameter.proto | 3 +- google/api/usage.proto | 3 +- google/bigtable/admin/v2/BUILD.bazel | 3 +- .../admin/v2/bigtable_instance_admin.proto | 1 + .../admin/v2/bigtable_table_admin.proto | 1 + google/bigtable/admin/v2/common.proto | 1 + google/bigtable/admin/v2/instance.proto | 1 + google/bigtable/admin/v2/table.proto | 1 + google/bigtable/v2/BUILD.bazel | 2 +- google/bigtable/v2/bigtable.proto | 1 + google/bigtable/v2/bigtable_gapic.yaml | 17 +- .../v2/bigtable_grpc_service_config.json | 65 +- google/bigtable/v2/data.proto | 1 + google/chromeos/moblab/v1beta1/BUILD.bazel | 3 +- google/cloud/accessapproval/v1/BUILD.bazel | 2 +- google/cloud/asset/v1/BUILD.bazel | 9 +- google/cloud/asset/v1/asset_service.proto | 66 +- google/cloud/asset/v1/assets.proto | 89 ++- google/cloud/asset/v1beta1/BUILD.bazel | 6 +- google/cloud/asset/v1p1beta1/BUILD.bazel | 5 +- google/cloud/asset/v1p2beta1/BUILD.bazel | 6 +- google/cloud/asset/v1p4beta1/BUILD.bazel | 6 +- google/cloud/asset/v1p5beta1/BUILD.bazel | 375 +++++++++++ .../cloud/asset/v1p5beta1/asset_service.proto | 112 ++++ google/cloud/asset/v1p5beta1/assets.proto | 127 ++++ .../asset/v1p5beta1/cloudasset_gapic.yaml | 21 + .../cloudasset_grpc_service_config.json | 22 + .../asset/v1p5beta1/cloudasset_v1p5beta1.yaml | 32 + google/cloud/automl/v1/BUILD.bazel | 3 +- google/cloud/automl/v1beta1/BUILD.bazel | 3 +- .../cloud/bigquery/connection/v1/BUILD.bazel | 194 +++++- .../bigquery/connection/v1/connection.proto | 6 +- .../connection/v1/connection_gapic.yaml | 9 + .../bigquery/connection/v1beta1/BUILD.bazel | 60 +- .../bigquery/datatransfer/v1/BUILD.bazel | 2 +- .../cloud/bigquery/reservation/v1/BUILD.bazel | 2 +- .../bigquery/reservation/v1/reservation.proto | 144 ++-- .../bigquery/reservation/v1beta1/BUILD.bazel | 2 +- .../bigqueryreservation_gapic.legacy.yaml | 14 + ...gqueryreservation_grpc_service_config.json | 4 + .../v1beta1/bigqueryreservation_v1beta1.yaml | 7 + .../reservation/v1beta1/reservation.proto | 294 ++++++--- google/cloud/bigquery/storage/v1/BUILD.bazel | 2 +- .../bigquery/storage/v1alpha2/BUILD.bazel | 2 +- .../bigquery/storage/v1beta1/BUILD.bazel | 2 +- .../bigquery/storage/v1beta2/BUILD.bazel | 2 +- google/cloud/bigquery/v2/BUILD.bazel | 2 +- .../billing/budgets/v1alpha1/BUILD.bazel | 2 + .../budgets/v1alpha1/budget_model.proto | 14 + .../cloud/billing/budgets/v1beta1/BUILD.bazel | 4 +- .../budgets/v1beta1/budget_model.proto | 14 + .../budgets/v1beta1/budget_service.proto | 6 +- google/cloud/billing/v1/BUILD.bazel | 2 +- .../binaryauthorization/v1beta1/BUILD.bazel | 5 +- google/cloud/datacatalog/v1/BUILD.bazel | 2 +- .../datacatalog/v1/gcs_fileset_spec.proto | 8 +- google/cloud/datacatalog/v1beta1/BUILD.bazel | 2 +- .../v1beta1/gcs_fileset_spec.proto | 8 +- google/cloud/datalabeling/v1beta1/BUILD.bazel | 3 +- google/cloud/dataproc/v1/BUILD.bazel | 3 +- google/cloud/dataproc/v1/dataproc_gapic.yaml | 43 +- google/cloud/dataproc/v1/jobs.proto | 5 +- google/cloud/dataproc/v1beta2/BUILD.bazel | 3 +- google/cloud/dataproc/v1beta2/jobs.proto | 5 +- google/cloud/dialogflow/v2/BUILD.bazel | 3 +- google/cloud/dialogflow/v2/agent.proto | 40 +- google/cloud/dialogflow/v2/audio_config.proto | 166 ++--- google/cloud/dialogflow/v2beta1/BUILD.bazel | 67 +- google/cloud/dialogflow/v2beta1/agent.proto | 77 ++- .../dialogflow/v2beta1/audio_config.proto | 165 ++--- google/cloud/dialogflow/v2beta1/context.proto | 58 +- .../cloud/dialogflow/v2beta1/document.proto | 128 +++- .../dialogflow/v2beta1/entity_type.proto | 136 +++- .../dialogflow/v2beta1/environment.proto | 2 +- google/cloud/dialogflow/v2beta1/intent.proto | 129 ++-- .../dialogflow/v2beta1/knowledge_base.proto | 54 +- google/cloud/dialogflow/v2beta1/session.proto | 15 +- .../v2beta1/session_entity_type.proto | 45 +- .../documentai/artman_documentai_v1beta1.yaml | 34 - google/cloud/documentai/v1beta1/BUILD.bazel | 6 +- .../cloud/documentai/v1beta1/document.proto | 3 + .../v1beta1/document_understanding.proto | 3 + .../documentai/v1beta1/documentai_gapic.yaml | 26 - .../cloud/documentai/v1beta1/geometry.proto | 3 + google/cloud/documentai/v1beta2/BUILD.bazel | 5 +- .../cloud/documentai/v1beta2/document.proto | 3 + .../v1beta2/document_understanding.proto | 3 + .../documentai/v1beta2/documentai_gapic.yaml | 29 - .../cloud/documentai/v1beta2/geometry.proto | 3 + google/cloud/functions/v1beta2/BUILD.bazel | 6 +- google/cloud/gaming/v1beta/BUILD.bazel | 3 +- google/cloud/iot/v1/BUILD.bazel | 2 +- google/cloud/irm/v1alpha2/BUILD.bazel | 2 +- google/cloud/kms/v1/BUILD.bazel | 5 +- google/cloud/kms/v1/cloudkms_gapic.yaml | 55 -- google/cloud/kms/v1/resources.proto | 2 +- google/cloud/language/v1/BUILD.bazel | 2 +- google/cloud/language/v1beta2/BUILD.bazel | 2 +- google/cloud/managedidentities/v1/BUILD.bazel | 6 +- .../managedidentities/v1beta1/BUILD.bazel | 3 +- .../mediatranslation/v1beta1/BUILD.bazel | 5 +- google/cloud/memcache/v1beta2/BUILD.bazel | 6 +- .../memcache/v1beta2/cloud_memcache.proto | 2 +- .../osconfig/agentendpoint/v1/BUILD.bazel | 5 +- .../osconfig/agentendpoint/v1beta/BUILD.bazel | 5 +- google/cloud/osconfig/v1/BUILD.bazel | 5 +- google/cloud/osconfig/v1beta/BUILD.bazel | 5 +- .../cloud/oslogin/artman_oslogin_v1beta.yaml | 2 +- google/cloud/oslogin/v1/BUILD.bazel | 5 +- google/cloud/oslogin/v1/oslogin_gapic.yaml | 20 - google/cloud/oslogin/v1beta/BUILD.bazel | 17 +- .../oslogin/v1beta/oslogin_gapic.legacy.yaml | 222 +++++++ .../cloud/oslogin/v1beta/oslogin_gapic.yaml | 203 +----- .../phishingprotection/v1beta1/BUILD.bazel | 5 +- google/cloud/pubsublite/v1/BUILD.bazel | 180 +++++ google/cloud/pubsublite/v1/admin.proto | 363 +++++++++++ google/cloud/pubsublite/v1/common.proto | 188 ++++++ google/cloud/pubsublite/v1/cursor.proto | 169 +++++ google/cloud/pubsublite/v1/publisher.proto | 95 +++ google/cloud/pubsublite/v1/pubsublite_v1.yaml | 29 + google/cloud/pubsublite/v1/subscriber.proto | 140 ++++ .../cloud/recaptchaenterprise/v1/BUILD.bazel | 5 +- .../recaptchaenterprise/v1beta1/BUILD.bazel | 5 +- .../recommendationengine/v1beta1/BUILD.bazel | 9 +- .../v1beta1/recommendationengine_gapic.yaml | 5 - ...ommendationengine_grpc_service_config.json | 30 +- google/cloud/recommender/v1/BUILD.bazel | 5 +- google/cloud/recommender/v1beta1/BUILD.bazel | 5 +- google/cloud/redis/v1/BUILD.bazel | 6 +- google/cloud/redis/v1/cloud_redis.proto | 4 +- google/cloud/redis/v1/redis_gapic.yaml | 23 - google/cloud/redis/v1beta1/BUILD.bazel | 6 +- google/cloud/redis/v1beta1/cloud_redis.proto | 4 +- google/cloud/redis/v1beta1/redis_gapic.yaml | 23 - google/cloud/scheduler/v1/BUILD.bazel | 5 +- .../scheduler/v1/cloudscheduler_gapic.yaml | 3 - google/cloud/scheduler/v1beta1/BUILD.bazel | 5 +- .../v1beta1/cloudscheduler_gapic.yaml | 7 - google/cloud/secretmanager/v1/BUILD.bazel | 5 +- google/cloud/secrets/v1beta1/BUILD.bazel | 5 +- .../settings/v1beta1/BUILD.bazel | 5 +- google/cloud/securitycenter/v1/BUILD.bazel | 6 +- google/cloud/securitycenter/v1/asset.proto | 49 +- google/cloud/securitycenter/v1/finding.proto | 24 +- .../v1/notification_message.proto | 4 + .../v1/organization_settings.proto | 4 +- google/cloud/securitycenter/v1/resource.proto | 46 ++ .../securitycenter/v1/security_marks.proto | 6 +- .../v1/securitycenter_service.proto | 54 +- .../securitycenter/v1/securitycenter_v1.yaml | 7 +- google/cloud/securitycenter/v1/source.proto | 2 +- .../cloud/securitycenter/v1beta1/BUILD.bazel | 3 +- .../securitycenter/v1p1beta1/BUILD.bazel | 6 +- .../securitycenter/v1p1beta1/asset.proto | 50 +- .../securitycenter/v1p1beta1/finding.proto | 29 +- .../v1p1beta1/notification_config.proto | 18 +- .../v1p1beta1/notification_message.proto | 9 +- .../v1p1beta1/organization_settings.proto | 7 +- .../securitycenter/v1p1beta1/resource.proto | 46 ++ .../run_asset_discovery_response.proto | 3 +- .../v1p1beta1/security_marks.proto | 9 +- .../securitycenter_grpc_service_config.json | 5 +- .../v1p1beta1/securitycenter_service.proto | 113 ++-- .../v1p1beta1/securitycenter_v1p1beta1.yaml | 7 +- .../securitycenter/v1p1beta1/source.proto | 7 +- .../servicedirectory/v1beta1/BUILD.bazel | 2 +- google/cloud/speech/v1/BUILD.bazel | 6 +- google/cloud/speech/v1/speech_gapic.yaml | 12 - google/cloud/speech/v1p1beta1/BUILD.bazel | 6 +- .../cloud/speech/v1p1beta1/speech_gapic.yaml | 12 - google/cloud/talent/v4beta1/BUILD.bazel | 3 +- google/cloud/talent/v4beta1/filters.proto | 2 +- google/cloud/tasks/v2/BUILD.bazel | 5 +- google/cloud/tasks/v2/cloudtasks_gapic.yaml | 43 -- google/cloud/tasks/v2beta2/BUILD.bazel | 5 +- .../cloud/tasks/v2beta2/cloudtasks_gapic.yaml | 48 -- google/cloud/tasks/v2beta3/BUILD.bazel | 5 +- .../cloud/tasks/v2beta3/cloudtasks_gapic.yaml | 40 -- google/cloud/texttospeech/v1/BUILD.bazel | 2 +- google/cloud/texttospeech/v1/cloud_tts.proto | 2 +- google/cloud/texttospeech/v1beta1/BUILD.bazel | 2 +- .../texttospeech/v1beta1/cloud_tts.proto | 2 +- google/cloud/translate/v3/BUILD.bazel | 3 +- google/cloud/translate/v3beta1/BUILD.bazel | 3 +- google/cloud/videointelligence/v1/BUILD.bazel | 5 +- .../v1/videointelligence_gapic.yaml | 10 - .../videointelligence/v1beta2/BUILD.bazel | 5 +- .../v1beta2/videointelligence_gapic.yaml | 11 - .../videointelligence/v1p1beta1/BUILD.bazel | 6 +- .../v1p1beta1/videointelligence_gapic.yaml | 9 - .../videointelligence/v1p2beta1/BUILD.bazel | 6 +- .../v1p2beta1/videointelligence_gapic.yaml | 11 - .../videointelligence/v1p3beta1/BUILD.bazel | 6 +- .../v1p3beta1/videointelligence_gapic.yaml | 29 - google/cloud/vision/v1/BUILD.bazel | 3 +- google/cloud/vision/v1p1beta1/BUILD.bazel | 2 +- google/cloud/vision/v1p2beta1/BUILD.bazel | 3 +- google/cloud/vision/v1p3beta1/BUILD.bazel | 3 +- google/cloud/vision/v1p4beta1/BUILD.bazel | 3 +- google/cloud/webrisk/v1/BUILD.bazel | 2 +- google/cloud/webrisk/v1beta1/BUILD.bazel | 2 +- .../cloud/websecurityscanner/v1/BUILD.bazel | 2 +- .../websecurityscanner/v1alpha/BUILD.bazel | 2 +- .../websecurityscanner/v1beta/BUILD.bazel | 2 +- google/container/v1/BUILD.bazel | 2 +- google/container/v1/cluster_service.proto | 4 +- google/container/v1beta1/BUILD.bazel | 2 +- .../container/v1beta1/cluster_service.proto | 4 +- google/datastore/admin/v1/BUILD.bazel | 3 +- .../datastore/admin/v1/datastore_admin.proto | 1 + google/datastore/admin/v1/index.proto | 1 + .../admin/v1beta1/datastore_admin.proto | 1 + google/datastore/v1/BUILD.bazel | 2 +- google/datastore/v1/datastore.proto | 1 + google/datastore/v1/entity.proto | 1 + google/datastore/v1/query.proto | 1 + google/datastore/v1beta3/datastore.proto | 1 + google/datastore/v1beta3/entity.proto | 1 + google/datastore/v1beta3/query.proto | 1 + google/devtools/build/v1/BUILD.bazel | 2 +- google/devtools/cloudbuild/v1/BUILD.bazel | 3 +- google/devtools/clouddebugger/v2/BUILD.bazel | 2 +- .../clouddebugger/v2/controller.proto | 1 + google/devtools/clouddebugger/v2/data.proto | 1 + .../devtools/clouddebugger/v2/debugger.proto | 1 + .../clouderrorreporting/v1beta1/BUILD.bazel | 2 +- .../clouderrorreporting/v1beta1/common.proto | 3 +- .../v1beta1/error_group_service.proto | 13 +- .../v1beta1/error_stats_service.proto | 1 + .../v1beta1/report_errors_service.proto | 1 + google/devtools/cloudtrace/v1/BUILD.bazel | 2 +- google/devtools/cloudtrace/v1/trace.proto | 1 + google/devtools/cloudtrace/v2/BUILD.bazel | 2 +- google/devtools/cloudtrace/v2/trace.proto | 1 + google/devtools/cloudtrace/v2/tracing.proto | 1 + .../devtools/containeranalysis/v1/BUILD.bazel | 2 +- .../remoteworkers/v1test2/BUILD.bazel | 4 +- .../remoteworkers/v1test2/remote_workers.yaml | 1 - .../remoteworkers/v1test2/remoteworkers.yaml | 1 - .../v1test2/remoteworkers_gapic.legacy.yaml | 134 ---- .../v1test2/remoteworkers_gapic.yaml | 2 - .../remoteworkers_grpc_service_config.json | 31 - .../remoteworkers/v1test2/tasks.proto | 192 ------ google/example/library/v1/BUILD.bazel | 2 +- google/firestore/admin/v1/BUILD.bazel | 3 +- google/firestore/admin/v1/field.proto | 1 + .../firestore/admin/v1/firestore_admin.proto | 1 + google/firestore/admin/v1/index.proto | 1 + google/firestore/admin/v1/location.proto | 1 + google/firestore/admin/v1/operation.proto | 1 + google/firestore/v1/BUILD.bazel | 2 +- google/firestore/v1/common.proto | 1 + google/firestore/v1/document.proto | 1 + google/firestore/v1/firestore.proto | 146 ++++- .../v1/firestore_grpc_service_config.json | 11 +- google/firestore/v1/query.proto | 79 ++- google/firestore/v1/write.proto | 1 + google/firestore/v1beta1/BUILD.bazel | 2 +- google/firestore/v1beta1/common.proto | 1 + google/firestore/v1beta1/document.proto | 1 + google/firestore/v1beta1/firestore.proto | 1 + google/firestore/v1beta1/query.proto | 1 + google/firestore/v1beta1/write.proto | 1 + google/home/graph/v1/BUILD.bazel | 2 +- google/iam/admin/v1/BUILD.bazel | 2 +- google/iam/credentials/v1/BUILD.bazel | 2 +- google/logging/type/http_request.proto | 1 + google/logging/type/log_severity.proto | 1 + google/logging/v2/BUILD.bazel | 2 +- google/logging/v2/log_entry.proto | 1 + google/logging/v2/logging.proto | 1 + google/logging/v2/logging_config.proto | 1 + google/logging/v2/logging_metrics.proto | 1 + google/maps/playablelocations/v3/BUILD.bazel | 312 +++++++++ .../v3/playablelocations_gapic.yaml | 16 + .../playablelocations/v3/sample/BUILD.bazel | 134 ++++ .../v3/sample/resources.proto | 26 +- google/maps/roads/v1op/BUILD.bazel | 2 +- google/maps/unity/BUILD.bazel | 129 ++++ google/monitoring/dashboard/v1/BUILD.bazel | 12 +- google/monitoring/dashboard/v1/common.proto | 481 ++++++++------ .../monitoring/dashboard/v1/dashboard.proto | 20 +- .../v1/dashboards_grpc_service_config.json | 21 + .../dashboard/v1/dashboards_service.proto | 56 +- .../monitoring/dashboard/v1/drilldowns.proto | 7 +- google/monitoring/dashboard/v1/layouts.proto | 5 +- google/monitoring/dashboard/v1/metrics.proto | 30 +- .../monitoring/dashboard/v1/monitoring.yaml | 9 +- .../monitoring/dashboard/v1/scorecard.proto | 14 +- google/monitoring/dashboard/v1/service.proto | 5 +- google/monitoring/dashboard/v1/text.proto | 5 +- google/monitoring/dashboard/v1/widget.proto | 5 +- google/monitoring/dashboard/v1/xychart.proto | 15 +- google/monitoring/v3/BUILD.bazel | 2 +- google/monitoring/v3/common.proto | 6 +- google/privacy/dlp/v2/BUILD.bazel | 2 +- google/privacy/dlp/v2/dlp.proto | 12 +- google/privacy/dlp/v2/storage.proto | 2 +- google/pubsub/v1/BUILD.bazel | 2 +- google/pubsub/v1/pubsub.proto | 53 +- .../pubsub/v1/pubsub_grpc_service_config.json | 4 + google/spanner/admin/database/v1/BUILD.bazel | 3 +- google/spanner/admin/database/v1/backup.proto | 1 + google/spanner/admin/database/v1/common.proto | 1 + .../spanner_admin_database_gapic.legacy.yaml | 16 +- .../v1/spanner_admin_database_gapic.yaml | 18 +- ...er_admin_database_grpc_service_config.json | 51 +- .../database/v1/spanner_database_admin.proto | 1 + google/spanner/admin/instance/v1/BUILD.bazel | 3 +- .../spanner_admin_instance_gapic.legacy.yaml | 14 +- .../v1/spanner_admin_instance_gapic.yaml | 14 +- ...er_admin_instance_grpc_service_config.json | 27 +- .../instance/v1/spanner_instance_admin.proto | 1 + google/spanner/v1/BUILD.bazel | 2 +- google/spanner/v1/keys.proto | 1 + google/spanner/v1/mutation.proto | 1 + google/spanner/v1/query_plan.proto | 1 + google/spanner/v1/result_set.proto | 1 + google/spanner/v1/spanner.proto | 1 + .../v1/spanner_grpc_service_config.json | 27 +- google/spanner/v1/transaction.proto | 1 + google/spanner/v1/type.proto | 1 + google/storage/v1/BUILD.bazel | 2 +- google/streetview/publish/v1/BUILD.bazel | 56 +- .../publish/v1/streetview_publish.proto | 4 + grafeas/v1/BUILD.bazel | 2 +- repository_rules.bzl | 6 +- 399 files changed, 7610 insertions(+), 2903 deletions(-) create mode 100644 google/analytics/data/v1alpha/BUILD.bazel create mode 100644 google/analytics/data/v1alpha/analytics_data_api.proto create mode 100644 google/analytics/data/v1alpha/analytics_data_grpc_service_config.json create mode 100644 google/analytics/data/v1alpha/analyticsdata_gapic.yaml create mode 100644 google/analytics/data/v1alpha/analyticsdata_v1alpha.yaml create mode 100644 google/analytics/data/v1alpha/data.proto create mode 100644 google/cloud/asset/v1p5beta1/BUILD.bazel create mode 100644 google/cloud/asset/v1p5beta1/asset_service.proto create mode 100644 google/cloud/asset/v1p5beta1/assets.proto create mode 100644 google/cloud/asset/v1p5beta1/cloudasset_gapic.yaml create mode 100644 google/cloud/asset/v1p5beta1/cloudasset_grpc_service_config.json create mode 100644 google/cloud/asset/v1p5beta1/cloudasset_v1p5beta1.yaml create mode 100644 google/cloud/bigquery/connection/v1/connection_gapic.yaml delete mode 100644 google/cloud/documentai/artman_documentai_v1beta1.yaml create mode 100644 google/cloud/oslogin/v1beta/oslogin_gapic.legacy.yaml create mode 100644 google/cloud/pubsublite/v1/BUILD.bazel create mode 100644 google/cloud/pubsublite/v1/admin.proto create mode 100644 google/cloud/pubsublite/v1/common.proto create mode 100644 google/cloud/pubsublite/v1/cursor.proto create mode 100644 google/cloud/pubsublite/v1/publisher.proto create mode 100644 google/cloud/pubsublite/v1/pubsublite_v1.yaml create mode 100644 google/cloud/pubsublite/v1/subscriber.proto create mode 100644 google/cloud/securitycenter/v1/resource.proto create mode 100644 google/cloud/securitycenter/v1p1beta1/resource.proto delete mode 100644 google/devtools/remoteworkers/v1test2/tasks.proto create mode 100644 google/maps/playablelocations/v3/BUILD.bazel create mode 100644 google/maps/playablelocations/v3/playablelocations_gapic.yaml create mode 100644 google/maps/playablelocations/v3/sample/BUILD.bazel create mode 100644 google/maps/unity/BUILD.bazel create mode 100644 google/monitoring/dashboard/v1/dashboards_grpc_service_config.json diff --git a/.bazelrc b/.bazelrc index db6c4f65e..5c973ac50 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,5 +1,6 @@ # To make proto_library rules to include source info in the descriptor build --protocopt=--include_source_info +build --protocopt=--experimental_allow_proto3_optional # This is to avoid JVM SIGBUS crashes on highly parallel builds, # see https://github.com/bazelbuild/bazel/issues/3236 for more details diff --git a/WORKSPACE b/WORKSPACE index a5387b785..d456b1718 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,4 +1,10 @@ -workspace(name = "com_google_googleapis") +workspace( + name = "com_google_googleapis", + # This tells Bazel that the node_modules directory is special and + # is managed by the package manager. + # https://bazelbuild.github.io/rules_nodejs/install.html + managed_directories = {"@npm": ["@gapic_generator_typescript//:node_modules"]} +) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") @@ -41,8 +47,8 @@ http_archive( http_archive( name = "com_google_protobuf", - strip_prefix = "protobuf-fe1790ca0df67173702f70d5646b82f48f412b99", # this is 3.11.2 - urls = ["https://github.com/protocolbuffers/protobuf/archive/fe1790ca0df67173702f70d5646b82f48f412b99.zip"], + strip_prefix = "protobuf-a37cc13b2f6d11303811011b0bfbc867e7c0bf2b", # this is 3.12.1 + urls = ["https://github.com/protocolbuffers/protobuf/archive/a37cc13b2f6d11303811011b0bfbc867e7c0bf2b.zip"], ) load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") @@ -69,8 +75,8 @@ rules_proto_toolchains() # section http_archive( name = "com_google_api_codegen", - strip_prefix = "gapic-generator-acd31461ee04391df79ae8a33f793569791aa1a0", - urls = ["https://github.com/googleapis/gapic-generator/archive/acd31461ee04391df79ae8a33f793569791aa1a0.zip"], + strip_prefix = "gapic-generator-2.2.0", + urls = ["https://github.com/googleapis/gapic-generator/archive/v2.2.0.zip"], ) # rules_go (support Golang under bazel) @@ -78,8 +84,11 @@ http_archive( # TODO(ndietz): move this back to the Go section if gRPC is updated per https://github.com/grpc/grpc/issues/22172 http_archive( name = "io_bazel_rules_go", - sha256 = "e6a6c016b0663e06fa5fccf1cd8152eab8aa8180c583ec20c872f4f9953a7ac5", - url = "https://github.com/bazelbuild/rules_go/releases/download/v0.22.1/rules_go-v0.22.1.tar.gz", + urls = [ + "https://github.com/bazelbuild/rules_go/archive/v0.23.0.zip", + ], + strip_prefix = "rules_go-0.23.0", + sha256 = "4707e6ba7c01fcfc4f0d340d123bc16e43c2b8ea3f307663d95712b36d2a0e88", ) load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") @@ -186,8 +195,8 @@ py_gapic_repositories() http_archive( name = "protoc_docs_plugin", - strip_prefix = "protoc-docs-plugin-b2502d56b5ec2d47e063976da773206af295362d", - urls = ["https://github.com/googleapis/protoc-docs-plugin/archive/b2502d56b5ec2d47e063976da773206af295362d.zip"], + strip_prefix = "protoc-docs-plugin-2bdf14e394bbaa44b81286b1a19c5f229b51c667", + urls = ["https://github.com/googleapis/protoc-docs-plugin/archive/2bdf14e394bbaa44b81286b1a19c5f229b51c667.zip"], ) load( @@ -233,7 +242,11 @@ pip_install() # bazel-gazelle (support Golang under bazel) http_archive( name = "bazel_gazelle", - urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.20.0/bazel-gazelle-v0.20.0.tar.gz"], + urls = [ + "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/bazel-gazelle/releases/download/v0.21.0/bazel-gazelle-v0.21.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.21.0/bazel-gazelle-v0.21.0.tar.gz", + ], + sha256 = "bfd86b3cbe855d6c16c6fce60d76bd51f5c8dbc9cfcaef7a2bb5c1aafd0710e8", ) load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") @@ -242,8 +255,8 @@ gazelle_dependencies() http_archive( name = "com_googleapis_gapic_generator_go", - strip_prefix = "gapic-generator-go-0.13.3", - urls = ["https://github.com/googleapis/gapic-generator-go/archive/v0.13.3.tar.gz"], + strip_prefix = "gapic-generator-go-0.14.3", + urls = ["https://github.com/googleapis/gapic-generator-go/archive/v0.14.3.tar.gz"], ) load("@com_googleapis_gapic_generator_go//:repositories.bzl", "com_googleapis_gapic_generator_go_repositories") @@ -254,6 +267,44 @@ load("@com_googleapis_gapic_generator_go//rules_go_gapic:go_gapic_repositories.b go_gapic_repositories() +############################################################################## +# TypeScript +############################################################################## + +### TypeScript generator +http_archive( + name = "gapic_generator_typescript", + urls = ["https://github.com/googleapis/gapic-generator-typescript/archive/v1.0.0.tar.gz"], + strip_prefix = "gapic-generator-typescript-1.0.0", +) + +load("@gapic_generator_typescript//:repositories.bzl", "gapic_generator_typescript_repositories") +gapic_generator_typescript_repositories() + +load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install") +node_repositories( + package_json = ["@gapic_generator_typescript//:package.json"] +) +yarn_install( + name = "npm", + package_json = "@gapic_generator_typescript//:package.json", + yarn_lock = "@gapic_generator_typescript//:yarn.lock", +) +load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies") +install_bazel_dependencies() + +load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") +ts_setup_workspace() + +# Note: TypeScript libraries use third-party protobuf dependency, +# protobuf.js, and official Bazel rules have a special rule to +# install this dependency and its transitive dependencies. +yarn_install( + name = "build_bazel_rules_typescript_protobufs_compiletime_deps", + package_json = "@npm_bazel_labs//protobufjs:package.json", + yarn_lock = "@npm_bazel_labs//protobufjs:yarn.lock", +) + ############################################################################## # PHP ############################################################################## diff --git a/google/ads/admob/v1/BUILD.bazel b/google/ads/admob/v1/BUILD.bazel index 00b36f06f..60cab02af 100644 --- a/google/ads/admob/v1/BUILD.bazel +++ b/google/ads/admob/v1/BUILD.bazel @@ -18,6 +18,7 @@ proto_library( deps = [ "//google/api:annotations_proto", "//google/api:client_proto", + "//google/api:field_behavior_proto", "//google/type:date_proto", ], ) @@ -26,7 +27,6 @@ proto_library_with_info( name = "admob_proto_with_info", deps = [ ":admob_proto", - "//google/cloud:common_resources_proto", ], ) @@ -70,14 +70,14 @@ java_gapic_library( java_gapic_test( name = "admob_java_gapic_test_suite", test_classes = [ - "com.google.cloud.ads.admob.v1.AdMobApiClientTest", + "com.google.ads.admob.v1.AdMobApiClientTest", ], runtime_deps = [":admob_java_gapic_test"], ) # Open Source Packages java_gapic_assembly_gradle_pkg( - name = "google-cloud-ads-admob-v1-java", + name = "google-ads-admob-v1-java", deps = [ ":admob_java_gapic", ":admob_java_grpc", @@ -112,7 +112,7 @@ go_gapic_library( name = "admob_go_gapic", srcs = [":admob_proto_with_info"], grpc_service_config = "", - importpath = "cloud.google.com/go/ads/admob/apiv1;admob", + importpath = "google.golang.org/api/admob/v1;admob", service_yaml = "//google/ads/admob:admob_v1.yaml", deps = [ ":admob_go_proto", @@ -123,12 +123,12 @@ go_test( name = "admob_go_gapic_test", srcs = [":admob_go_gapic_srcjar_test"], embed = [":admob_go_gapic"], - importpath = "cloud.google.com/go/ads/admob/apiv1", + importpath = "google.golang.org/api/admob/v1", ) # Open Source Packages go_gapic_assembly_pkg( - name = "gapi-cloud-ads-admob-v1-go", + name = "gapi-ads-admob-v1-go", deps = [ ":admob_go_gapic", ":admob_go_gapic_srcjar-test.srcjar", @@ -154,6 +154,7 @@ moved_proto_library( deps = [ "//google/api:annotations_proto", "//google/api:client_proto", + "//google/api:field_behavior_proto", "//google/type:date_proto", ], ) @@ -228,7 +229,7 @@ php_gapic_library( # Open Source Packages php_gapic_assembly_pkg( - name = "google-cloud-ads-admob-v1-php", + name = "google-ads-admob-v1-php", deps = [ ":admob_php_gapic", ":admob_php_grpc", @@ -248,7 +249,7 @@ load( nodejs_gapic_library( name = "admob_nodejs_gapic", src = ":admob_proto_with_info", - gapic_yaml = "admob_gapic.yaml", + grpc_service_config = None, package = "google.ads.admob.v1", service_yaml = "//google/ads/admob:admob_v1.yaml", deps = [], @@ -298,7 +299,7 @@ ruby_gapic_library( # Open Source Packages ruby_gapic_assembly_pkg( - name = "google-cloud-ads-admob-v1-ruby", + name = "google-ads-admob-v1-ruby", deps = [ ":admob_ruby_gapic", ":admob_ruby_grpc", @@ -342,7 +343,7 @@ csharp_gapic_library( # Open Source Packages csharp_gapic_assembly_pkg( - name = "google-cloud-ads-admob-v1-csharp", + name = "google-ads-admob-v1-csharp", deps = [ ":admob_csharp_gapic", ":admob_csharp_grpc", diff --git a/google/ads/admob/v1/admob_api.proto b/google/ads/admob/v1/admob_api.proto index 12486651a..c26c845ed 100644 --- a/google/ads/admob/v1/admob_api.proto +++ b/google/ads/admob/v1/admob_api.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; @@ -20,6 +19,7 @@ package google.ads.admob.v1; import "google/ads/admob/v1/admob_resources.proto"; import "google/api/annotations.proto"; import "google/api/client.proto"; +import "google/api/field_behavior.proto"; option go_package = "google.golang.org/genproto/googleapis/ads/admob/v1;admob"; option java_outer_classname = "AdMobApiProto"; @@ -117,8 +117,8 @@ message GenerateMediationReportRequest { // "header": { // "date_range": { // "start_date": {"year": 2018, "month": 9, "day": 1}, -// "end_date": {"year": 2018, "month": 9, "day": 30} -// } +// "end_date": {"year": 2018, "month": 9, "day": 1} +// }, // "localization_settings": { // "currency_code": "USD", // "language_code": "en-US" @@ -178,8 +178,8 @@ message GenerateNetworkReportRequest { // "header": { // "dateRange": { // "startDate": {"year": 2018, "month": 9, "day": 1}, -// "endDate": {"year": 2018, "month": 9, "day": 30} -// } +// "endDate": {"year": 2018, "month": 9, "day": 1} +// }, // "localizationSettings": { // "currencyCode": "USD", // "languageCode": "en-US" @@ -200,9 +200,8 @@ message GenerateNetworkReportRequest { // } // } // }, -// ... // { -// "footer": {"matchingRowCount": 5} +// "footer": {"matchingRowCount": 1} // }] message GenerateNetworkReportResponse { // Each stream response message contains one type of payload. diff --git a/google/ads/admob/v1/admob_gapic.yaml b/google/ads/admob/v1/admob_gapic.yaml index 042e2f728..727dc5907 100644 --- a/google/ads/admob/v1/admob_gapic.yaml +++ b/google/ads/admob/v1/admob_gapic.yaml @@ -3,17 +3,17 @@ config_schema_version: 1.0.0 # The settings of generated code in a specific language. language_settings: java: - package_name: com.google.cloud.ads.admob.v1 + package_name: com.google.ads.admob.v1 python: - package_name: google.cloud.ads.admob_v1.gapic + package_name: google.ads.admob_v1.gapic go: - package_name: cloud.google.com/go/ads/admob/apiv1 + package_name: google.golang.org/api/admob/v1 csharp: package_name: Google.Ads.Admob.V1 ruby: - package_name: Google::Cloud::Ads::Admob::V1 + package_name: Google::Ads::Admob::V1 php: - package_name: Google\Cloud\Ads\Admob\V1 + package_name: Google\Ads\Admob\V1 nodejs: package_name: admob.v1 # A list of API interface configurations. diff --git a/google/ads/admob/v1/admob_resources.proto b/google/ads/admob/v1/admob_resources.proto index 200bb3208..bcdc957b2 100644 --- a/google/ads/admob/v1/admob_resources.proto +++ b/google/ads/admob/v1/admob_resources.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; @@ -138,6 +137,15 @@ message NetworkReportSpec { // "ca-app-pub-1234~1234"). APP = 5; + // Type of the ad (for example, "text" or "image"), an ad delivery + // dimension. + // + // **Warning:** The dimension is incompatible with + // [AD_REQUESTS](#Metric.ENUM_VALUES.AD_REQUESTS), + // [MATCH_RATE](#Metric.ENUM_VALUES.MATCH_RATE) and + // [IMPRESSION_RPM](#Metric.ENUM_VALUES.IMPRESSION_RPM) metrics. + AD_TYPE = 6; + // CLDR country code of the place where the ad views/clicks occur (for // example, "US" or "FR"). This is a geography dimension. COUNTRY = 7; @@ -159,6 +167,9 @@ message NetworkReportSpec { METRIC_UNSPECIFIED = 0; // The number of ad requests. The value is an integer. + // + // **Warning:** The metric is incompatible with + // [AD_TYPE](#Dimension.ENUM_VALUES.AD_TYPE) dimension. AD_REQUESTS = 1; // The number of times a user clicks an ad. The value is an integer. @@ -179,6 +190,9 @@ message NetworkReportSpec { // The estimated earnings per thousand ad impressions. The value is in // micros. For example, $1.03 would be represented as 1030000. + // + // **Warning:** The metric is incompatible with + // [AD_TYPE](#Dimension.ENUM_VALUES.AD_TYPE) dimension. IMPRESSION_RPM = 6; // The number of times ads are returned in response to a request. The value @@ -187,6 +201,9 @@ message NetworkReportSpec { // The ratio of matched ad requests over the total ad requests. The value is // a double precision (approximate) decimal value. + // + // **Warning:** The metric is incompatible with + // [AD_TYPE](#Dimension.ENUM_VALUES.AD_TYPE) dimension. MATCH_RATE = 8; // The ratio of ads that are displayed over ads that are returned, defined @@ -222,6 +239,14 @@ message NetworkReportSpec { // API returns as many rows as possible, up to 100000. Acceptable values are // 1-100000, inclusive. Any other values are treated as 100000. int32 max_report_rows = 7; + + // A report time zone. Accepts an IANA TZ name values, such as + // "America/Los_Angeles." If no time zone is defined, the account default + // takes effect. Check default value by the get account action. + // + // **Warning:** The "America/Los_Angeles" is the only supported value at + // the moment. + string time_zone = 8; } // The specification for generating an AdMob Mediation report. @@ -314,8 +339,10 @@ message MediationReportSpec { // The unique ID of the ad source instance (for example, // "ca-app-pub-1234#5678" and "AdMob (default)" as label value). - // Warning: The dimension is incompatible with ESTIMATED_EARNINGS and - // OBSERVED_ECPM metrics. + // + // **Warning:** The dimension is incompatible with + // [ESTIMATED_EARNINGS](#Metric.ENUM_VALUES.ESTIMATED_EARNINGS) and + // [OBSERVED_ECPM](#Metric.ENUM_VALUES.OBSERVED_ECPM) metrics. AD_SOURCE_INSTANCE = 5; // The unique ID of the ad unit (for example, "ca-app-pub-1234/8790"). @@ -328,8 +355,10 @@ message MediationReportSpec { // The unique ID of the mediation group (for example, // "ca-app-pub-1234:mg:1234" and "AdMob (default)" as label value). - // Warning: The dimension is incompatible with ESTIMATED_EARNINGS and - // OBSERVED_ECPM metrics. + // + // **Warning:** The dimension is incompatible with + // [ESTIMATED_EARNINGS](#Metric.ENUM_VALUES.ESTIMATED_EARNINGS) and + // [OBSERVED_ECPM](#Metric.ENUM_VALUES.OBSERVED_ECPM) metrics. MEDIATION_GROUP = 11; // CLDR country code of the place where the ad views/clicks occur (for @@ -362,8 +391,10 @@ message MediationReportSpec { // EUR, or other) of the earning metrics are determined by the localization // setting for currency. The amount is in micros. For example, $6.50 would // be represented as 6500000. - // Warning: The metric is incompatible with AD_SOURCE_INSTANCE and - // MEDIATION_GROUP dimensions. + // + // **Warning:** The metric is incompatible with + // [AD_SOURCE_INSTANCE](#Dimension.ENUM_VALUES.AD_SOURCE_INSTANCE) and + // [MEDIATION_GROUP](#Dimension.ENUM_VALUES.MEDIATION_GROUP) dimensions. ESTIMATED_EARNINGS = 3; // The total number of ads shown to users. The value is an integer. @@ -385,8 +416,10 @@ message MediationReportSpec { // (USD, EUR, or other) of the earning metrics are determined by the // localization setting for currency. The amount is in micros. For example, // $2.30 would be represented as 2300000. - // Warning: The metric is incompatible with AD_SOURCE_INSTANCE and - // MEDIATION_GROUP dimensions. + // + // **Warning:** The metric is incompatible with + // [AD_SOURCE_INSTANCE](#Dimension.ENUM_VALUES.AD_SOURCE_INSTANCE) and + // [MEDIATION_GROUP](#Dimension.ENUM_VALUES.MEDIATION_GROUP) dimensions. OBSERVED_ECPM = 8; } @@ -417,6 +450,14 @@ message MediationReportSpec { // API returns as many rows as possible, up to 100000. Acceptable values are // 1-100000, inclusive. Any other values are treated as 100000. int32 max_report_rows = 7; + + // A report time zone. Accepts an IANA TZ name values, such as + // "America/Los_Angeles." If no time zone is defined, the account default + // takes effect. Check default value by the get account action. + // + // **Warning:** The "America/Los_Angeles" is the only supported value at + // the moment. + string time_zone = 8; } // A row of the returning report. diff --git a/google/ads/googleads/v1/common/bidding.proto b/google/ads/googleads/v1/common/bidding.proto index 3d00cbacf..656ef5d3f 100644 --- a/google/ads/googleads/v1/common/bidding.proto +++ b/google/ads/googleads/v1/common/bidding.proto @@ -140,7 +140,7 @@ message TargetCpm { // An automated bidding strategy that sets bids so that a certain percentage of // search ads are shown at the top of the first page (or other targeted // location). -// Next Id = 4 +// next tag = 4 message TargetImpressionShare { // The targeted location on the search results page. google.ads.googleads.v1.enums.TargetImpressionShareLocationEnum.TargetImpressionShareLocation location = 1; diff --git a/google/ads/googleads/v1/common/keyword_plan_common.proto b/google/ads/googleads/v1/common/keyword_plan_common.proto index 5afc324cf..ffb1769ee 100644 --- a/google/ads/googleads/v1/common/keyword_plan_common.proto +++ b/google/ads/googleads/v1/common/keyword_plan_common.proto @@ -31,9 +31,13 @@ option ruby_package = "Google::Ads::GoogleAds::V1::Common"; // Proto file describing Keyword Planner messages. -// Historical metrics. +// Historical metrics specific to the targeting options selected. +// Targeting options include geographies, network, etc. +// Refer to https://support.google.com/google-ads/answer/3022575 for more +// details. message KeywordPlanHistoricalMetrics { - // Average monthly searches for the past 12 months. + // Approximate number of monthly searches on this query averaged + // for the past 12 months. google.protobuf.Int64Value avg_monthly_searches = 1; // The competition level for the query. diff --git a/google/ads/googleads/v1/common/metrics.proto b/google/ads/googleads/v1/common/metrics.proto index 9cb045165..f891a9647 100644 --- a/google/ads/googleads/v1/common/metrics.proto +++ b/google/ads/googleads/v1/common/metrics.proto @@ -297,7 +297,7 @@ message Metrics { // future, other ad types may support engagement metrics. google.protobuf.Int64Value engagements = 32; - // Average lead value of hotel. + // Average lead value based on clicks. google.protobuf.DoubleValue hotel_average_lead_value_micros = 75; // The creative historical quality score. diff --git a/google/ads/googleads/v1/enums/keyword_plan_competition_level.proto b/google/ads/googleads/v1/enums/keyword_plan_competition_level.proto index ff157550b..242c3f548 100644 --- a/google/ads/googleads/v1/enums/keyword_plan_competition_level.proto +++ b/google/ads/googleads/v1/enums/keyword_plan_competition_level.proto @@ -43,13 +43,13 @@ message KeywordPlanCompetitionLevelEnum { // The value is unknown in this version. UNKNOWN = 1; - // Low competition. + // Low competition. The Competition Index range for this is [0, 33]. LOW = 2; - // Medium competition. + // Medium competition. The Competition Index range for this is [34, 66]. MEDIUM = 3; - // High competition. + // High competition. The Competition Index range for this is [67, 100]. HIGH = 4; } diff --git a/google/ads/googleads/v1/errors/customer_error.proto b/google/ads/googleads/v1/errors/customer_error.proto index 2069e71a6..496780c5b 100644 --- a/google/ads/googleads/v1/errors/customer_error.proto +++ b/google/ads/googleads/v1/errors/customer_error.proto @@ -30,7 +30,6 @@ option ruby_package = "Google::Ads::GoogleAds::V1::Errors"; // Container for enum describing possible customer errors. message CustomerErrorEnum { // Set of errors that are related to requests dealing with Customer. - // Next id: 26 enum CustomerError { // Enum unspecified. UNSPECIFIED = 0; diff --git a/google/ads/googleads/v1/resources/ad.proto b/google/ads/googleads/v1/resources/ad.proto index 8a54706d7..d1934414c 100644 --- a/google/ads/googleads/v1/resources/ad.proto +++ b/google/ads/googleads/v1/resources/ad.proto @@ -60,6 +60,7 @@ message Ad { // The list of mappings that can be used to substitute custom parameter tags // in a `tracking_url_template`, `final_urls`, or `mobile_final_urls`. + // For mutates, please use url custom parameter operations. repeated google.ads.googleads.v1.common.CustomParameter url_custom_parameters = 10; // The URL that appears in the ad description for some ad formats. diff --git a/google/ads/googleads/v1/resources/campaign.proto b/google/ads/googleads/v1/resources/campaign.proto index 0f3ba2ada..8ceafcdc5 100644 --- a/google/ads/googleads/v1/resources/campaign.proto +++ b/google/ads/googleads/v1/resources/campaign.proto @@ -83,19 +83,6 @@ message Campaign { google.protobuf.Int64Value hotel_center_id = 1 [(google.api.field_behavior) = IMMUTABLE]; } - // Campaign-level settings for App Campaigns. - message AppCampaignSetting { - // Represents the goal which the bidding strategy of this app campaign - // should optimize towards. - google.ads.googleads.v1.enums.AppCampaignBiddingStrategyGoalTypeEnum.AppCampaignBiddingStrategyGoalType bidding_strategy_goal_type = 1; - - // Immutable. A string that uniquely identifies a mobile application. - google.protobuf.StringValue app_id = 2 [(google.api.field_behavior) = IMMUTABLE]; - - // Immutable. The application store that distributes this specific app. - google.ads.googleads.v1.enums.AppCampaignAppStoreEnum.AppCampaignAppStore app_store = 3 [(google.api.field_behavior) = IMMUTABLE]; - } - // The setting for controlling Dynamic Search Ads (DSA). message DynamicSearchAdsSetting { // The Internet domain name that this setting represents, e.g., "google.com" @@ -117,16 +104,6 @@ message Campaign { ]; } - // Describes how unbranded pharma ads will be displayed. - message VanityPharma { - // The display mode for vanity pharma URLs. - google.ads.googleads.v1.enums.VanityPharmaDisplayUrlModeEnum.VanityPharmaDisplayUrlMode vanity_pharma_display_url_mode = 1; - - // The text that will be displayed in display URL of the text ad when - // website description is the selected display mode for vanity pharma URLs. - google.ads.googleads.v1.enums.VanityPharmaTextEnum.VanityPharmaText vanity_pharma_text = 2; - } - // The setting for Shopping campaigns. Defines the universe of products that // can be advertised by the campaign, and how this campaign interacts with // other Shopping campaigns. @@ -160,6 +137,15 @@ message Campaign { google.protobuf.StringValue tracking_url = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } + // Selective optimization setting for this campaign, which includes a set of + // conversion actions to optimize this campaign towards. + message SelectiveOptimization { + // The selected set of conversion actions for optimizing this campaign. + repeated google.protobuf.StringValue conversion_actions = 1 [(google.api.resource_reference) = { + type: "googleads.googleapis.com/ConversionAction" + }]; + } + // Represents a collection of settings related to ads geotargeting. message GeoTargetTypeSetting { // The setting used for positive geotargeting in this particular campaign. @@ -169,13 +155,27 @@ message Campaign { google.ads.googleads.v1.enums.NegativeGeoTargetTypeEnum.NegativeGeoTargetType negative_geo_target_type = 2; } - // Selective optimization setting for this campaign, which includes a set of - // conversion actions to optimize this campaign towards. - message SelectiveOptimization { - // The selected set of conversion actions for optimizing this campaign. - repeated google.protobuf.StringValue conversion_actions = 1 [(google.api.resource_reference) = { - type: "googleads.googleapis.com/ConversionAction" - }]; + // Campaign-level settings for App Campaigns. + message AppCampaignSetting { + // Represents the goal which the bidding strategy of this app campaign + // should optimize towards. + google.ads.googleads.v1.enums.AppCampaignBiddingStrategyGoalTypeEnum.AppCampaignBiddingStrategyGoalType bidding_strategy_goal_type = 1; + + // Immutable. A string that uniquely identifies a mobile application. + google.protobuf.StringValue app_id = 2 [(google.api.field_behavior) = IMMUTABLE]; + + // Immutable. The application store that distributes this specific app. + google.ads.googleads.v1.enums.AppCampaignAppStoreEnum.AppCampaignAppStore app_store = 3 [(google.api.field_behavior) = IMMUTABLE]; + } + + // Describes how unbranded pharma ads will be displayed. + message VanityPharma { + // The display mode for vanity pharma URLs. + google.ads.googleads.v1.enums.VanityPharmaDisplayUrlModeEnum.VanityPharmaDisplayUrlMode vanity_pharma_display_url_mode = 1; + + // The text that will be displayed in display URL of the text ad when + // website description is the selected display mode for vanity pharma URLs. + google.ads.googleads.v1.enums.VanityPharmaTextEnum.VanityPharmaText vanity_pharma_text = 2; } // Immutable. The resource name of the campaign. @@ -298,12 +298,10 @@ message Campaign { google.ads.googleads.v1.enums.BiddingStrategyTypeEnum.BiddingStrategyType bidding_strategy_type = 22 [(google.api.field_behavior) = OUTPUT_ONLY]; // The date when campaign started. - // // This field must not be used in WHERE clauses. google.protobuf.StringValue start_date = 19; // The date when campaign ended. - // // This field must not be used in WHERE clauses. google.protobuf.StringValue end_date = 20; diff --git a/google/ads/googleads/v1/resources/keyword_plan_campaign.proto b/google/ads/googleads/v1/resources/keyword_plan_campaign.proto index 2f6bb8a5f..ac614467b 100644 --- a/google/ads/googleads/v1/resources/keyword_plan_campaign.proto +++ b/google/ads/googleads/v1/resources/keyword_plan_campaign.proto @@ -91,7 +91,6 @@ message KeywordPlanCampaign { } // A geo target. -// Next ID: 3 message KeywordPlanGeoTarget { // Required. The resource name of the geo target. google.protobuf.StringValue geo_target_constant = 1 [(google.api.resource_reference) = { diff --git a/google/ads/googleads/v1/resources/recommendation.proto b/google/ads/googleads/v1/resources/recommendation.proto index ce7a08c7a..f0e2f6611 100644 --- a/google/ads/googleads/v1/resources/recommendation.proto +++ b/google/ads/googleads/v1/resources/recommendation.proto @@ -106,10 +106,15 @@ message Recommendation { google.protobuf.Int64Value recommended_cpc_bid_micros = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } - // The Call extension recommendation. - message CallExtensionRecommendation { - // Output only. Call extensions recommended to be added. - repeated google.ads.googleads.v1.common.CallFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // The Optimize Ad Rotation recommendation. + message OptimizeAdRotationRecommendation { + + } + + // The Callout extension recommendation. + message CalloutExtensionRecommendation { + // Output only. Callout extensions recommended to be added. + repeated google.ads.googleads.v1.common.CalloutFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } // The text ad recommendation. @@ -155,17 +160,10 @@ message Recommendation { google.protobuf.Int64Value recommended_target_cpa_micros = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } - // The Maximize Clicks opt-in recommendation. - message MaximizeClicksOptInRecommendation { - // Output only. The recommended new budget amount. - // Only set if the current budget is too high. - google.protobuf.Int64Value recommended_budget_amount_micros = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; - } - - // The Maximize Conversions Opt-In recommendation. - message MaximizeConversionsOptInRecommendation { - // Output only. The recommended new budget amount. - google.protobuf.Int64Value recommended_budget_amount_micros = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // The Sitelink extension recommendation. + message SitelinkExtensionRecommendation { + // Output only. Sitelink extensions recommended to be added. + repeated google.ads.googleads.v1.common.SitelinkFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } // The move unused budget recommendation. @@ -177,25 +175,15 @@ message Recommendation { CampaignBudgetRecommendation budget_recommendation = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } - // The Enhanced Cost-Per-Click Opt-In recommendation. - message EnhancedCpcOptInRecommendation { - - } - // The Search Partners Opt-In recommendation. message SearchPartnersOptInRecommendation { } - // The Optimize Ad Rotation recommendation. - message OptimizeAdRotationRecommendation { - - } - - // The Callout extension recommendation. - message CalloutExtensionRecommendation { - // Output only. Callout extensions recommended to be added. - repeated google.ads.googleads.v1.common.CalloutFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // The Maximize Conversions Opt-In recommendation. + message MaximizeConversionsOptInRecommendation { + // Output only. The recommended new budget amount. + google.protobuf.Int64Value recommended_budget_amount_micros = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } // The keyword match type recommendation. @@ -207,10 +195,22 @@ message Recommendation { google.ads.googleads.v1.enums.KeywordMatchTypeEnum.KeywordMatchType recommended_match_type = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } - // The Sitelink extension recommendation. - message SitelinkExtensionRecommendation { - // Output only. Sitelink extensions recommended to be added. - repeated google.ads.googleads.v1.common.SitelinkFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // The Enhanced Cost-Per-Click Opt-In recommendation. + message EnhancedCpcOptInRecommendation { + + } + + // The Maximize Clicks opt-in recommendation. + message MaximizeClicksOptInRecommendation { + // Output only. The recommended new budget amount. + // Only set if the current budget is too high. + google.protobuf.Int64Value recommended_budget_amount_micros = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + } + + // The Call extension recommendation. + message CallExtensionRecommendation { + // Output only. Call extensions recommended to be added. + repeated google.ads.googleads.v1.common.CallFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Immutable. The resource name of the recommendation. diff --git a/google/ads/googleads/v1/services/conversion_adjustment_upload_service.proto b/google/ads/googleads/v1/services/conversion_adjustment_upload_service.proto index f54aceb0f..45222d103 100644 --- a/google/ads/googleads/v1/services/conversion_adjustment_upload_service.proto +++ b/google/ads/googleads/v1/services/conversion_adjustment_upload_service.proto @@ -42,7 +42,7 @@ service ConversionAdjustmentUploadService { post: "/v1/customers/{customer_id=*}:uploadConversionAdjustments" body: "*" }; - option (google.api.method_signature) = "customer_id,conversion_adjustments"; + option (google.api.method_signature) = "customer_id,conversion_adjustments,partial_failure"; } } @@ -55,11 +55,11 @@ message UploadConversionAdjustmentsRequest { // Required. The conversion adjustments that are being uploaded. repeated ConversionAdjustment conversion_adjustments = 2 [(google.api.field_behavior) = REQUIRED]; - // If true, successful operations will be carried out and invalid + // Required. If true, successful operations will be carried out and invalid // operations will return errors. If false, all operations will be carried out // in one transaction if and only if they are all valid. This should always be // set to true. - bool partial_failure = 3; + bool partial_failure = 3 [(google.api.field_behavior) = REQUIRED]; // If true, the request is validated but not executed. Only errors are // returned, not results. diff --git a/google/ads/googleads/v1/services/conversion_upload_service.proto b/google/ads/googleads/v1/services/conversion_upload_service.proto index 4d7da51f0..312853345 100644 --- a/google/ads/googleads/v1/services/conversion_upload_service.proto +++ b/google/ads/googleads/v1/services/conversion_upload_service.proto @@ -41,7 +41,7 @@ service ConversionUploadService { post: "/v1/customers/{customer_id=*}:uploadClickConversions" body: "*" }; - option (google.api.method_signature) = "customer_id,conversions"; + option (google.api.method_signature) = "customer_id,conversions,partial_failure"; } // Processes the given call conversions. @@ -50,7 +50,7 @@ service ConversionUploadService { post: "/v1/customers/{customer_id=*}:uploadCallConversions" body: "*" }; - option (google.api.method_signature) = "customer_id,conversions"; + option (google.api.method_signature) = "customer_id,conversions,partial_failure"; } } @@ -62,11 +62,11 @@ message UploadClickConversionsRequest { // Required. The conversions that are being uploaded. repeated ClickConversion conversions = 2 [(google.api.field_behavior) = REQUIRED]; - // If true, successful operations will be carried out and invalid + // Required. If true, successful operations will be carried out and invalid // operations will return errors. If false, all operations will be carried // out in one transaction if and only if they are all valid. // This should always be set to true. - bool partial_failure = 3; + bool partial_failure = 3 [(google.api.field_behavior) = REQUIRED]; // If true, the request is validated but not executed. Only errors are // returned, not results. @@ -94,11 +94,11 @@ message UploadCallConversionsRequest { // Required. The conversions that are being uploaded. repeated CallConversion conversions = 2 [(google.api.field_behavior) = REQUIRED]; - // If true, successful operations will be carried out and invalid + // Required. If true, successful operations will be carried out and invalid // operations will return errors. If false, all operations will be carried // out in one transaction if and only if they are all valid. // This should always be set to true. - bool partial_failure = 3; + bool partial_failure = 3 [(google.api.field_behavior) = REQUIRED]; // If true, the request is validated but not executed. Only errors are // returned, not results. diff --git a/google/ads/googleads/v1/services/customer_service.proto b/google/ads/googleads/v1/services/customer_service.proto index 9b2eb12d0..5f229e266 100644 --- a/google/ads/googleads/v1/services/customer_service.proto +++ b/google/ads/googleads/v1/services/customer_service.proto @@ -22,7 +22,6 @@ import "google/api/client.proto"; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/protobuf/field_mask.proto"; -import "google/protobuf/wrappers.proto"; option csharp_namespace = "Google.Ads.GoogleAds.V1.Services"; option go_package = "google.golang.org/genproto/googleapis/ads/googleads/v1/services;services"; diff --git a/google/ads/googleads/v1/services/keyword_plan_service.proto b/google/ads/googleads/v1/services/keyword_plan_service.proto index 9f27a3be5..46fe672ca 100644 --- a/google/ads/googleads/v1/services/keyword_plan_service.proto +++ b/google/ads/googleads/v1/services/keyword_plan_service.proto @@ -172,7 +172,7 @@ message GenerateForecastMetricsResponse { message KeywordPlanCampaignForecast { // The resource name of the Keyword Plan campaign related to the forecast. // - // `customers/{customer_id}/keywordPlanCampaigns/{keyword+plan_campaign_id}` + // `customers/{customer_id}/keywordPlanCampaigns/{keyword_plan_campaign_id}` google.protobuf.StringValue keyword_plan_campaign = 1; // The forecast for the Keyword Plan campaign. diff --git a/google/ads/googleads/v2/common/bidding.proto b/google/ads/googleads/v2/common/bidding.proto index a3633c633..20b39bcbd 100644 --- a/google/ads/googleads/v2/common/bidding.proto +++ b/google/ads/googleads/v2/common/bidding.proto @@ -140,7 +140,7 @@ message TargetCpm { // An automated bidding strategy that sets bids so that a certain percentage of // search ads are shown at the top of the first page (or other targeted // location). -// Next Id = 4 +// next tag = 4 message TargetImpressionShare { // The targeted location on the search results page. google.ads.googleads.v2.enums.TargetImpressionShareLocationEnum.TargetImpressionShareLocation location = 1; diff --git a/google/ads/googleads/v2/common/keyword_plan_common.proto b/google/ads/googleads/v2/common/keyword_plan_common.proto index 4134367cf..f7a56609e 100644 --- a/google/ads/googleads/v2/common/keyword_plan_common.proto +++ b/google/ads/googleads/v2/common/keyword_plan_common.proto @@ -31,9 +31,13 @@ option ruby_package = "Google::Ads::GoogleAds::V2::Common"; // Proto file describing Keyword Planner messages. -// Historical metrics. +// Historical metrics specific to the targeting options selected. +// Targeting options include geographies, network, etc. +// Refer to https://support.google.com/google-ads/answer/3022575 for more +// details. message KeywordPlanHistoricalMetrics { - // Average monthly searches for the past 12 months. + // Approximate number of monthly searches on this query averaged + // for the past 12 months. google.protobuf.Int64Value avg_monthly_searches = 1; // The competition level for the query. diff --git a/google/ads/googleads/v2/common/metrics.proto b/google/ads/googleads/v2/common/metrics.proto index 8040b8e67..4f73f4819 100644 --- a/google/ads/googleads/v2/common/metrics.proto +++ b/google/ads/googleads/v2/common/metrics.proto @@ -290,7 +290,7 @@ message Metrics { // future, other ad types may support engagement metrics. google.protobuf.Int64Value engagements = 32; - // Average lead value of hotel. + // Average lead value based on clicks. google.protobuf.DoubleValue hotel_average_lead_value_micros = 75; // The average price difference between the price offered by reporting hotel diff --git a/google/ads/googleads/v2/enums/keyword_plan_competition_level.proto b/google/ads/googleads/v2/enums/keyword_plan_competition_level.proto index f09a1f548..b3fbcdb2c 100644 --- a/google/ads/googleads/v2/enums/keyword_plan_competition_level.proto +++ b/google/ads/googleads/v2/enums/keyword_plan_competition_level.proto @@ -43,13 +43,13 @@ message KeywordPlanCompetitionLevelEnum { // The value is unknown in this version. UNKNOWN = 1; - // Low competition. + // Low competition. The Competition Index range for this is [0, 33]. LOW = 2; - // Medium competition. + // Medium competition. The Competition Index range for this is [34, 66]. MEDIUM = 3; - // High competition. + // High competition. The Competition Index range for this is [67, 100]. HIGH = 4; } diff --git a/google/ads/googleads/v2/errors/customer_error.proto b/google/ads/googleads/v2/errors/customer_error.proto index 1a9049660..ef4a88c32 100644 --- a/google/ads/googleads/v2/errors/customer_error.proto +++ b/google/ads/googleads/v2/errors/customer_error.proto @@ -30,7 +30,6 @@ option ruby_package = "Google::Ads::GoogleAds::V2::Errors"; // Container for enum describing possible customer errors. message CustomerErrorEnum { // Set of errors that are related to requests dealing with Customer. - // Next id: 26 enum CustomerError { // Enum unspecified. UNSPECIFIED = 0; diff --git a/google/ads/googleads/v2/resources/ad.proto b/google/ads/googleads/v2/resources/ad.proto index a8580b581..179411019 100644 --- a/google/ads/googleads/v2/resources/ad.proto +++ b/google/ads/googleads/v2/resources/ad.proto @@ -80,6 +80,7 @@ message Ad { // The list of mappings that can be used to substitute custom parameter tags // in a `tracking_url_template`, `final_urls`, or `mobile_final_urls`. + // For mutates, please use url custom parameter operations. repeated google.ads.googleads.v2.common.CustomParameter url_custom_parameters = 10; // The URL that appears in the ad description for some ad formats. diff --git a/google/ads/googleads/v2/resources/campaign.proto b/google/ads/googleads/v2/resources/campaign.proto index 4d3287cc4..1f80390d5 100644 --- a/google/ads/googleads/v2/resources/campaign.proto +++ b/google/ads/googleads/v2/resources/campaign.proto @@ -83,16 +83,6 @@ message Campaign { google.protobuf.Int64Value hotel_center_id = 1 [(google.api.field_behavior) = IMMUTABLE]; } - // Describes how unbranded pharma ads will be displayed. - message VanityPharma { - // The display mode for vanity pharma URLs. - google.ads.googleads.v2.enums.VanityPharmaDisplayUrlModeEnum.VanityPharmaDisplayUrlMode vanity_pharma_display_url_mode = 1; - - // The text that will be displayed in display URL of the text ad when - // website description is the selected display mode for vanity pharma URLs. - google.ads.googleads.v2.enums.VanityPharmaTextEnum.VanityPharmaText vanity_pharma_text = 2; - } - // The setting for controlling Dynamic Search Ads (DSA). message DynamicSearchAdsSetting { // The Internet domain name that this setting represents, e.g., "google.com" @@ -156,6 +146,15 @@ message Campaign { google.protobuf.StringValue tracking_url = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } + // Represents a collection of settings related to ads geotargeting. + message GeoTargetTypeSetting { + // The setting used for positive geotargeting in this particular campaign. + google.ads.googleads.v2.enums.PositiveGeoTargetTypeEnum.PositiveGeoTargetType positive_geo_target_type = 1; + + // The setting used for negative geotargeting in this particular campaign. + google.ads.googleads.v2.enums.NegativeGeoTargetTypeEnum.NegativeGeoTargetType negative_geo_target_type = 2; + } + // Campaign-level settings for App Campaigns. message AppCampaignSetting { // Represents the goal which the bidding strategy of this app campaign @@ -169,13 +168,14 @@ message Campaign { google.ads.googleads.v2.enums.AppCampaignAppStoreEnum.AppCampaignAppStore app_store = 3 [(google.api.field_behavior) = IMMUTABLE]; } - // Represents a collection of settings related to ads geotargeting. - message GeoTargetTypeSetting { - // The setting used for positive geotargeting in this particular campaign. - google.ads.googleads.v2.enums.PositiveGeoTargetTypeEnum.PositiveGeoTargetType positive_geo_target_type = 1; + // Describes how unbranded pharma ads will be displayed. + message VanityPharma { + // The display mode for vanity pharma URLs. + google.ads.googleads.v2.enums.VanityPharmaDisplayUrlModeEnum.VanityPharmaDisplayUrlMode vanity_pharma_display_url_mode = 1; - // The setting used for negative geotargeting in this particular campaign. - google.ads.googleads.v2.enums.NegativeGeoTargetTypeEnum.NegativeGeoTargetType negative_geo_target_type = 2; + // The text that will be displayed in display URL of the text ad when + // website description is the selected display mode for vanity pharma URLs. + google.ads.googleads.v2.enums.VanityPharmaTextEnum.VanityPharmaText vanity_pharma_text = 2; } // Immutable. The resource name of the campaign. @@ -298,12 +298,10 @@ message Campaign { google.ads.googleads.v2.enums.BiddingStrategyTypeEnum.BiddingStrategyType bidding_strategy_type = 22 [(google.api.field_behavior) = OUTPUT_ONLY]; // The date when campaign started. - // // This field must not be used in WHERE clauses. google.protobuf.StringValue start_date = 19; // The date when campaign ended. - // // This field must not be used in WHERE clauses. google.protobuf.StringValue end_date = 20; diff --git a/google/ads/googleads/v2/resources/invoice.proto b/google/ads/googleads/v2/resources/invoice.proto index 40ad89bd6..c76b43f0c 100644 --- a/google/ads/googleads/v2/resources/invoice.proto +++ b/google/ads/googleads/v2/resources/invoice.proto @@ -158,7 +158,6 @@ message Invoice { // Output only. The resource name of the original invoice corrected, wrote off, or canceled // by this invoice, if applicable. If `corrected_invoice` is set, // `replaced_invoices` will not be set. - // // Invoice resource names have the form: // // `customers/{customer_id}/invoices/{invoice_id}` diff --git a/google/ads/googleads/v2/resources/keyword_plan_campaign.proto b/google/ads/googleads/v2/resources/keyword_plan_campaign.proto index 47c0f4e57..cebd04a54 100644 --- a/google/ads/googleads/v2/resources/keyword_plan_campaign.proto +++ b/google/ads/googleads/v2/resources/keyword_plan_campaign.proto @@ -91,7 +91,6 @@ message KeywordPlanCampaign { } // A geo target. -// Next ID: 3 message KeywordPlanGeoTarget { // Required. The resource name of the geo target. google.protobuf.StringValue geo_target_constant = 1 [(google.api.resource_reference) = { diff --git a/google/ads/googleads/v2/resources/recommendation.proto b/google/ads/googleads/v2/resources/recommendation.proto index bebd708b1..95d6d364d 100644 --- a/google/ads/googleads/v2/resources/recommendation.proto +++ b/google/ads/googleads/v2/resources/recommendation.proto @@ -106,13 +106,13 @@ message Recommendation { google.protobuf.Int64Value recommended_cpc_bid_micros = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } - // The move unused budget recommendation. - message MoveUnusedBudgetRecommendation { - // Output only. The excess budget's resource_name. - google.protobuf.StringValue excess_campaign_budget = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // The keyword match type recommendation. + message KeywordMatchTypeRecommendation { + // Output only. The existing keyword where the match type should be more broad. + google.ads.googleads.v2.common.KeywordInfo keyword = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; - // Output only. The recommendation for the constrained budget to increase. - CampaignBudgetRecommendation budget_recommendation = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; + // Output only. The recommended new match type. + google.ads.googleads.v2.enums.KeywordMatchTypeEnum.KeywordMatchType recommended_match_type = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } // The text ad recommendation. @@ -130,24 +130,6 @@ message Recommendation { google.protobuf.StringValue auto_apply_date = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; } - // The Search Partners Opt-In recommendation. - message SearchPartnersOptInRecommendation { - - } - - // The Maximize Clicks opt-in recommendation. - message MaximizeClicksOptInRecommendation { - // Output only. The recommended new budget amount. - // Only set if the current budget is too high. - google.protobuf.Int64Value recommended_budget_amount_micros = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; - } - - // The Call extension recommendation. - message CallExtensionRecommendation { - // Output only. Call extensions recommended to be added. - repeated google.ads.googleads.v2.common.CallFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; - } - // The Target CPA opt-in recommendation. message TargetCpaOptInRecommendation { // The Target CPA opt-in option with impact estimate. @@ -176,35 +158,42 @@ message Recommendation { google.protobuf.Int64Value recommended_target_cpa_micros = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } - // The keyword match type recommendation. - message KeywordMatchTypeRecommendation { - // Output only. The existing keyword where the match type should be more broad. - google.ads.googleads.v2.common.KeywordInfo keyword = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; - - // Output only. The recommended new match type. - google.ads.googleads.v2.enums.KeywordMatchTypeEnum.KeywordMatchType recommended_match_type = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; - } - // The Maximize Conversions Opt-In recommendation. message MaximizeConversionsOptInRecommendation { // Output only. The recommended new budget amount. google.protobuf.Int64Value recommended_budget_amount_micros = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } + // The Call extension recommendation. + message CallExtensionRecommendation { + // Output only. Call extensions recommended to be added. + repeated google.ads.googleads.v2.common.CallFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + } + + // The move unused budget recommendation. + message MoveUnusedBudgetRecommendation { + // Output only. The excess budget's resource_name. + google.protobuf.StringValue excess_campaign_budget = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The recommendation for the constrained budget to increase. + CampaignBudgetRecommendation budget_recommendation = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; + } + // The Enhanced Cost-Per-Click Opt-In recommendation. message EnhancedCpcOptInRecommendation { } - // The Optimize Ad Rotation recommendation. - message OptimizeAdRotationRecommendation { + // The Search Partners Opt-In recommendation. + message SearchPartnersOptInRecommendation { } - // The Callout extension recommendation. - message CalloutExtensionRecommendation { - // Output only. Callout extensions recommended to be added. - repeated google.ads.googleads.v2.common.CalloutFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + // The Maximize Clicks opt-in recommendation. + message MaximizeClicksOptInRecommendation { + // Output only. The recommended new budget amount. + // Only set if the current budget is too high. + google.protobuf.Int64Value recommended_budget_amount_micros = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } // The Sitelink extension recommendation. @@ -213,6 +202,17 @@ message Recommendation { repeated google.ads.googleads.v2.common.SitelinkFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } + // The Optimize Ad Rotation recommendation. + message OptimizeAdRotationRecommendation { + + } + + // The Callout extension recommendation. + message CalloutExtensionRecommendation { + // Output only. Callout extensions recommended to be added. + repeated google.ads.googleads.v2.common.CalloutFeedItem recommended_extensions = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + } + // Immutable. The resource name of the recommendation. // // `customers/{customer_id}/recommendations/{recommendation_id}` diff --git a/google/ads/googleads/v2/services/conversion_adjustment_upload_service.proto b/google/ads/googleads/v2/services/conversion_adjustment_upload_service.proto index 96c65bf3f..58ae0e2b6 100644 --- a/google/ads/googleads/v2/services/conversion_adjustment_upload_service.proto +++ b/google/ads/googleads/v2/services/conversion_adjustment_upload_service.proto @@ -42,7 +42,7 @@ service ConversionAdjustmentUploadService { post: "/v2/customers/{customer_id=*}:uploadConversionAdjustments" body: "*" }; - option (google.api.method_signature) = "customer_id,conversion_adjustments"; + option (google.api.method_signature) = "customer_id,conversion_adjustments,partial_failure"; } } @@ -55,11 +55,11 @@ message UploadConversionAdjustmentsRequest { // Required. The conversion adjustments that are being uploaded. repeated ConversionAdjustment conversion_adjustments = 2 [(google.api.field_behavior) = REQUIRED]; - // If true, successful operations will be carried out and invalid + // Required. If true, successful operations will be carried out and invalid // operations will return errors. If false, all operations will be carried out // in one transaction if and only if they are all valid. This should always be // set to true. - bool partial_failure = 3; + bool partial_failure = 3 [(google.api.field_behavior) = REQUIRED]; // If true, the request is validated but not executed. Only errors are // returned, not results. diff --git a/google/ads/googleads/v2/services/conversion_upload_service.proto b/google/ads/googleads/v2/services/conversion_upload_service.proto index bd5ab39c6..ec7de2da4 100644 --- a/google/ads/googleads/v2/services/conversion_upload_service.proto +++ b/google/ads/googleads/v2/services/conversion_upload_service.proto @@ -41,7 +41,7 @@ service ConversionUploadService { post: "/v2/customers/{customer_id=*}:uploadClickConversions" body: "*" }; - option (google.api.method_signature) = "customer_id,conversions"; + option (google.api.method_signature) = "customer_id,conversions,partial_failure"; } // Processes the given call conversions. @@ -50,7 +50,7 @@ service ConversionUploadService { post: "/v2/customers/{customer_id=*}:uploadCallConversions" body: "*" }; - option (google.api.method_signature) = "customer_id,conversions"; + option (google.api.method_signature) = "customer_id,conversions,partial_failure"; } } @@ -62,11 +62,11 @@ message UploadClickConversionsRequest { // Required. The conversions that are being uploaded. repeated ClickConversion conversions = 2 [(google.api.field_behavior) = REQUIRED]; - // If true, successful operations will be carried out and invalid + // Required. If true, successful operations will be carried out and invalid // operations will return errors. If false, all operations will be carried // out in one transaction if and only if they are all valid. // This should always be set to true. - bool partial_failure = 3; + bool partial_failure = 3 [(google.api.field_behavior) = REQUIRED]; // If true, the request is validated but not executed. Only errors are // returned, not results. @@ -94,11 +94,11 @@ message UploadCallConversionsRequest { // Required. The conversions that are being uploaded. repeated CallConversion conversions = 2 [(google.api.field_behavior) = REQUIRED]; - // If true, successful operations will be carried out and invalid + // Required. If true, successful operations will be carried out and invalid // operations will return errors. If false, all operations will be carried // out in one transaction if and only if they are all valid. // This should always be set to true. - bool partial_failure = 3; + bool partial_failure = 3 [(google.api.field_behavior) = REQUIRED]; // If true, the request is validated but not executed. Only errors are // returned, not results. diff --git a/google/ads/googleads/v2/services/keyword_plan_service.proto b/google/ads/googleads/v2/services/keyword_plan_service.proto index 8aa95c9d0..212dd5ec3 100644 --- a/google/ads/googleads/v2/services/keyword_plan_service.proto +++ b/google/ads/googleads/v2/services/keyword_plan_service.proto @@ -172,7 +172,7 @@ message GenerateForecastMetricsResponse { message KeywordPlanCampaignForecast { // The resource name of the Keyword Plan campaign related to the forecast. // - // `customers/{customer_id}/keywordPlanCampaigns/{keyword+plan_campaign_id}` + // `customers/{customer_id}/keywordPlanCampaigns/{keyword_plan_campaign_id}` google.protobuf.StringValue keyword_plan_campaign = 1; // The forecast for the Keyword Plan campaign. diff --git a/google/ads/googleads/v2/services/reach_plan_service.proto b/google/ads/googleads/v2/services/reach_plan_service.proto index dd023380f..59f52e7ec 100644 --- a/google/ads/googleads/v2/services/reach_plan_service.proto +++ b/google/ads/googleads/v2/services/reach_plan_service.proto @@ -231,7 +231,7 @@ message GenerateReachForecastRequest { // This is equivalent to the frequency cap exposed in Google Ads when creating // a campaign, it represents the maximum number of times an ad can be shown to // the same user. - // If not specified no cap is applied. + // If not specified, no cap is applied. google.protobuf.Int32Value cookie_frequency_cap = 4; // Desired minimum effective frequency (the number of times a person was @@ -245,16 +245,14 @@ message GenerateReachForecastRequest { // This is planned targeting: execution details might vary based on the // advertising product, please consult an implementation specialist. // - // If no targeting dimensions are specified, then campaigns will target - // everywhere and everyone. - // // See specific metrics for details on how targeting affects them. // // In some cases, targeting may be overridden using the // PlannedProduct.advanced_product_targeting field. Targeting targeting = 6; - // Required. The product to be planned. + // Required. The products to be forecast. + // The max number of allowed planned products is 15. repeated PlannedProduct planned_products = 7 [(google.api.field_behavior) = REQUIRED]; } @@ -264,14 +262,17 @@ message Targeting { // Plannable locations ID can be obtained from ListPlannableLocations. google.protobuf.StringValue plannable_location_id = 1; - // Required - // Selected age range to be planned on. + // Targeted age range. + // If not specified, targets all age ranges. google.ads.googleads.v2.enums.ReachPlanAgeRangeEnum.ReachPlanAgeRange age_range = 2; - // Targetable genders for the ad product. + // Targeted genders. + // If not specified, targets all genders. repeated google.ads.googleads.v2.common.GenderInfo genders = 3; - // Targetable devices for the ad product. + // Targeted devices. + // If not specified, targets all applicable devices. Applicable devices vary + // by product and region and can be obtained from ListPlannableProducts. repeated google.ads.googleads.v2.common.DeviceInfo devices = 4; } @@ -337,7 +338,7 @@ message Forecast { google.protobuf.Int64Value on_target_impressions = 3; // Total number of ad impressions. This includes impressions that may fall - // outside the specified Targeting, due to insufficent information on + // outside the specified Targeting, due to insufficient information on // signed-in users. google.protobuf.Int64Value total_impressions = 4; } diff --git a/google/analytics/data/v1alpha/BUILD.bazel b/google/analytics/data/v1alpha/BUILD.bazel new file mode 100644 index 000000000..79c1176da --- /dev/null +++ b/google/analytics/data/v1alpha/BUILD.bazel @@ -0,0 +1,358 @@ +# This file was automatically generated by BuildFileGenerator + +# This is an API workspace, having public visibility by default makes perfect sense. +package(default_visibility = ["//visibility:public"]) + +############################################################################## +# Common +############################################################################## +load("@rules_proto//proto:defs.bzl", "proto_library") +load("@com_google_googleapis_imports//:imports.bzl", "proto_library_with_info") + +proto_library( + name = "data_proto", + srcs = [ + "analytics_data_api.proto", + "data.proto", + ], + deps = [ + "//google/api:annotations_proto", + "//google/api:client_proto", + ], +) + +proto_library_with_info( + name = "data_proto_with_info", + deps = [ + ":data_proto", + "//google/cloud:common_resources_proto", + ], +) + +############################################################################## +# Java +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "java_gapic_assembly_gradle_pkg", + "java_gapic_library", + "java_gapic_test", + "java_grpc_library", + "java_proto_library", +) + +java_proto_library( + name = "data_java_proto", + deps = [":data_proto"], +) + +java_grpc_library( + name = "data_java_grpc", + srcs = [":data_proto"], + deps = [":data_java_proto"], +) + +java_gapic_library( + name = "data_java_gapic", + src = ":data_proto_with_info", + gapic_yaml = "analyticsdata_gapic.yaml", + grpc_service_config = "analytics_data_grpc_service_config.json", + package = "google.analytics.data.v1alpha", + service_yaml = "analyticsdata_v1alpha.yaml", + test_deps = [ + ":data_java_grpc", + ], + deps = [ + ":data_java_proto", + ], +) + +java_gapic_test( + name = "data_java_gapic_test_suite", + test_classes = [ + "com.google.analytics.data.v1alpha.AlphaAnalyticsDataClientTest", + ], + runtime_deps = [":data_java_gapic_test"], +) + +# Open Source Packages +java_gapic_assembly_gradle_pkg( + name = "analytics-data-v1alpha-java", + deps = [ + ":data_java_gapic", + ":data_java_grpc", + ":data_java_proto", + ":data_proto", + ], +) + +############################################################################## +# Go +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "go_gapic_assembly_pkg", + "go_gapic_library", + "go_proto_library", + "go_test", +) + +go_proto_library( + name = "data_go_proto", + compilers = ["@io_bazel_rules_go//proto:go_grpc"], + importpath = "google.golang.org/genproto/googleapis/analytics/data/v1alpha", + protos = [":data_proto"], + deps = [ + "//google/api:annotations_go_proto", + ], +) + +go_gapic_library( + name = "data_go_gapic", + srcs = [":data_proto_with_info"], + grpc_service_config = "analytics_data_grpc_service_config.json", + importpath = "google.golang.org/google/analytics/data/v1alpha;data", + service_yaml = "analyticsdata_v1alpha.yaml", + deps = [ + ":data_go_proto", + ], +) + +go_test( + name = "data_go_gapic_test", + srcs = [":data_go_gapic_srcjar_test"], + embed = [":data_go_gapic"], + importpath = "google.golang.org/google/analytics/data/v1alpha", +) + +# Open Source Packages +go_gapic_assembly_pkg( + name = "gapi-cloud-analytics-data-v1alpha-go", + deps = [ + ":data_go_gapic", + ":data_go_gapic_srcjar-test.srcjar", + ":data_go_proto", + ], +) + +############################################################################## +# Python +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "moved_proto_library", + "py_gapic_assembly_pkg", + "py_gapic_library", + "py_grpc_library", + "py_proto_library", +) + +moved_proto_library( + name = "data_moved_proto", + srcs = [":data_proto"], + deps = [ + "//google/api:annotations_proto", + "//google/api:client_proto", + ], +) + +py_proto_library( + name = "data_py_proto", + plugin = "@protoc_docs_plugin//:docs_plugin", + deps = [":data_moved_proto"], +) + +py_grpc_library( + name = "data_py_grpc", + srcs = [":data_moved_proto"], + deps = [":data_py_proto"], +) + +py_gapic_library( + name = "data_py_gapic", + src = ":data_proto_with_info", + gapic_yaml = "analyticsdata_gapic.yaml", + grpc_service_config = "analytics_data_grpc_service_config.json", + package = "google.analytics.data.v1alpha", + service_yaml = "analyticsdata_v1alpha.yaml", + deps = [ + ":data_py_grpc", + ":data_py_proto", + ], +) + +# Open Source Packages +py_gapic_assembly_pkg( + name = "analytics-data-v1alpha-py", + deps = [ + ":data_py_gapic", + ":data_py_grpc", + ":data_py_proto", + ], +) + +############################################################################## +# PHP +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "php_gapic_assembly_pkg", + "php_gapic_library", + "php_grpc_library", + "php_proto_library", +) + +php_proto_library( + name = "data_php_proto", + deps = [":data_proto"], +) + +php_grpc_library( + name = "data_php_grpc", + srcs = [":data_proto"], + deps = [":data_php_proto"], +) + +php_gapic_library( + name = "data_php_gapic", + src = ":data_proto_with_info", + gapic_yaml = "analyticsdata_gapic.yaml", + grpc_service_config = "analytics_data_grpc_service_config.json", + package = "google.analytics.data.v1alpha", + service_yaml = "analyticsdata_v1alpha.yaml", + deps = [ + ":data_php_grpc", + ":data_php_proto", + ], +) + +# Open Source Packages +php_gapic_assembly_pkg( + name = "analytics-data-v1alpha-php", + deps = [ + ":data_php_gapic", + ":data_php_grpc", + ":data_php_proto", + ], +) + +############################################################################## +# Node.js +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "nodejs_gapic_assembly_pkg", + "nodejs_gapic_library", +) + +nodejs_gapic_library( + name = "data_nodejs_gapic", + src = ":data_proto_with_info", + grpc_service_config = "analytics_data_grpc_service_config.json", + package = "google.analytics.data.v1alpha", + service_yaml = "analyticsdata_v1alpha.yaml", + deps = [], +) + +nodejs_gapic_assembly_pkg( + name = "analytics-data-v1alpha-nodejs", + deps = [ + ":data_nodejs_gapic", + ":data_proto", + ], +) + +############################################################################## +# Ruby +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "ruby_gapic_assembly_pkg", + "ruby_gapic_library", + "ruby_grpc_library", + "ruby_proto_library", +) + +ruby_proto_library( + name = "data_ruby_proto", + deps = [":data_proto"], +) + +ruby_grpc_library( + name = "data_ruby_grpc", + srcs = [":data_proto"], + deps = [":data_ruby_proto"], +) + +ruby_gapic_library( + name = "data_ruby_gapic", + src = ":data_proto_with_info", + gapic_yaml = "analyticsdata_gapic.yaml", + grpc_service_config = "analytics_data_grpc_service_config.json", + package = "google.analytics.data.v1alpha", + service_yaml = "analyticsdata_v1alpha.yaml", + deps = [ + ":data_ruby_grpc", + ":data_ruby_proto", + ], +) + +# Open Source Packages +ruby_gapic_assembly_pkg( + name = "analytics-data-v1alpha-ruby", + deps = [ + ":data_ruby_gapic", + ":data_ruby_grpc", + ":data_ruby_proto", + ], +) + +############################################################################## +# C# +############################################################################## +load( + "@com_google_googleapis_imports//:imports.bzl", + "csharp_gapic_assembly_pkg", + "csharp_gapic_library", + "csharp_grpc_library", + "csharp_proto_library", +) + +csharp_proto_library( + name = "data_csharp_proto", + deps = [":data_proto"], +) + +csharp_grpc_library( + name = "data_csharp_grpc", + srcs = [":data_proto"], + deps = [":data_csharp_proto"], +) + +csharp_gapic_library( + name = "data_csharp_gapic", + src = ":data_proto_with_info", + gapic_yaml = "analyticsdata_gapic.yaml", + grpc_service_config = "analytics_data_grpc_service_config.json", + package = "google.analytics.data.v1alpha", + service_yaml = "analyticsdata_v1alpha.yaml", + deps = [ + ":data_csharp_grpc", + ":data_csharp_proto", + ], +) + +# Open Source Packages +csharp_gapic_assembly_pkg( + name = "analytics-data-v1alpha-csharp", + deps = [ + ":data_csharp_gapic", + ":data_csharp_grpc", + ":data_csharp_proto", + ], +) + +############################################################################## +# C++ +############################################################################## +# Put your C++ rules here diff --git a/google/analytics/data/v1alpha/analytics_data_api.proto b/google/analytics/data/v1alpha/analytics_data_api.proto new file mode 100644 index 000000000..b2b031200 --- /dev/null +++ b/google/analytics/data/v1alpha/analytics_data_api.proto @@ -0,0 +1,306 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.analytics.data.v1alpha; + +import "google/analytics/data/v1alpha/data.proto"; +import "google/api/annotations.proto"; +import "google/api/client.proto"; + +option go_package = "google.golang.org/genproto/googleapis/analytics/data/v1alpha;data"; +option java_multiple_files = true; +option java_outer_classname = "AnalyticsDataApiProto"; +option java_package = "com.google.analytics.data.v1alpha"; + +// Google Analytics reporting data service. +service AlphaAnalyticsData { + option (google.api.default_host) = "analyticsdata.googleapis.com"; + option (google.api.oauth_scopes) = + "https://www.googleapis.com/auth/analytics," + "https://www.googleapis.com/auth/analytics.readonly"; + + // Returns a customized report of your Google Analytics event data. Reports + // contain statistics derived from data collected by the Google Analytics + // tracking code. The data returned from the API is as a table with columns + // for the requested dimensions and metrics. Metrics are individual + // measurements of user activity on your property, such as active users or + // event count. Dimensions break down metrics across some common criteria, + // such as country or event name. + rpc RunReport(RunReportRequest) returns (RunReportResponse) { + option (google.api.http) = { + post: "/v1alpha:runReport" + body: "*" + }; + } + + // Returns a customized pivot report of your Google Analytics event data. + // Pivot reports are more advanced and expressive formats than regular + // reports. In a pivot report, dimensions are only visible if they are + // included in a pivot. Multiple pivots can be specified to further dissect + // your data. + rpc RunPivotReport(RunPivotReportRequest) returns (RunPivotReportResponse) { + option (google.api.http) = { + post: "/v1alpha:runPivotReport" + body: "*" + }; + } + + // Returns multiple reports in a batch. All reports must be for the same + // Entity. + rpc BatchRunReports(BatchRunReportsRequest) returns (BatchRunReportsResponse) { + option (google.api.http) = { + post: "/v1alpha:batchRunReports" + body: "*" + }; + } + + // Returns multiple pivot reports in a batch. All reports must be for the same + // Entity. + rpc BatchRunPivotReports(BatchRunPivotReportsRequest) returns (BatchRunPivotReportsResponse) { + option (google.api.http) = { + post: "/v1alpha:batchRunPivotReports" + body: "*" + }; + } +} + +// The request to generate a report. +message RunReportRequest { + // A property whose events are tracked. Within a batch request, this entity + // should either be unspecified or consistent with the batch-level entity. + Entity entity = 1; + + // The dimensions requested and displayed. + repeated Dimension dimensions = 2; + + // The metrics requested and displayed. + repeated Metric metrics = 3; + + // Date ranges of data to read. If multiple date ranges are requested, each + // response row will contain a zero based date range index. If two date + // ranges overlap, the event data for the overlapping days is included in the + // response rows for both date ranges. + repeated DateRange date_ranges = 4; + + // The row count of the start row. The first row is counted as row 0. + int64 offset = 5; + + // The number of rows to return. + // If zero or unspecified, all rows are returned. + int64 limit = 6; + + // Aggregation of metrics. Aggregated metric values will be shown in rows + // where the dimension_values are set to "RESERVED_(MetricAggregation)". + repeated MetricAggregation metric_aggregations = 7; + + // The filter clause of dimensions. + FilterExpression dimension_filter = 8; + + // The filter clause of metrics. Applied at post aggregation phase, similar to + // SQL having-clause. + FilterExpression metric_filter = 9; + + // Specifies how rows are ordered in the response. + repeated OrderBy order_bys = 10; + + // A currency code in ISO4217 format, such as "AED", "USD", "JPY". + // If the field is empty, the report uses the entity's default currency. + string currency_code = 11; + + // Cohort group associated with this request. If there is a cohort group + // in the request the 'cohort' dimension must be present. + CohortSpec cohort_spec = 12; + + // If false, rows with metrics being 0 will not be returned. + bool keep_empty_rows = 13; + + // Toggles whether to return the current state of this Analytics Property's + // quota. Quota is returned in [PropertyQuota](#PropertyQuota). + bool return_property_quota = 14; +} + +// The response report table corresponding to a request. +message RunReportResponse { + // Describes metric columns. + repeated MetricHeader metric_headers = 1; + + // Rows of dimension value combinations and metric values in the report. + repeated Row rows = 2; + + // If requested, the totaled values of metrics. + repeated Row totals = 8; + + // If requested, the maximum values of metrics. + repeated Row maximums = 9; + + // If requested, the minimum values of metrics. + repeated Row minimums = 10; + + // Metadata for the report. + ResponseMetaData metadata = 6; + + // This Analytics Property's quota state including this request. + PropertyQuota property_quota = 7; +} + +// The request to generate a pivot report. +message RunPivotReportRequest { + // A property whose events are tracked. Within a batch request, this entity + // should either be unspecified or consistent with the batch-level entity. + Entity entity = 1; + + // The dimensions requested. All defined dimensions must be used by one of the + // following: dimension_expression, dimension_filter, pivots, order_bys. + repeated Dimension dimensions = 2; + + // The metrics requested, at least one metric needs to be specified. All + // defined metrics must be used by one of the following: metric_expression, + // metric_filter, order_bys. + repeated Metric metrics = 3; + + // The filter clause of dimensions. Requests are validated that all + // field_names in the dimension_filter are dimensions and are defined in + // Dimensions. + FilterExpression dimension_filter = 4; + + // The filter clause of metrics. Applied at post aggregation phase, similar to + // SQL having-clause. Requests are validated that all field_names in the + // metric_filter are metrics and are defined in Metrics. + FilterExpression metric_filter = 5; + + // Describes the visual format of the report's dimensions in columns or rows. + // The union of the fieldNames (dimension names) in all pivots must be a + // subset of dimension names defined in Dimensions. No two pivots can share a + // dimension. A dimension is only visible if it appears in a pivot. + repeated Pivot pivots = 6; + + // The date range to retrieve event data for the report. If multiple date + // ranges are specified, event data from each date range is used in the + // report. A special dimension with field name "dateRange" can be included in + // a Pivot's field names; if included, the report compares between date + // ranges. This dateRanges field is not used in cohorts reports. + repeated DateRange date_ranges = 7; + + // A currency code in ISO4217 format, such as "AED", "USD", "JPY". + // If the field is empty, the report uses the entity's default currency. + string currency_code = 8; + + // Cohort group associated with this request. If there is a cohort group + // in the request the 'cohort' dimension must be present. + CohortSpec cohort_spec = 9; + + // If false, rows with metrics being 0 will not be returned. + bool keep_empty_rows = 10; + + // Toggles whether to return the current state of this Analytics Property's + // quota. Quota is returned in [PropertyQuota](#PropertyQuota). + bool return_property_quota = 11; +} + +// The response pivot report table corresponding to a pivot request. +message RunPivotReportResponse { + // Summarizes the columns and rows created by a pivot. Each pivot in the + // request produces one header in the response. If we have a request like + // this: + // + // "pivots": [{ + // "fieldNames": ["country", + // "city"] + // }, + // { + // "fieldNames": "eventName" + // }] + // + // We will have the following `pivotHeaders` in the response: + // + // "pivotHeaders" : [{ + // "dimensionHeaders": [{ + // "dimensionValues": [ + // { "value": "United Kingdom" }, + // { "value": "London" } + // ] + // }, + // { + // "dimensionValues": [ + // { "value": "Japan" }, + // { "value": "Osaka" } + // ] + // }] + // }, + // { + // "dimensionHeaders": [{ + // "dimensionValues": [{ "value": "session_start" }] + // }, + // { + // "dimensionValues": [{ "value": "scroll" }] + // }] + // }] + repeated PivotHeader pivot_headers = 1; + + // Describes metric columns. + repeated MetricHeader metric_headers = 2; + + // Rows of dimension value combinations and metric values in the report. + repeated Row rows = 3; + + // Aggregation of metric values. Can be totals, minimums, or maximums. The + // returned aggregations are controlled by the metric_aggregations in the + // pivot. The type of aggregation returned in each row is shown by the + // dimension_values which are set to "RESERVED_". + repeated Row aggregates = 4; + + // Metadata for the report. + ResponseMetaData metadata = 5; + + // This Analytics Property's quota state including this request. + PropertyQuota property_quota = 6; +} + +// The batch request containing multiple report requests. +message BatchRunReportsRequest { + // A property whose events are tracked. This entity must be specified for the + // batch. The entity within RunReportRequest may either be unspecified or + // consistent with this entity. + Entity entity = 1; + + // Individual requests. Each request has a separate report response. Each + // batch request is allowed up to 5 requests. + repeated RunReportRequest requests = 2; +} + +// The batch response containing multiple reports. +message BatchRunReportsResponse { + // Individual responses. Each response has a separate report request. + repeated RunReportResponse reports = 1; +} + +// The batch request containing multiple pivot report requests. +message BatchRunPivotReportsRequest { + // A property whose events are tracked. This entity must be specified for the + // batch. The entity within RunPivotReportRequest may either be unspecified or + // consistent with this entity. + Entity entity = 1; + + // Individual requests. Each request has a separate pivot report response. + // Each batch request is allowed up to 5 requests. + repeated RunPivotReportRequest requests = 2; +} + +// The batch response containing multiple pivot reports. +message BatchRunPivotReportsResponse { + // Individual responses. Each response has a separate pivot report request. + repeated RunPivotReportResponse pivot_reports = 1; +} diff --git a/google/analytics/data/v1alpha/analytics_data_grpc_service_config.json b/google/analytics/data/v1alpha/analytics_data_grpc_service_config.json new file mode 100644 index 000000000..940558b11 --- /dev/null +++ b/google/analytics/data/v1alpha/analytics_data_grpc_service_config.json @@ -0,0 +1,36 @@ +{ + "methodConfig": [ + { + "name": [{"service": "google.analytics.data.v1alpha.AlphaAnalyticsData"}], + "timeout": "60s", + "retryPolicy": { + "maxAttempts": 5, + "initialBackoff": "1s", + "maxBackoff": "60s", + "backoffMultiplier": 1.3, + "retryableStatusCodes": ["UNKNOWN"] + } + }, + { + "name": [ + { + "service": "google.analytics.data.v1alpha.AlphaAnalyticsData", + "method": "RunReport" + }, + { + "service": "google.analytics.data.v1alpha.AlphaAnalyticsData", + "method": "RunPivotReport" + }, + { + "service": "google.analytics.data.v1alpha.AlphaAnalyticsData", + "method": "BatchRunReports" + }, + { + "service": "google.analytics.data.v1alpha.AlphaAnalyticsData", + "method": "BatchRunPivotReports" + } + ], + "timeout": "60s" + } + ] +} diff --git a/google/analytics/data/v1alpha/analyticsdata_gapic.yaml b/google/analytics/data/v1alpha/analyticsdata_gapic.yaml new file mode 100644 index 000000000..6ab3aef1b --- /dev/null +++ b/google/analytics/data/v1alpha/analyticsdata_gapic.yaml @@ -0,0 +1,18 @@ +type: com.google.api.codegen.ConfigProto +config_schema_version: 2.0.0 +language_settings: + java: + package_name: com.google.analytics.data.v1alpha + python: + package_name: google.analytics.data.v1alpha.gapic + go: + package_name: google.golang.org/api/analyticsdata/v1alpha + csharp: + package_name: Google.Analytics.Data.V1alpha + ruby: + package_name: Google::Analytics::Data::V1alpha + php: + package_name: Google\Analytics\Data\V1alpha + nodejs: + package_name: google.analytics.data.v1alpha + domain_layer_location: analyticsdata.google.com diff --git a/google/analytics/data/v1alpha/analyticsdata_v1alpha.yaml b/google/analytics/data/v1alpha/analyticsdata_v1alpha.yaml new file mode 100644 index 000000000..0e68c8676 --- /dev/null +++ b/google/analytics/data/v1alpha/analyticsdata_v1alpha.yaml @@ -0,0 +1,23 @@ +type: google.api.Service +config_version: 3 +name: analyticsdata.googleapis.com +title: Google Analytics Data API + +apis: +- name: google.analytics.data.v1alpha.AlphaAnalyticsData + +documentation: + summary: Accesses report data in Google Analytics. + +backend: + rules: + - selector: 'google.analytics.data.v1alpha.AlphaAnalyticsData.*' + deadline: 180.0 + +authentication: + rules: + - selector: 'google.analytics.data.v1alpha.AlphaAnalyticsData.*' + oauth: + canonical_scopes: |- + https://www.googleapis.com/auth/analytics, + https://www.googleapis.com/auth/analytics.readonly diff --git a/google/analytics/data/v1alpha/data.proto b/google/analytics/data/v1alpha/data.proto new file mode 100644 index 000000000..0b1dd8fd3 --- /dev/null +++ b/google/analytics/data/v1alpha/data.proto @@ -0,0 +1,614 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.analytics.data.v1alpha; + +option go_package = "google.golang.org/genproto/googleapis/analytics/data/v1alpha;data"; +option java_multiple_files = true; +option java_outer_classname = "ReportingApiProto"; +option java_package = "com.google.analytics.data.v1alpha"; + +// A contiguous set of days: startDate, startDate + 1, ..., endDate. Requests +// are allowed up to 4 date ranges, and the union of the ranges can cover up to +// 1 year. +message DateRange { + // The inclusive start date for the query in the format `YYYY-MM-DD`. Cannot + // be after `end_date`. The format `NdaysAgo`, `yesterday`, or `today` is also + // accepted, and in that case, the date is inferred based on the property's + // reporting time zone. + string start_date = 1; + + // The inclusive end date for the query in the format `YYYY-MM-DD`. Cannot + // be before `start_date`. The format `NdaysAgo`, `yesterday`, or `today` is + // also accepted, and in that case, the date is inferred based on the + // property's reporting time zone. + string end_date = 2; + + // Assigns a name to this date range. The dimension `dateRange` is valued to + // this name in a report response. If set, cannot begin with `date_range_` or + // `RESERVED_`. If not set, date ranges are named by their zero based index in + // the request: `date_range_0`, `date_range_1`, etc. + string name = 3; +} + +// The unique identifier of the property whose events are tracked. +message Entity { + // A Google Analytics App + Web property id. + string property_id = 1; +} + +// Dimensions are attributes of your data. For example, the dimension City +// indicates the city, for example, "Paris" or "New York", from which an event +// originates. Requests are allowed up to 8 dimensions. +message Dimension { + // The name of the dimension. + string name = 1; + + // One dimension can be the result of an expression of multiple dimensions. + // For example, dimension "country, city": concatenate(country, ", ", city). + DimensionExpression dimension_expression = 2; +} + +// Used to express a dimension which is the result of a formula of multiple +// dimensions. Example usages: +// 1) lower_case(dimension) +// 2) concatenate(dimension1, symbol, dimension2). +message DimensionExpression { + // Used to convert a dimension value to a single case. + message CaseExpression { + // Name of a dimension. The name must refer back to a name in dimensions + // field of the request. + string dimension_name = 1; + } + + // Used to combine dimension values to a single dimension. + message ConcatenateExpression { + // Names of dimensions. The names must refer back to names in the dimensions + // field of the request. + repeated string dimension_names = 1; + + // The delimiter placed between dimension names. + // + // Delimiters are often single characters such as "|" or "," but can be + // longer strings. If a dimension value contains the delimiter, both will be + // present in response with no distinction. For example if dimension 1 value + // = "US,FR", dimension 2 value = "JP", and delimiter = ",", then the + // response will contain "US,FR,JP". + string delimiter = 2; + } + + // Specify one type of dimension expression for `DimensionExpression`. + oneof one_expression { + // Used to convert a dimension value to lower case. + CaseExpression lower_case = 4; + + // Used to convert a dimension value to upper case. + CaseExpression upper_case = 5; + + // Used to combine dimension values to a single dimension. + // For example, dimension "country, city": concatenate(country, ", ", city). + ConcatenateExpression concatenate = 6; + } +} + +// The quantitative measurements of a report. For example, the metric eventCount +// is the total number of events. Requests are allowed up to 10 metrics. +message Metric { + // The name of the metric. + string name = 1; + + // A mathematical expression for derived metrics. For example, the metric + // Event count per user is eventCount/totalUsers. + string expression = 2; + + // Indicates if a metric is invisible. + // If a metric is invisible, the metric is not in the response, but can be + // used in filters, order_bys or being referred to in a metric expression. + bool invisible = 3; +} + +// To express dimension or metric filters. +// The fields in the same FilterExpression need to be either all dimensions or +// all metrics. +message FilterExpression { + // Specify one type of filter expression for `FilterExpression`. + oneof expr { + // The FilterExpressions in and_group have an AND relationship. + FilterExpressionList and_group = 1; + + // The FilterExpressions in or_group have an OR relationship. + FilterExpressionList or_group = 2; + + // The FilterExpression is NOT of not_expression. + FilterExpression not_expression = 3; + + // A primitive filter. + // All fields in filter in same FilterExpression needs to be either all + // dimensions or metrics. + Filter filter = 4; + } +} + +// A list of filter expressions. +message FilterExpressionList { + // A list of filter expressions. + repeated FilterExpression expressions = 1; +} + +// An expression to filter dimension or metric values. +message Filter { + // The filter for string + message StringFilter { + // The match type of a string filter + enum MatchType { + // Unspecified + MATCH_TYPE_UNSPECIFIED = 0; + + // Exact match of the string value. + EXACT = 1; + + // Begins with the string value. + BEGINS_WITH = 2; + + // Ends with the string value. + ENDS_WITH = 3; + + // Contains the string value. + CONTAINS = 4; + + // Full regular expression match with the string value. + FULL_REGEXP = 5; + + // Partial regular expression match with the string value. + PARTIAL_REGEXP = 6; + } + + // The match type for this filter. + MatchType match_type = 1; + + // The string value used for the matching. + string value = 2; + + // If true, the string value is case sensitive. + bool case_sensitive = 3; + } + + // The result needs to be in a list of string values. + message InListFilter { + // The list of string values. + // Must be non-empty. + repeated string values = 1; + + // If true, the string value is case sensitive. + bool case_sensitive = 2; + } + + // Filters for numeric or date values. + message NumericFilter { + // The operation applied to a numeric filter + enum Operation { + // Unspecified. + OPERATION_UNSPECIFIED = 0; + + // Equal + EQUAL = 1; + + // Less than + LESS_THAN = 2; + + // Less than or equal + LESS_THAN_OR_EQUAL = 3; + + // Greater than + GREATER_THAN = 4; + + // Greater than or equal + GREATER_THAN_OR_EQUAL = 5; + } + + // The operation type for this filter. + Operation operation = 1; + + // A numeric value or a date value. + NumericValue value = 2; + } + + // To express that the result needs to be between two numbers (inclusive). + message BetweenFilter { + // Begins with this number. + NumericValue from_value = 1; + + // Ends with this number. + NumericValue to_value = 2; + } + + // The dimension name or metric name. Must be a name defined in dimensions + // or metrics. + string field_name = 1; + + // Specify one type of filter for `Filter`. + oneof one_filter { + // A filter for null values. + bool null_filter = 2; + + // Strings related filter. + StringFilter string_filter = 3; + + // A filter for in list values. + InListFilter in_list_filter = 4; + + // A filter for numeric or date values. + NumericFilter numeric_filter = 5; + + // A filter for two values. + BetweenFilter between_filter = 6; + } +} + +// The sort options. +message OrderBy { + // Sorts by metric values. + message MetricOrderBy { + // A metric name in the request to order by. + string metric_name = 1; + } + + // Sorts by dimension values. + message DimensionOrderBy { + // Rule to order the string dimension values by. + enum OrderType { + // Unspecified. + ORDER_TYPE_UNSPECIFIED = 0; + + // Alphanumeric sort by Unicode code point. For example, "2" < "A" < "X" < + // "b" < "z". + ALPHANUMERIC = 1; + + // Case insensitive alphanumeric sort by lower case Unicode code point. + // For example, "2" < "A" < "b" < "X" < "z". + CASE_INSENSITIVE_ALPHANUMERIC = 2; + + // Dimension values are converted to numbers before sorting. For example + // in NUMERIC sort, "25" < "100", and in `ALPHANUMERIC` sort, "100" < + // "25". Non-numeric dimension values all have equal ordering value below + // all numeric values. + NUMERIC = 3; + } + + // A dimension name in the request to order by. + string dimension_name = 1; + + // Controls the rule for dimension value ordering. + OrderType order_type = 2; + } + + // Sorts by a pivot column group. + message PivotOrderBy { + // A pair of dimension names and values. Rows with this dimension pivot pair + // are ordered by the metric's value. + // + // For example if pivots = {{"browser", "Chrome"}} and + // metric_name = "Sessions", + // then the rows will be sorted based on Sessions in Chrome. + // + // ---------|----------|----------------|----------|---------------- + // | Chrome | Chrome | Safari | Safari + // ---------|----------|----------------|----------|---------------- + // Country | Sessions | Pages/Sessions | Sessions | Pages/Sessions + // ---------|----------|----------------|----------|---------------- + // US | 2 | 2 | 3 | 1 + // ---------|----------|----------------|----------|---------------- + // Canada | 3 | 1 | 4 | 1 + // ---------|----------|----------------|----------|---------------- + message PivotSelection { + // Must be a dimension name from the request. + string dimension_name = 1; + + // Order by only when the named dimension is this value. + string dimension_value = 2; + } + + // In the response to order by, order rows by this column. Must be a metric + // name from the request. + string metric_name = 1; + + // Used to select a dimension name and value pivot. If multiple pivot + // selections are given, the sort occurs on rows where all pivot selection + // dimension name and value pairs match the row's dimension name and value + // pair. + repeated PivotSelection pivot_selections = 2; + } + + // Specify one type of order by for `OrderBy`. + oneof one_order_by { + // Sorts results by a metric's values. + MetricOrderBy metric = 1; + + // Sorts results by a dimension's values. + DimensionOrderBy dimension = 2; + + // Sorts results by a metric's values within a pivot column group. + PivotOrderBy pivot = 3; + } + + // If true, sorts by descending order. + bool desc = 4; +} + +// Describes the visible dimension columns and rows in the report response. +message Pivot { + // Dimension names for visible columns in the report response. Including + // "dateRange" produces a date range column; for each row in the response, + // dimension values in the date range column will indicate the corresponding + // date range from the request. + repeated string field_names = 1; + + // Specifies how dimensions are ordered in the pivot. In the first Pivot, the + // OrderBys determine Row and DimensionHeader ordering; in subsequent Pivots, + // the OrderBys determine only DimensionHeader ordering. Dimensions specified + // in these OrderBys must be a subset of Pivot.field_names. + repeated OrderBy order_bys = 2; + + // The row count of the start row. The first row is counted as row 0. + int64 offset = 3; + + // The number of rows to return in this pivot. + // If zero or unspecified, all rows are returned. + int64 limit = 4; + + // Aggregate the metrics by dimensions in this pivot using the specified + // metric_aggregations. + repeated MetricAggregation metric_aggregations = 5; +} + +// Specification for a cohort report. +message CohortSpec { + // The definition for the cohorts. + repeated Cohort cohorts = 1; + + // The data ranges of cohorts. + CohortsRange cohorts_range = 2; + + // Settings of a cohort report. + CohortReportSettings cohort_report_settings = 3; +} + +// Defines a cohort. A cohort is a group of users who share a common +// characteristic. For example, all users with the same acquisition date +// belong to the same cohort. +message Cohort { + // Assigns a name to this cohort. The dimension `cohort` is valued to this + // name in a report response. If not set, a cohort is named the empty string. + string name = 1; + + // The dimension used by cohort. Only supports `firstTouchDate` for retention + // report. + string dimension = 2; + + // The cohort selects users whose first visit date is between start date + // and end date defined in the date_range. The date range should be aligned + // with the cohort's granularity. + // If CohortsRange uses daily granularity, the date range can be aligned to + // any day. + // If CohortsRange uses weekly granularity, the date range should be aligned + // to the week boundary, starting at Sunday and ending Saturday. If + // CohortsRange uses monthly granularity, the date range should be aligned to + // the month, starting at the first and ending on the last day of the month. + DateRange date_range = 3; +} + +// Settings of a cohort report. +message CohortReportSettings { + // If true, accumulates the result from first visit day to the end day. + bool accumulate = 1; + + // If true, the report is for lifetime value report and should pivot on user + // event. + bool pivot_on_user_event = 2; + + // If some values are missing while computing ratios, we want to compute the + // ratios only based on non-missing values. + // This field should be set to true only for a totals request. + bool missing_value_as_zero = 4; +} + +// Describes date range for a cohort report. +message CohortsRange { + // Reporting granularity for the cohorts. + enum Granularity { + // Unspecified. + GRANULARITY_UNSPECIFIED = 0; + + // Daily + DAILY = 1; + + // Weekly + WEEKLY = 2; + + // Monthly + MONTHLY = 3; + } + + // Reporting date range for each cohort is calculated based on these three + // fields. + Granularity granularity = 1; + + // For daily cohorts, this will be the start day offset. + // For weekly cohorts, this will be the week offset. + int32 start_offset = 2; + + // For daily cohorts, this will be the end day offset. + // For weekly cohorts, this will be the week offset. + int32 end_offset = 3; +} + +// Response's metadata carrying additional information about the report content. +message ResponseMetaData { + // If true, indicates some buckets of dimension combinations are rolled into + // "(other)" row. This can happen for high cardinality reports. + bool data_loss_from_other_row = 3; +} + +// Describes the metric column in the report. +message MetricHeader { + // Metric name. + string name = 1; + + // Metric data type. + MetricType type = 2; +} + +// Dimensions' values in a pivot. +message PivotHeader { + // The size is the same as the cardinality of the corresponding dimension + // combinations. + repeated DimensionHeader dimension_headers = 1; + + // The cardinality of the pivot as if offset = 0 and limit = -1. + int32 row_count = 2; +} + +// The header for the dimensions. +message DimensionHeader { + // Values of multiple dimensions in a pivot. + repeated DimensionValue dimension_values = 1; +} + +// Report data for each row. +// For example if RunReportRequest contains: +// +// ```none +// dimensions { +// name: "eventName" +// } +// dimensions { +// name: "countryId" +// } +// metrics { +// name: "eventCount" +// } +// ``` +// +// One row with 'in_app_purchase' as the eventName, 'us' as the countryId, and +// 15 as the eventCount, would be: +// +// ```none +// dimension_values { +// name: 'in_app_purchase' +// name: 'us' +// } +// metric_values { +// int64_value: 15 +// } +// ``` +message Row { + // List of requested dimension values. In a PivotReport, dimension_values + // are only listed for dimensions included in a pivot. + repeated DimensionValue dimension_values = 1; + + // List of requested visible metric values. + repeated MetricValue metric_values = 2; +} + +// The value of a dimension. +message DimensionValue { + // One kind of dimension value + oneof one_value { + // Value as a string if the dimension type is a string. + string value = 1; + } +} + +// The value of a metric. +message MetricValue { + // One of metric value + oneof one_value { + // Measurement value. See MetricHeader for type. + string value = 4; + } +} + +// To represent a number. +message NumericValue { + // One of a numeric value + oneof one_value { + // Integer value + int64 int64_value = 1; + + // Double value + double double_value = 2; + } +} + +// Current state of all quotas for this Analytics Property. If any quota for a +// property is exhausted, all requests to that property will return Resource +// Exhausted errors. +message PropertyQuota { + // Analytics Properties can use up to 25,000 tokens per day. Most requests + // consume fewer than 10 tokens. + QuotaStatus tokens_per_day = 1; + + // Analytics Properties can use up to 5,000 tokens per day. An API request + // consumes a single number of tokens, and that number is deducted from both + // the hourly and daily quotas. + QuotaStatus tokens_per_hour = 2; + + // Analytics Properties can send up to 10 concurrent requests. + QuotaStatus concurrent_requests = 3; + + // Analytics Properties and cloud project pairs can have up to 10 + // server errors per hour. + QuotaStatus server_errors_per_project_per_hour = 4; +} + +// Current state for a particular quota group. +message QuotaStatus { + // Quota consumed by this request. + int32 consumed = 1; + + // Quota remaining after this request. + int32 remaining = 2; +} + +// Represents aggregation of metrics. +enum MetricAggregation { + // Unspecified operator. + METRIC_AGGREGATION_UNSPECIFIED = 0; + + // SUM operator. + TOTAL = 1; + + // Minimum operator. + MINIMUM = 5; + + // Maximum operator. + MAXIMUM = 6; + + // Count operator. + COUNT = 4; +} + +// Type of a metric value. +enum MetricType { + // Unspecified type. + METRIC_TYPE_UNSPECIFIED = 0; + + // Integer type. + TYPE_INTEGER = 1; + + // Floating point type. + TYPE_FLOAT = 2; +} diff --git a/google/analytics/management/v1alpha/BUILD.bazel b/google/analytics/management/v1alpha/BUILD.bazel index f1bd991eb..a37a33024 100644 --- a/google/analytics/management/v1alpha/BUILD.bazel +++ b/google/analytics/management/v1alpha/BUILD.bazel @@ -261,7 +261,7 @@ load( nodejs_gapic_library( name = "management_nodejs_gapic", src = ":management_proto_with_info", - gapic_yaml = "analyticsmanagement_gapic.yaml", + grpc_service_config = "management_grpc_service_config.json", package = "google.analytics.management.v1alpha", service_yaml = "analyticsmanagement_v1alpha.yaml", deps = [], diff --git a/google/api/auth.proto b/google/api/auth.proto index 1b187cb49..b1f7d5016 100644 --- a/google/api/auth.proto +++ b/google/api/auth.proto @@ -127,11 +127,15 @@ message AuthProvider { // The list of JWT // [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). // that are allowed to access. A JWT containing any of these audiences will - // be accepted. When this setting is absent, only JWTs with audience - // "https://[Service_name][google.api.Service.name]/[API_name][google.protobuf.Api.name]" - // will be accepted. For example, if no audiences are in the setting, - // LibraryService API will only accept JWTs with the following audience - // "https://library-example.googleapis.com/google.example.library.v1.LibraryService". + // be accepted. When this setting is absent, JWTs with audiences: + // - "https://[service.name]/[google.protobuf.Api.name]" + // - "https://[service.name]/" + // will be accepted. + // For example, if no audiences are in the setting, LibraryService API will + // accept JWTs with the following audiences: + // - + // https://library-example.googleapis.com/google.example.library.v1.LibraryService + // - https://library-example.googleapis.com/ // // Example: // diff --git a/google/api/backend.proto b/google/api/backend.proto index 2dbaa30a7..729bccdbc 100644 --- a/google/api/backend.proto +++ b/google/api/backend.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; diff --git a/google/api/billing.proto b/google/api/billing.proto index 87c11e7ff..8e70388cf 100644 --- a/google/api/billing.proto +++ b/google/api/billing.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; @@ -28,22 +27,33 @@ option objc_class_prefix = "GAPI"; // Billing related configuration of the service. // // The following example shows how to configure monitored resources and metrics -// for billing: +// for billing, `consumer_destinations` is the only supported destination and +// the monitored resources need at least one label key +// `cloud.googleapis.com/location` to indicate the location of the billing +// usage, using different monitored resources between monitoring and billing is +// recommended so they can be evolved independently: +// // // monitored_resources: -// - type: library.googleapis.com/branch +// - type: library.googleapis.com/billing_branch // labels: -// - key: /city -// description: The city where the library branch is located in. -// - key: /name -// description: The name of the branch. +// - key: cloud.googleapis.com/location +// description: | +// Predefined label to support billing location restriction. +// - key: city +// description: | +// Custom label to define the city where the library branch is located +// in. +// - key: name +// description: Custom label to define the name of the library branch. // metrics: // - name: library.googleapis.com/book/borrowed_count // metric_kind: DELTA // value_type: INT64 +// unit: "1" // billing: // consumer_destinations: -// - monitored_resource: library.googleapis.com/branch +// - monitored_resource: library.googleapis.com/billing_branch // metrics: // - library.googleapis.com/book/borrowed_count message Billing { diff --git a/google/api/client.proto b/google/api/client.proto index 56f8664aa..2102623d3 100644 --- a/google/api/client.proto +++ b/google/api/client.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; diff --git a/google/api/config_change.proto b/google/api/config_change.proto index c36764a5a..953bb131c 100644 --- a/google/api/config_change.proto +++ b/google/api/config_change.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; diff --git a/google/api/context.proto b/google/api/context.proto index 2d330f6f2..f05e2389c 100644 --- a/google/api/context.proto +++ b/google/api/context.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; diff --git a/google/api/control.proto b/google/api/control.proto index e769f9783..9fdc8815f 100644 --- a/google/api/control.proto +++ b/google/api/control.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; diff --git a/google/api/distribution.proto b/google/api/distribution.proto index ee45d9dcd..4f0dec885 100644 --- a/google/api/distribution.proto +++ b/google/api/distribution.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; diff --git a/google/api/documentation.proto b/google/api/documentation.proto index 74cbf67e9..2334b5251 100644 --- a/google/api/documentation.proto +++ b/google/api/documentation.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; @@ -94,6 +93,12 @@ message Documentation { // The URL to the root of documentation. string documentation_root_url = 4; + // Specifies the service root url if the default one (the service name + // from the yaml file) is not suitable. This can be seen in any fully + // specified service urls as well as sections that show a base that other + // urls are relative to. + string service_root_url = 6; + // Declares a single overview page. For example: //
documentation:
   //   summary: ...
diff --git a/google/api/endpoint.proto b/google/api/endpoint.proto
index 2077334d2..6843a887b 100644
--- a/google/api/endpoint.proto
+++ b/google/api/endpoint.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -50,9 +49,6 @@ message Endpoint {
   // Additional names that this endpoint will be hosted on.
   repeated string aliases = 2 [deprecated = true];
 
-  // The list of features enabled on this endpoint.
-  repeated string features = 4;
-
   // The specification of an Internet routable address of API frontend that will
   // handle requests to this [API
   // Endpoint](https://cloud.google.com/apis/design/glossary). It should be
diff --git a/google/api/field_behavior.proto b/google/api/field_behavior.proto
index eb7f78ef1..aa7127bf8 100644
--- a/google/api/field_behavior.proto
+++ b/google/api/field_behavior.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/http.proto b/google/api/http.proto
index b2977f514..69460cf79 100644
--- a/google/api/http.proto
+++ b/google/api/http.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/httpbody.proto b/google/api/httpbody.proto
index 45c1e76b1..1a5bb78be 100644
--- a/google/api/httpbody.proto
+++ b/google/api/httpbody.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/label.proto b/google/api/label.proto
index 668efd1c6..62f6cfa21 100644
--- a/google/api/label.proto
+++ b/google/api/label.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/launch_stage.proto b/google/api/launch_stage.proto
index 55fd91424..7d33eaa54 100644
--- a/google/api/launch_stage.proto
+++ b/google/api/launch_stage.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -29,6 +28,12 @@ enum LaunchStage {
   // Do not use this default value.
   LAUNCH_STAGE_UNSPECIFIED = 0;
 
+  // The feature is not yet implemented. Users can not use it.
+  UNIMPLEMENTED = 6;
+
+  // Prelaunch features are hidden from users and are only visible internally.
+  PRELAUNCH = 7;
+
   // Early Access features are limited to a closed group of testers. To use
   // these features, you must sign up in advance and sign a Trusted Tester
   // agreement (which includes confidentiality provisions). These features may
diff --git a/google/api/log.proto b/google/api/log.proto
index 1125e1fe3..12e8c1cbf 100644
--- a/google/api/log.proto
+++ b/google/api/log.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/logging.proto b/google/api/logging.proto
index 9090b2a1c..e9ae9bf89 100644
--- a/google/api/logging.proto
+++ b/google/api/logging.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/metric.proto b/google/api/metric.proto
index a200d48be..942493f73 100644
--- a/google/api/metric.proto
+++ b/google/api/metric.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -30,11 +29,22 @@ option objc_class_prefix = "GAPI";
 // Defines a metric type and its schema. Once a metric descriptor is created,
 // deleting or altering it stops data collection and makes the metric type's
 // existing data unusable.
+//
+// The following are specific rules for service defined Monitoring metric
+// descriptors:
+//
+// * `type`, `metric_kind`, `value_type`, `description`, `display_name`,
+//   `launch_stage` fields are all required. The `unit` field must be specified
+//   if the `value_type` is any of DOUBLE, INT64, DISTRIBUTION.
+// * Maximum of default 500 metric descriptors per service is allowed.
+// * Maximum of default 10 labels per metric descriptor is allowed.
+//
+// The default maximum limit can be overridden. Please follow
+// https://cloud.google.com/monitoring/quotas
 message MetricDescriptor {
   // Additional annotations that can be used to guide the usage of a metric.
   message MetricDescriptorMetadata {
-    // Deprecated. Please use the MetricDescriptor.launch_stage instead.
-    // The launch stage of the metric definition.
+    // Deprecated. Must use the [MetricDescriptor.launch_stage][google.api.MetricDescriptor.launch_stage] instead.
     LaunchStage launch_stage = 1 [deprecated = true];
 
     // The sampling period of metric data points. For metrics which are written
@@ -98,9 +108,23 @@ message MetricDescriptor {
   string name = 1;
 
   // The metric type, including its DNS name prefix. The type is not
-  // URL-encoded.  All user-defined metric types have the DNS name
-  // `custom.googleapis.com` or `external.googleapis.com`.  Metric types should
-  // use a natural hierarchical grouping. For example:
+  // URL-encoded.
+  //
+  // All service defined metrics must be prefixed with the service name, in the
+  // format of `{service name}/{relative metric name}`, such as
+  // `cloudsql.googleapis.com/database/cpu/utilization`. The relative metric
+  // name must follow:
+  //
+  // * Only upper and lower-case letters, digits, '/' and underscores '_' are
+  //   allowed.
+  // * The maximum number of characters allowed for the relative_metric_name is
+  //   100.
+  //
+  // All user-defined metric types have the DNS name
+  // `custom.googleapis.com`, `external.googleapis.com`, or
+  // `logging.googleapis.com/user/`.
+  //
+  // Metric types should use a natural hierarchical grouping. For example:
   //
   //     "custom.googleapis.com/invoice/paid/amount"
   //     "external.googleapis.com/prometheus/up"
@@ -108,7 +132,16 @@ message MetricDescriptor {
   string type = 8;
 
   // The set of labels that can be used to describe a specific
-  // instance of this metric type. For example, the
+  // instance of this metric type.
+  //
+  // The label key name must follow:
+  //
+  // * Only upper and lower-case letters, digits and underscores (_) are
+  //   allowed.
+  // * Label name must start with a letter or digit.
+  // * The maximum length of a label name is 100 characters.
+  //
+  // For example, the
   // `appengine.googleapis.com/http/server/response_latencies` metric
   // type has a label for the HTTP response code, `response_code`, so
   // you can look at latencies for successful responses or just
@@ -138,7 +171,7 @@ message MetricDescriptor {
   // `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005
   // CPU-seconds, then the value is written as `12005`.
   //
-  // Alternatively, if you want a custome metric to record data in a more
+  // Alternatively, if you want a custom metric to record data in a more
   // granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is
   // `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`),
   // or use `Kis{CPU}` and write `11.723` (which is `12005/1024`).
@@ -154,6 +187,7 @@ message MetricDescriptor {
   // * `min`   minute
   // * `h`     hour
   // * `d`     day
+  // * `1`     dimensionless
   //
   // **Prefixes (PREFIX)**
   //
@@ -224,7 +258,6 @@ message MetricDescriptor {
   // * `10^2.%` indicates a metric contains a ratio, typically in the range
   //    0..1, that will be multiplied by 100 and displayed as a percentage
   //    (so a metric value `0.03` means "3 percent").
-  //
   string unit = 5;
 
   // A detailed description of the metric, which can be used in documentation.
@@ -241,6 +274,13 @@ message MetricDescriptor {
 
   // Optional. The launch stage of the metric definition.
   LaunchStage launch_stage = 12;
+
+  // Read-only. If present, then a [time
+  // series][google.monitoring.v3.TimeSeries], which is identified partially by
+  // a metric type and a [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor], that is associated
+  // with this metric type can only be associated with one of the monitored
+  // resource types listed here.
+  repeated string monitored_resource_types = 13;
 }
 
 // A specific metric, identified by specifying values for all of the
diff --git a/google/api/monitored_resource.proto b/google/api/monitored_resource.proto
index 2c94902a2..3cddbc5cb 100644
--- a/google/api/monitored_resource.proto
+++ b/google/api/monitored_resource.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -34,9 +33,24 @@ option objc_class_prefix = "GAPI";
 // `"gce_instance"` and specifies the use of the labels `"instance_id"` and
 // `"zone"` to identify particular VM instances.
 //
-// Different APIs can support different monitored resource types. APIs generally
-// provide a `list` method that returns the monitored resource descriptors used
-// by the API.
+// Different services can support different monitored resource types.
+//
+// The following are specific rules to service defined monitored resources for
+// Monitoring and Logging:
+//
+// * The `type`, `display_name`, `description`, `labels` and `launch_stage`
+//   fields are all required.
+// * The first label of the monitored resource descriptor must be
+//   `resource_container`. There are legacy monitored resource descritptors
+//   start with `project_id`.
+// * It must include a `location` label.
+// * Maximum of default 5 service defined monitored resource descriptors
+//   is allowed per service.
+// * Maximum of default 10 labels per monitored resource is allowed.
+//
+// The default maximum limit can be overridden. Please follow
+// https://cloud.google.com/monitoring/quotas
+//
 message MonitoredResourceDescriptor {
   // Optional. The resource name of the monitored resource descriptor:
   // `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where
@@ -47,8 +61,19 @@ message MonitoredResourceDescriptor {
   string name = 5;
 
   // Required. The monitored resource type. For example, the type
-  // `"cloudsql_database"` represents databases in Google Cloud SQL.
-  // The maximum length of this value is 256 characters.
+  // `cloudsql_database` represents databases in Google Cloud SQL.
+  //
+  // All service defined monitored resource types must be prefixed with the
+  // service name, in the format of `{service name}/{relative resource name}`.
+  // The relative resource name must follow:
+  //
+  // * Only upper and lower-case letters and digits are allowed.
+  // * It must start with upper case character and is recommended to use Upper
+  //   Camel Case style.
+  // * The maximum number of characters allowed for the relative_resource_name
+  //   is 100.
+  //
+  // Note there are legacy service monitored resources not following this rule.
   string type = 1;
 
   // Optional. A concise name for the monitored resource type that might be
@@ -62,8 +87,16 @@ message MonitoredResourceDescriptor {
   string description = 3;
 
   // Required. A set of labels used to describe instances of this monitored
-  // resource type. For example, an individual Google Cloud SQL database is
-  // identified by values for the labels `"database_id"` and `"zone"`.
+  // resource type.
+  // The label key name must follow:
+  //
+  // * Only upper and lower-case letters, digits and underscores (_) are
+  //   allowed.
+  // * Label name must start with a letter or digit.
+  // * The maximum length of a label name is 100 characters.
+  //
+  // For example, an individual Google Cloud SQL database is
+  // identified by values for the labels `database_id` and `location`.
   repeated LabelDescriptor labels = 4;
 
   // Optional. The launch stage of the monitored resource definition.
diff --git a/google/api/monitoring.proto b/google/api/monitoring.proto
index 07e962d1b..76f153bce 100644
--- a/google/api/monitoring.proto
+++ b/google/api/monitoring.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/quota.proto b/google/api/quota.proto
index 2e6e52b66..c9c789901 100644
--- a/google/api/quota.proto
+++ b/google/api/quota.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -150,10 +149,7 @@ message QuotaLimit {
   // Used by group-based quotas only.
   int64 free_tier = 7;
 
-  // Duration of this limit in textual notation. Example: "100s", "24h", "1d".
-  // For duration longer than a day, only multiple of days is supported. We
-  // support only "100s" and "1d" for now. Additional support will be added in
-  // the future. "0" indicates indefinite duration.
+  // Duration of this limit in textual notation. Must be "100s" or "1d".
   //
   // Used by group-based quotas only.
   string duration = 5;
diff --git a/google/api/resource.proto b/google/api/resource.proto
index 2a52e61aa..22611d243 100644
--- a/google/api/resource.proto
+++ b/google/api/resource.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -223,10 +222,14 @@ message ResourceDescriptor {
   //     }
   History history = 4;
 
-  // The plural name used in the resource name, such as 'projects' for
-  // the name of 'projects/{project}'. It is the same concept of the `plural`
-  // field in k8s CRD spec
+  // The plural name used in the resource name and permission names, such as
+  // 'projects' for the resource name of 'projects/{project}' and the permission
+  // name of 'cloudresourcemanager.googleapis.com/projects.get'. It is the same
+  // concept of the `plural` field in k8s CRD spec
   // https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
+  //
+  // Note: The plural form is required even for singleton resources. See
+  // https://aip.dev/156
   string plural = 5;
 
   // The same concept of the `singular` field in k8s CRD spec
@@ -247,6 +250,17 @@ message ResourceReference {
   //         type: "pubsub.googleapis.com/Topic"
   //       }];
   //     }
+  //
+  // Occasionally, a field may reference an arbitrary resource. In this case,
+  // APIs use the special value * in their resource reference.
+  //
+  // Example:
+  //
+  //     message GetIamPolicyRequest {
+  //       string resource = 2 [(google.api.resource_reference) = {
+  //         type: "*"
+  //       }];
+  //     }
   string type = 1;
 
   // The resource type of a child collection that the annotated field
diff --git a/google/api/service.proto b/google/api/service.proto
index c29eb5c89..ee65d99a6 100644
--- a/google/api/service.proto
+++ b/google/api/service.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -74,6 +73,7 @@ message Service {
   // The semantic version of the service configuration. The config version
   // affects the interpretation of the service configuration. For example,
   // certain features are enabled by default for certain config versions.
+  //
   // The latest config version is `3`.
   google.protobuf.UInt32Value config_version = 20;
 
@@ -84,8 +84,9 @@ message Service {
   string name = 1;
 
   // A unique ID for a specific instance of this message, typically assigned
-  // by the client for tracking purpose. If empty, the server may choose to
-  // generate one instead. Must be no longer than 60 characters.
+  // by the client for tracking purpose. Must be no longer than 63 characters
+  // and only lower case letters, digits, '.', '_' and '-' are allowed. If
+  // empty, the server may choose to generate one instead.
   string id = 33;
 
   // The product title for this service.
diff --git a/google/api/servicecontrol/v1/BUILD.bazel b/google/api/servicecontrol/v1/BUILD.bazel
index a9d2dd312..4b08c9a2f 100644
--- a/google/api/servicecontrol/v1/BUILD.bazel
+++ b/google/api/servicecontrol/v1/BUILD.bazel
@@ -21,9 +21,9 @@ proto_library(
     ],
     deps = [
         "//google/api:annotations_proto",
+        "//google/api:client_proto",
         "//google/logging/type:type_proto",
         "//google/rpc:status_proto",
-        "//google/type:money_proto",
         "@com_google_protobuf//:any_proto",
         "@com_google_protobuf//:struct_proto",
         "@com_google_protobuf//:timestamp_proto",
@@ -33,6 +33,7 @@ proto_library(
 ##############################################################################
 # C++
 ##############################################################################
+# Put your C++ code here
 load("@com_google_googleapis_imports//:imports.bzl", "cc_proto_library")
 
 cc_proto_library(
diff --git a/google/api/servicecontrol/v1/check_error.proto b/google/api/servicecontrol/v1/check_error.proto
index de3969d2f..74b9db6d8 100644
--- a/google/api/servicecontrol/v1/check_error.proto
+++ b/google/api/servicecontrol/v1/check_error.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@ syntax = "proto3";
 
 package google.api.servicecontrol.v1;
 
-import "google/api/annotations.proto";
+import "google/rpc/status.proto";
 
 option cc_enable_arenas = true;
 option go_package = "google.golang.org/genproto/googleapis/api/servicecontrol/v1;servicecontrol";
@@ -33,19 +33,19 @@ message CheckError {
     ERROR_CODE_UNSPECIFIED = 0;
 
     // The consumer's project id, network container, or resource container was
-    // not found. Same as [google.rpc.Code.NOT_FOUND][].
+    // not found. Same as
+    // [google.rpc.Code.NOT_FOUND][google.rpc.Code.NOT_FOUND].
     NOT_FOUND = 5;
 
     // The consumer doesn't have access to the specified resource.
-    // Same as [google.rpc.Code.PERMISSION_DENIED][].
+    // Same as
+    // [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED].
     PERMISSION_DENIED = 7;
 
-    // Quota check failed. Same as [google.rpc.Code.RESOURCE_EXHAUSTED][].
+    // Quota check failed. Same as
+    // [google.rpc.Code.RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED].
     RESOURCE_EXHAUSTED = 8;
 
-    // The consumer has been flagged as an abuser.
-    ABUSER_DETECTED = 103;
-
     // The consumer hasn't activated the service.
     SERVICE_NOT_ACTIVATED = 104;
 
@@ -58,6 +58,10 @@ message CheckError {
     // The consumer's project number or id does not represent a valid project.
     PROJECT_INVALID = 114;
 
+    // The input consumer info does not represent a valid consumer folder or
+    // organization.
+    CONSUMER_INVALID = 125;
+
     // The IP address of the consumer is invalid for the specific consumer
     // project.
     IP_ADDRESS_BLOCKED = 109;
@@ -83,26 +87,9 @@ message CheckError {
     // The consumer's API Key was not found in config record.
     API_KEY_NOT_FOUND = 113;
 
-    // Request is not allowed as per security policies defined in Org Policy.
-    SECURITY_POLICY_VIOLATED = 121;
-
     // The credential in the request can not be verified.
     INVALID_CREDENTIAL = 123;
 
-    // Request is not allowed as per location policies defined in Org Policy.
-    LOCATION_POLICY_VIOLATED = 124;
-
-    // The input consumer info does not represent a valid consumer folder or
-    // organization.
-    CONSUMER_INVALID = 125;
-
-    // NOTE: By convention, all *_UNAVAILABLE codes are required to be in the
-    // 300 - 399 range.
-
-    // NOTE: Unless there are very special business requirements, service
-    // producer should ignore the following errors. These errors should not
-    // cause the rejection of client requests.
-
     // The backend server for looking up project id/number is unavailable.
     NAMESPACE_LOOKUP_UNAVAILABLE = 300;
 
@@ -112,22 +99,26 @@ message CheckError {
     // The backend server for checking billing status is unavailable.
     BILLING_STATUS_UNAVAILABLE = 302;
 
-    // The backend server for checking quota limits is unavailable.
-    QUOTA_CHECK_UNAVAILABLE = 303;
-
     // Cloud Resource Manager backend server is unavailable.
     CLOUD_RESOURCE_MANAGER_BACKEND_UNAVAILABLE = 305;
-
-    // Backend server for evaluating security policy is unavailable.
-    SECURITY_POLICY_BACKEND_UNAVAILABLE = 306;
-
-    // Backend server for evaluating location policy is unavailable.
-    LOCATION_POLICY_BACKEND_UNAVAILABLE = 307;
   }
 
   // The error code.
   Code code = 1;
 
+  // Subject to whom this error applies. See the specific code enum for more
+  // details on this field. For example:
+  //
+  // - "project:"
+  // - "folder:"
+  // - "organization:"
+  string subject = 4;
+
   // Free-form text providing details on the error cause of the error.
   string detail = 2;
+
+  // Contains public information about the check error. If available,
+  // `status.code` will be non zero and client can propagate it out as public
+  // error.
+  google.rpc.Status status = 3;
 }
diff --git a/google/api/servicecontrol/v1/log_entry.proto b/google/api/servicecontrol/v1/log_entry.proto
index 50b0fc468..5b41d3db8 100644
--- a/google/api/servicecontrol/v1/log_entry.proto
+++ b/google/api/servicecontrol/v1/log_entry.proto
@@ -16,7 +16,6 @@ syntax = "proto3";
 
 package google.api.servicecontrol.v1;
 
-import "google/api/annotations.proto";
 import "google/logging/type/log_severity.proto";
 import "google/protobuf/any.proto";
 import "google/protobuf/struct.proto";
diff --git a/google/api/servicecontrol/v1/metric_value.proto b/google/api/servicecontrol/v1/metric_value.proto
index 9a62ff698..a80b4253b 100644
--- a/google/api/servicecontrol/v1/metric_value.proto
+++ b/google/api/servicecontrol/v1/metric_value.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,10 +16,8 @@ syntax = "proto3";
 
 package google.api.servicecontrol.v1;
 
-import "google/api/annotations.proto";
 import "google/api/servicecontrol/v1/distribution.proto";
 import "google/protobuf/timestamp.proto";
-import "google/type/money.proto";
 
 option cc_enable_arenas = true;
 option go_package = "google.golang.org/genproto/googleapis/api/servicecontrol/v1;servicecontrol";
@@ -32,7 +30,8 @@ message MetricValue {
   // The labels describing the metric value.
   // See comments on
   // [google.api.servicecontrol.v1.Operation.labels][google.api.servicecontrol.v1.Operation.labels]
-  // for the overriding relationship.
+  // for the overriding relationship. Note that this map must not contain
+  // monitored resource labels.
   map labels = 1;
 
   // The start of the time period over which this metric value's measurement
diff --git a/google/api/servicecontrol/v1/operation.proto b/google/api/servicecontrol/v1/operation.proto
index 301f3575c..96cb63a56 100644
--- a/google/api/servicecontrol/v1/operation.proto
+++ b/google/api/servicecontrol/v1/operation.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@ syntax = "proto3";
 
 package google.api.servicecontrol.v1;
 
-import "google/api/annotations.proto";
 import "google/api/servicecontrol/v1/log_entry.proto";
 import "google/api/servicecontrol/v1/metric_value.proto";
 import "google/protobuf/timestamp.proto";
@@ -60,10 +59,13 @@ message Operation {
   // consumer, but not for service-initiated operations that are
   // not related to a specific consumer.
   //
-  // This can be in one of the following formats:
-  //   project:,
-  //   project_number:,
-  //   api_key:.
+  // - This can be in one of the following formats:
+  //     - project:PROJECT_ID,
+  //     - project`_`number:PROJECT_NUMBER,
+  //     - projects/PROJECT_ID or PROJECT_NUMBER,
+  //     - folders/FOLDER_NUMBER,
+  //     - organizations/ORGANIZATION_NUMBER,
+  //     - api`_`key:API_KEY.
   string consumer_id = 3;
 
   // Required. Start time of the operation.
@@ -90,7 +92,8 @@ message Operation {
   //     - `servicecontrol.googleapis.com/service_agent` describing the service
   //        used to handle the API request (e.g. ESP),
   //     - `servicecontrol.googleapis.com/platform` describing the platform
-  //        where the API is served (e.g. GAE, GCE, GKE).
+  //        where the API is served, such as App Engine, Compute Engine, or
+  //        Kubernetes Engine.
   map labels = 6;
 
   // Represents information about this operation. Each MetricValueSet
diff --git a/google/api/servicecontrol/v1/quota_controller.proto b/google/api/servicecontrol/v1/quota_controller.proto
index 808a73545..f704f85f4 100644
--- a/google/api/servicecontrol/v1/quota_controller.proto
+++ b/google/api/servicecontrol/v1/quota_controller.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -78,12 +78,18 @@ message QuotaOperation {
     // the service configuration or specified using the quota metrics. If the
     // amount is higher than the available quota, allocation error will be
     // returned and no quota will be allocated.
+    // If multiple quotas are part of the request, and one fails, none of the
+    // quotas are allocated or released.
     NORMAL = 1;
 
     // The operation allocates quota for the amount specified in the service
     // configuration or specified using the quota metrics. If the amount is
     // higher than the available quota, request does not fail but all available
     // quota will be allocated.
+    // For rate quota, BEST_EFFORT will continue to deduct from other groups
+    // even if one does not have enough quota. For allocation, it will find the
+    // minimum available amount across all groups and deduct that amount from
+    // all the affected groups.
     BEST_EFFORT = 2;
 
     // For AllocateQuota request, only checks if there is enough quota
@@ -96,16 +102,20 @@ message QuotaOperation {
   // of the service that generated the operation, and guarantees idempotency in
   // case of retries.
   //
-  // UUID version 4 is recommended, though not required. In scenarios where an
-  // operation is computed from existing information and an idempotent id is
-  // desirable for deduplication purpose, UUID version 5 is recommended. See
-  // RFC 4122 for details.
+  // In order to ensure best performance and latency in the Quota backends,
+  // operation_ids are optimally associated with time, so that related
+  // operations can be accessed fast in storage. For this reason, the
+  // recommended token for services that intend to operate at a high QPS is
+  // Unix time in nanos + UUID
   string operation_id = 1;
 
   // Fully qualified name of the API method for which this quota operation is
   // requested. This name is used for matching quota rules or metric rules and
-  // billing status rules defined in service configuration. This field is not
-  // required if the quota operation is performed on non-API resources.
+  // billing status rules defined in service configuration.
+  //
+  // This field should not be set if any of the following is true:
+  // (1) the quota operation is performed on non-API resources.
+  // (2) quota_metrics is set because the caller is doing quota override.
   //
   // Example of an RPC method name:
   //     google.example.library.v1.LibraryService.CreateShelf
@@ -132,6 +142,8 @@ message QuotaOperation {
   // label value combinations. If a request has such duplicated MetricValue
   // instances, the entire request is rejected with
   // an invalid argument error.
+  //
+  // This field is mutually exclusive with method_name.
   repeated MetricValueSet quota_metrics = 5;
 
   // Quota mode for this operation.
@@ -176,7 +188,8 @@ message QuotaError {
     UNSPECIFIED = 0;
 
     // Quota allocation failed.
-    // Same as [google.rpc.Code.RESOURCE_EXHAUSTED][].
+    // Same as
+    // [google.rpc.Code.RESOURCE_EXHAUSTED][google.rpc.Code.RESOURCE_EXHAUSTED].
     RESOURCE_EXHAUSTED = 8;
 
     // Consumer cannot access the service because the service requires active
diff --git a/google/api/servicecontrol/v1/service_controller.proto b/google/api/servicecontrol/v1/service_controller.proto
index 38f53ca06..de69ccf41 100644
--- a/google/api/servicecontrol/v1/service_controller.proto
+++ b/google/api/servicecontrol/v1/service_controller.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@ syntax = "proto3";
 package google.api.servicecontrol.v1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
 import "google/api/servicecontrol/v1/check_error.proto";
 import "google/api/servicecontrol/v1/operation.proto";
 import "google/rpc/status.proto";
@@ -33,20 +34,28 @@ option objc_class_prefix = "GASC";
 // Lets clients check and report operations against a [managed
 // service](https://cloud.google.com/service-management/reference/rpc/google.api/servicemanagement.v1#google.api.servicemanagement.v1.ManagedService).
 service ServiceController {
-  // Checks an operation with Google Service Control to decide whether
-  // the given operation should proceed. It should be called before the
-  // operation is executed.
+  option (google.api.default_host) = "servicecontrol.googleapis.com";
+  option (google.api.oauth_scopes) =
+      "https://www.googleapis.com/auth/cloud-platform,"
+      "https://www.googleapis.com/auth/servicecontrol";
+
+  // Checks whether an operation on a service should be allowed to proceed
+  // based on the configuration of the service and related policies. It must be
+  // called before the operation is executed.
   //
   // If feasible, the client should cache the check results and reuse them for
-  // 60 seconds. In case of server errors, the client can rely on the cached
-  // results for longer time.
+  // 60 seconds. In case of any server errors, the client should rely on the
+  // cached results for much longer time to avoid outage.
+  // WARNING: There is general 60s delay for the configuration and policy
+  // propagation, therefore callers MUST NOT depend on the `Check` method having
+  // the latest policy information.
   //
   // NOTE: the [CheckRequest][google.api.servicecontrol.v1.CheckRequest] has the
   // size limit of 64KB.
   //
   // This method requires the `servicemanagement.services.check` permission
   // on the specified service. For more information, see
-  // [Google Cloud IAM](https://cloud.google.com/iam).
+  // [Cloud IAM](https://cloud.google.com/iam).
   rpc Check(CheckRequest) returns (CheckResponse) {
     option (google.api.http) = {
       post: "/v1/services/{service_name}:check"
@@ -64,7 +73,7 @@ service ServiceController {
   // for business and compliance reasons.
   //
   // NOTE: the [ReportRequest][google.api.servicecontrol.v1.ReportRequest] has
-  // the size limit of 1MB.
+  // the size limit (wire-format byte size) of 1MB.
   //
   // This method requires the `servicemanagement.services.report` permission
   // on the specified service. For more information, see
@@ -100,16 +109,50 @@ message CheckRequest {
 
 // Response message for the Check method.
 message CheckResponse {
+  // Contains additional information about the check operation.
   message CheckInfo {
     // Consumer info of this check.
     ConsumerInfo consumer_info = 2;
   }
 
-  // `ConsumerInfo` provides information about the consumer project.
+  // `ConsumerInfo` provides information about the consumer.
   message ConsumerInfo {
+    // The type of the consumer as defined in
+    // [Google Resource Manager](https://cloud.google.com/resource-manager/).
+    enum ConsumerType {
+      // This is never used.
+      CONSUMER_TYPE_UNSPECIFIED = 0;
+
+      // The consumer is a Google Cloud Project.
+      PROJECT = 1;
+
+      // The consumer is a Google Cloud Folder.
+      FOLDER = 2;
+
+      // The consumer is a Google Cloud Organization.
+      ORGANIZATION = 3;
+
+      // Service-specific resource container which is defined by the service
+      // producer to offer their users the ability to manage service control
+      // functionalities at a finer level of granularity than the PROJECT.
+      SERVICE_SPECIFIC = 4;
+    }
+
     // The Google cloud project number, e.g. 1234567890. A value of 0 indicates
     // no project number is found.
+    //
+    // NOTE: This field is deprecated after Service Control support flexible
+    // consumer id. New code should not depend on this field anymore.
     int64 project_number = 1;
+
+    // The type of the consumer which should have been defined in
+    // [Google Resource Manager](https://cloud.google.com/resource-manager/).
+    ConsumerType type = 2;
+
+    // The consumer identity number, can be Google cloud project number, folder
+    // number or organization number e.g. 1234567890. A value of 0 indicates no
+    // consumer number is found.
+    int64 consumer_number = 3;
   }
 
   // The same operation_id value used in the
@@ -117,9 +160,6 @@ message CheckResponse {
   // and diagnostics purposes.
   string operation_id = 1;
 
-  // The current service rollout id used to process the request.
-  string service_rollout_id = 11;
-
   // Indicate the decision of the check.
   //
   // If no check errors are present, the service should process the operation.
@@ -130,6 +170,9 @@ message CheckResponse {
   // The actual config id used to process the request.
   string service_config_id = 5;
 
+  // The current service rollout id used to process the request.
+  string service_rollout_id = 11;
+
   // Feedback data returned from the server during processing a Check request.
   CheckInfo check_info = 6;
 }
@@ -151,8 +194,8 @@ message ReportRequest {
   // be used only when multiple operations are natually available at the time
   // of the report.
   //
-  // If multiple operations are in a single request, the total request size
-  // should be no larger than 1MB. See
+  // There is no limit on the number of operations in the same ReportRequest,
+  // however the ReportRequest size should be no larger than 1MB. See
   // [ReportResponse.report_errors][google.api.servicecontrol.v1.ReportResponse.report_errors]
   // for partial failure behavior.
   repeated Operation operations = 2;
diff --git a/google/api/servicemanagement/v1/BUILD.bazel b/google/api/servicemanagement/v1/BUILD.bazel
index 13cdb85a1..582da50ae 100644
--- a/google/api/servicemanagement/v1/BUILD.bazel
+++ b/google/api/servicemanagement/v1/BUILD.bazel
@@ -66,6 +66,7 @@ java_gapic_library(
     name = "servicemanagement_java_gapic",
     src = ":servicemanagement_proto_with_info",
     gapic_yaml = "servicemanagement_gapic.yaml",
+    grpc_service_config = "servicemanagement_grpc_service_config.json",
     package = "google.api.servicemanagement.v1",
     service_yaml = "servicemanagement_v1.yaml",
     test_deps = [
@@ -134,7 +135,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
     ],
 )
@@ -203,6 +203,7 @@ py_gapic_library(
     name = "servicemanagement_py_gapic",
     src = ":servicemanagement_proto_with_info",
     gapic_yaml = "servicemanagement_gapic.yaml",
+    grpc_service_config = "servicemanagement_grpc_service_config.json",
     package = "google.api.servicemanagement.v1",
     service_yaml = "servicemanagement_v1.yaml",
     deps = [
@@ -247,6 +248,7 @@ php_gapic_library(
     name = "servicemanagement_php_gapic",
     src = ":servicemanagement_proto_with_info",
     gapic_yaml = "servicemanagement_gapic.yaml",
+    grpc_service_config = "servicemanagement_grpc_service_config.json",
     package = "google.api.servicemanagement.v1",
     service_yaml = "servicemanagement_v1.yaml",
     deps = [
@@ -277,7 +279,7 @@ load(
 nodejs_gapic_library(
     name = "servicemanagement_nodejs_gapic",
     src = ":servicemanagement_proto_with_info",
-    gapic_yaml = "servicemanagement_gapic.yaml",
+    grpc_service_config = "servicemanagement_grpc_service_config.json",
     package = "google.api.servicemanagement.v1",
     service_yaml = "servicemanagement_v1.yaml",
     deps = [],
diff --git a/google/api/source_info.proto b/google/api/source_info.proto
index 5954143de..3174209b2 100644
--- a/google/api/source_info.proto
+++ b/google/api/source_info.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/system_parameter.proto b/google/api/system_parameter.proto
index 740a5538b..50d428d6e 100644
--- a/google/api/system_parameter.proto
+++ b/google/api/system_parameter.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/api/usage.proto b/google/api/usage.proto
index 6ab4e408c..14d34c44e 100644
--- a/google/api/usage.proto
+++ b/google/api/usage.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/bigtable/admin/v2/BUILD.bazel b/google/bigtable/admin/v2/BUILD.bazel
index 726ea842b..0607be7e8 100644
--- a/google/bigtable/admin/v2/BUILD.bazel
+++ b/google/bigtable/admin/v2/BUILD.bazel
@@ -135,7 +135,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -277,7 +276,7 @@ load(
 nodejs_gapic_library(
     name = "admin_nodejs_gapic",
     src = ":admin_proto_with_info",
-    gapic_yaml = "bigtableadmin_gapic.yaml",
+    grpc_service_config = "bigtableadmin_grpc_service_config.json",
     package = "google.bigtable.admin.v2",
     service_yaml = "bigtableadmin_v2.yaml",
     deps = [],
diff --git a/google/bigtable/admin/v2/bigtable_instance_admin.proto b/google/bigtable/admin/v2/bigtable_instance_admin.proto
index 8e05bfd0f..8b19b5582 100644
--- a/google/bigtable/admin/v2/bigtable_instance_admin.proto
+++ b/google/bigtable/admin/v2/bigtable_instance_admin.proto
@@ -35,6 +35,7 @@ option java_multiple_files = true;
 option java_outer_classname = "BigtableInstanceAdminProto";
 option java_package = "com.google.bigtable.admin.v2";
 option php_namespace = "Google\\Cloud\\Bigtable\\Admin\\V2";
+option ruby_package = "Google::Cloud::Bigtable::Admin::V2";
 
 // Service for creating, configuring, and deleting Cloud Bigtable Instances and
 // Clusters. Provides access to the Instance and Cluster schemas only, not the
diff --git a/google/bigtable/admin/v2/bigtable_table_admin.proto b/google/bigtable/admin/v2/bigtable_table_admin.proto
index 119ef73a4..6f434a473 100644
--- a/google/bigtable/admin/v2/bigtable_table_admin.proto
+++ b/google/bigtable/admin/v2/bigtable_table_admin.proto
@@ -36,6 +36,7 @@ option java_multiple_files = true;
 option java_outer_classname = "BigtableTableAdminProto";
 option java_package = "com.google.bigtable.admin.v2";
 option php_namespace = "Google\\Cloud\\Bigtable\\Admin\\V2";
+option ruby_package = "Google::Cloud::Bigtable::Admin::V2";
 
 // Service for creating, configuring, and deleting Cloud Bigtable tables.
 //
diff --git a/google/bigtable/admin/v2/common.proto b/google/bigtable/admin/v2/common.proto
index 89d24ea97..17c69d469 100644
--- a/google/bigtable/admin/v2/common.proto
+++ b/google/bigtable/admin/v2/common.proto
@@ -24,6 +24,7 @@ option java_multiple_files = true;
 option java_outer_classname = "CommonProto";
 option java_package = "com.google.bigtable.admin.v2";
 option php_namespace = "Google\\Cloud\\Bigtable\\Admin\\V2";
+option ruby_package = "Google::Cloud::Bigtable::Admin::V2";
 
 // Storage media types for persisting Bigtable data.
 enum StorageType {
diff --git a/google/bigtable/admin/v2/instance.proto b/google/bigtable/admin/v2/instance.proto
index e15f63ac0..2086f9707 100644
--- a/google/bigtable/admin/v2/instance.proto
+++ b/google/bigtable/admin/v2/instance.proto
@@ -27,6 +27,7 @@ option java_multiple_files = true;
 option java_outer_classname = "InstanceProto";
 option java_package = "com.google.bigtable.admin.v2";
 option php_namespace = "Google\\Cloud\\Bigtable\\Admin\\V2";
+option ruby_package = "Google::Cloud::Bigtable::Admin::V2";
 
 // A collection of Bigtable [Tables][google.bigtable.admin.v2.Table] and
 // the resources that serve them.
diff --git a/google/bigtable/admin/v2/table.proto b/google/bigtable/admin/v2/table.proto
index 535378989..e85ca8ca9 100644
--- a/google/bigtable/admin/v2/table.proto
+++ b/google/bigtable/admin/v2/table.proto
@@ -27,6 +27,7 @@ option java_multiple_files = true;
 option java_outer_classname = "TableProto";
 option java_package = "com.google.bigtable.admin.v2";
 option php_namespace = "Google\\Cloud\\Bigtable\\Admin\\V2";
+option ruby_package = "Google::Cloud::Bigtable::Admin::V2";
 
 // Indicates the type of the restore source.
 enum RestoreSourceType {
diff --git a/google/bigtable/v2/BUILD.bazel b/google/bigtable/v2/BUILD.bazel
index c60faf6d4..ad9e6fd86 100644
--- a/google/bigtable/v2/BUILD.bazel
+++ b/google/bigtable/v2/BUILD.bazel
@@ -254,7 +254,7 @@ load(
 nodejs_gapic_library(
     name = "bigtable_nodejs_gapic",
     src = ":bigtable_proto_with_info",
-    gapic_yaml = "bigtable_gapic.yaml",
+    grpc_service_config = "bigtable_grpc_service_config.json",
     package = "google.bigtable.v2",
     service_yaml = "bigtable_v2.yaml",
     deps = [],
diff --git a/google/bigtable/v2/bigtable.proto b/google/bigtable/v2/bigtable.proto
index c54225ed3..32aaba21d 100644
--- a/google/bigtable/v2/bigtable.proto
+++ b/google/bigtable/v2/bigtable.proto
@@ -30,6 +30,7 @@ option java_multiple_files = true;
 option java_outer_classname = "BigtableProto";
 option java_package = "com.google.bigtable.v2";
 option php_namespace = "Google\\Cloud\\Bigtable\\V2";
+option ruby_package = "Google::Cloud::Bigtable::V2";
 option (google.api.resource_definition) = {
   type: "bigtable.googleapis.com/Table"
   pattern: "projects/{project}/instances/{instance}/tables/{table}"
diff --git a/google/bigtable/v2/bigtable_gapic.yaml b/google/bigtable/v2/bigtable_gapic.yaml
index 792c288ca..04e9f5b37 100644
--- a/google/bigtable/v2/bigtable_gapic.yaml
+++ b/google/bigtable/v2/bigtable_gapic.yaml
@@ -70,21 +70,24 @@ interfaces:
     total_timeout_millis: 600000
   methods:
   - name: ReadRows
-    retry_codes_name: idempotent
+    # although ReadRows is idempotent, the retry logic requires complex resumption logic that should be handled manually at the client level
+    retry_codes_name: non_idempotent
     retry_params_name: read_rows_params
     timeout_millis: 43200000
   - name: SampleRowKeys
-    retry_codes_name: idempotent
-    retry_params_name: idempotent_params
-    timeout_millis: 20000
+    # although SampleRowKeys is idempotent, the retries should buffer and retry the entire stream as a whole, which should be handled manually at the client level
+    retry_codes_name: non_idempotent
+    retry_params_name: non_idempotent_params
+    timeout_millis: 60000
   - name: MutateRow
     retry_codes_name: idempotent
     retry_params_name: idempotent_params
-    timeout_millis: 20000
+    timeout_millis: 60000
   - name: MutateRows
-    retry_codes_name: idempotent
+    # although MutateRows is idempotent (if serverside timestamps are not used), retries should be more granular and occur for groups of failed entries handled manually at the client level
+    retry_codes_name: non_idempotent
     retry_params_name: mutate_rows_params
-    timeout_millis: 60000
+    timeout_millis: 600000
   - name: CheckAndMutateRow
     retry_codes_name: non_idempotent
     retry_params_name: non_idempotent_params
diff --git a/google/bigtable/v2/bigtable_grpc_service_config.json b/google/bigtable/v2/bigtable_grpc_service_config.json
index d6a182eb5..9ad691ecf 100755
--- a/google/bigtable/v2/bigtable_grpc_service_config.json
+++ b/google/bigtable/v2/bigtable_grpc_service_config.json
@@ -4,55 +4,53 @@
       "name": [
         {
           "service": "google.bigtable.v2.Bigtable",
-          "method": "ReadRows"
+          "method": "CheckAndMutateRow"
+        },
+        {
+          "service": "google.bigtable.v2.Bigtable",
+          "method": "ReadModifyWriteRow"
         }
       ],
-      "timeout": "43200s",
-      "retryPolicy": {
-        "maxAttempts": 5,
-        "initialBackoff": "0.010s",
-        "maxBackoff": "60s",
-        "backoffMultiplier": 2,
-        "retryableStatusCodes": [
-          "UNAVAILABLE",
-          "DEADLINE_EXCEEDED"
-        ]
-      }
+      "timeout": "20s"
     },
     {
       "name": [
         {
           "service": "google.bigtable.v2.Bigtable",
           "method": "SampleRowKeys"
-        },
+        }
+      ],
+      "timeout": "60s"
+    },
+    {
+      "name": [
         {
           "service": "google.bigtable.v2.Bigtable",
-          "method": "MutateRow"
+          "method": "MutateRows"
         }
       ],
-      "timeout": "20s",
-      "retryPolicy": {
-        "maxAttempts": 5,
-        "initialBackoff": "0.010s",
-        "maxBackoff": "60s",
-        "backoffMultiplier": 2,
-        "retryableStatusCodes": [
-          "UNAVAILABLE",
-          "DEADLINE_EXCEEDED"
-        ]
-      }
+      "timeout": "600s"
     },
     {
       "name": [
         {
           "service": "google.bigtable.v2.Bigtable",
-          "method": "MutateRows"
+          "method": "ReadRows"
+        }
+      ],
+      "timeout": "43200s"
+    },
+    {
+      "name": [
+        {
+          "service": "google.bigtable.v2.Bigtable",
+          "method": "MutateRow"
         }
       ],
       "timeout": "60s",
       "retryPolicy": {
-        "maxAttempts": 5,
         "initialBackoff": "0.010s",
+        "maxAttempts": 5,
         "maxBackoff": "60s",
         "backoffMultiplier": 2,
         "retryableStatusCodes": [
@@ -60,19 +58,6 @@
           "DEADLINE_EXCEEDED"
         ]
       }
-    },
-    {
-      "name": [
-        {
-          "service": "google.bigtable.v2.Bigtable",
-          "method": "CheckAndMutateRow"
-        },
-        {
-          "service": "google.bigtable.v2.Bigtable",
-          "method": "ReadModifyWriteRow"
-        }
-      ],
-      "timeout": "20s"
     }
   ]
 }
diff --git a/google/bigtable/v2/data.proto b/google/bigtable/v2/data.proto
index 8fd0c15cb..2cc916454 100644
--- a/google/bigtable/v2/data.proto
+++ b/google/bigtable/v2/data.proto
@@ -23,6 +23,7 @@ option java_multiple_files = true;
 option java_outer_classname = "DataProto";
 option java_package = "com.google.bigtable.v2";
 option php_namespace = "Google\\Cloud\\Bigtable\\V2";
+option ruby_package = "Google::Cloud::Bigtable::V2";
 
 // Specifies the complete (requested) contents of a single row of a table.
 // Rows which exceed 256MiB in size cannot be read in full.
diff --git a/google/chromeos/moblab/v1beta1/BUILD.bazel b/google/chromeos/moblab/v1beta1/BUILD.bazel
index 03f5ca267..5f689b681 100644
--- a/google/chromeos/moblab/v1beta1/BUILD.bazel
+++ b/google/chromeos/moblab/v1beta1/BUILD.bazel
@@ -123,7 +123,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -260,7 +259,7 @@ load(
 nodejs_gapic_library(
     name = "moblab_nodejs_gapic",
     src = ":moblab_proto_with_info",
-    gapic_yaml = "chromeosmoblab_gapic.yaml",
+    grpc_service_config = "moblab_grpc_service_config.json",
     package = "google.chromeos.moblab.v1beta1",
     service_yaml = "chromeosmoblab_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/accessapproval/v1/BUILD.bazel b/google/cloud/accessapproval/v1/BUILD.bazel
index 8d4858977..71d7b80c6 100644
--- a/google/cloud/accessapproval/v1/BUILD.bazel
+++ b/google/cloud/accessapproval/v1/BUILD.bazel
@@ -252,7 +252,7 @@ load(
 nodejs_gapic_library(
     name = "accessapproval_nodejs_gapic",
     src = ":accessapproval_proto_with_info",
-    gapic_yaml = "accessapproval_gapic.yaml",
+    grpc_service_config = None,
     package = "google.cloud.accessapproval.v1",
     service_yaml = "accessapproval_v1.yaml",
     deps = [],
diff --git a/google/cloud/asset/v1/BUILD.bazel b/google/cloud/asset/v1/BUILD.bazel
index ef733e6d2..a081dffaa 100644
--- a/google/cloud/asset/v1/BUILD.bazel
+++ b/google/cloud/asset/v1/BUILD.bazel
@@ -24,8 +24,10 @@ proto_library(
         "//google/iam/v1:policy_proto",
         "//google/identity/accesscontextmanager/v1:accesscontextmanager_proto",
         "//google/longrunning:operations_proto",
+        "//google/rpc:code_proto",
         "//google/type:expr_proto",
         "@com_google_protobuf//:any_proto",
+        "@com_google_protobuf//:duration_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
         "@com_google_protobuf//:struct_proto",
@@ -121,6 +123,7 @@ go_proto_library(
         "//google/iam/v1:iam_go_proto",
         "//google/identity/accesscontextmanager/v1:accesscontextmanager_go_proto",
         "//google/longrunning:longrunning_go_proto",
+        "//google/rpc:code_go_proto",
         "//google/type:expr_go_proto",
     ],
 )
@@ -137,8 +140,8 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
+        "@io_bazel_rules_go//proto/wkt:duration_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
 )
@@ -184,8 +187,10 @@ moved_proto_library(
         "//google/iam/v1:policy_proto",
         "//google/identity/accesscontextmanager/v1:accesscontextmanager_proto",
         "//google/longrunning:operations_proto",
+        "//google/rpc:code_proto",
         "//google/type:expr_proto",
         "@com_google_protobuf//:any_proto",
+        "@com_google_protobuf//:duration_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
         "@com_google_protobuf//:struct_proto",
@@ -283,7 +288,7 @@ load(
 nodejs_gapic_library(
     name = "asset_nodejs_gapic",
     src = ":asset_proto_with_info",
-    gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1",
     service_yaml = "cloudasset_v1.yaml",
     deps = [],
diff --git a/google/cloud/asset/v1/asset_service.proto b/google/cloud/asset/v1/asset_service.proto
index 0eab6efdd..db3ca4123 100644
--- a/google/cloud/asset/v1/asset_service.proto
+++ b/google/cloud/asset/v1/asset_service.proto
@@ -22,6 +22,7 @@ import "google/api/field_behavior.proto";
 import "google/api/resource.proto";
 import "google/cloud/asset/v1/assets.proto";
 import "google/longrunning/operations.proto";
+import "google/protobuf/duration.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
 import "google/protobuf/timestamp.proto";
@@ -41,10 +42,16 @@ service AssetService {
       "https://www.googleapis.com/auth/cloud-platform";
 
   // Exports assets with time and resource types to a given Cloud Storage
-  // location. The output format is newline-delimited JSON.
-  // This API implements the
-  // [google.longrunning.Operation][google.longrunning.Operation] API allowing
-  // you to keep track of the export.
+  // location/BigQuery table. For Cloud Storage location destinations, the
+  // output format is newline-delimited JSON. Each line represents a
+  // [google.cloud.asset.v1.Asset][google.cloud.asset.v1.Asset] in the JSON
+  // format; for BigQuery table destinations, the output table stores the fields
+  // in asset proto as columns. This API implements the
+  // [google.longrunning.Operation][google.longrunning.Operation] API , which
+  // allows you to keep track of the export. We recommend intervals of at least
+  // 2 seconds with exponential retry to poll the export operation result. For
+  // regular-size resource parent, the export operation usually finishes within
+  // 5 minutes.
   rpc ExportAssets(ExportAssetsRequest) returns (google.longrunning.Operation) {
     option (google.api.http) = {
       post: "/v1/{parent=*/*}:exportAssets"
@@ -57,10 +64,10 @@ service AssetService {
   }
 
   // Batch gets the update history of assets that overlap a time window.
-  // For RESOURCE content, this API outputs history with asset in both
-  // non-delete or deleted status.
   // For IAM_POLICY content, this API outputs history when the asset and its
   // attached IAM POLICY both exist. This can create gaps in the output history.
+  // Otherwise, this API outputs history with asset in both non-delete or
+  // deleted status.
   // If a specified asset does not exist, this API returns an INVALID_ARGUMENT
   // error.
   rpc BatchGetAssetsHistory(BatchGetAssetsHistoryRequest)
@@ -158,7 +165,7 @@ message ExportAssetsRequest {
   // running the same query may get different results.
   google.protobuf.Timestamp read_time = 2;
 
-  // A list of asset types of which to take a snapshot for. For example:
+  // A list of asset types of which to take a snapshot for. Example:
   // "compute.googleapis.com/Disk". If specified, only matching assets will be
   // returned. See [Introduction to Cloud Asset
   // Inventory](https://cloud.google.com/asset-inventory/docs/overview)
@@ -170,7 +177,7 @@ message ExportAssetsRequest {
   ContentType content_type = 4;
 
   // Required. Output configuration indicating where the results will be output
-  // to. All results will be in newline delimited JSON format.
+  // to.
   OutputConfig output_config = 5 [(google.api.field_behavior) = REQUIRED];
 }
 
@@ -184,7 +191,6 @@ message ExportAssetsResponse {
   google.protobuf.Timestamp read_time = 1;
 
   // Output configuration indicating where the results were output to.
-  // All results are in JSON format.
   OutputConfig output_config = 2;
 }
 
@@ -200,13 +206,11 @@ message BatchGetAssetsHistoryRequest {
     }
   ];
 
-  // A list of the full names of the assets. For example:
+  // A list of the full names of the assets.
+  // See: https://cloud.google.com/asset-inventory/docs/resource-name-format
+  // Example:
+  //
   // `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`.
-  // See [Resource
-  // Names](https://cloud.google.com/apis/design/resource_names#full_resource_name)
-  // and [Resource Name
-  // Format](https://cloud.google.com/asset-inventory/docs/resource-name-format)
-  // for more info.
   //
   // The request becomes a no-op if the asset name list is empty, and the max
   // size of the asset name list is 100 in one request.
@@ -310,9 +314,7 @@ message OutputConfig {
     GcsDestination gcs_destination = 1;
 
     // Destination on BigQuery. The output table stores the fields in asset
-    // proto as columns in BigQuery. The resource/iam_policy field is converted
-    // to a record with each field to a column, except metadata to a single JSON
-    // string.
+    // proto as columns in BigQuery.
     BigQueryDestination bigquery_destination = 2;
   }
 }
@@ -322,16 +324,16 @@ message GcsDestination {
   // Required.
   oneof object_uri {
     // The uri of the Cloud Storage object. It's the same uri that is used by
-    // gsutil. For example: "gs://bucket_name/object_name". See [Viewing and
+    // gsutil. Example: "gs://bucket_name/object_name". See [Viewing and
     // Editing Object
     // Metadata](https://cloud.google.com/storage/docs/viewing-editing-metadata)
     // for more information.
     string uri = 1;
 
-    // The uri prefix of all generated Cloud Storage objects. For example:
+    // The uri prefix of all generated Cloud Storage objects. Example:
     // "gs://bucket_name/object_name_prefix". Each object uri is in format:
     // "gs://bucket_name/object_name_prefix// and only
-    // contains assets for that type.  starts from 0. For example:
+    // contains assets for that type.  starts from 0. Example:
     // "gs://bucket_name/object_name_prefix/compute.googleapis.com/Disk/0" is
     // the first shard of output objects containing all
     // compute.googleapis.com/Disk assets. An INVALID_ARGUMENT error will be
@@ -341,7 +343,7 @@ message GcsDestination {
   }
 }
 
-// A BigQuery destination.
+// A BigQuery destination for exporting assets to.
 message BigQueryDestination {
   // Required. The BigQuery dataset in format
   // "projects/projectId/datasets/datasetId", to which the snapshot result
@@ -364,7 +366,7 @@ message BigQueryDestination {
 // A Pub/Sub destination.
 message PubsubDestination {
   // The name of the Pub/Sub topic to publish to.
-  // For example: `projects/PROJECT_ID/topics/TOPIC_ID`.
+  // Example: `projects/PROJECT_ID/topics/TOPIC_ID`.
   string topic = 1;
 }
 
@@ -402,8 +404,8 @@ message Feed {
 
   // A list of the full names of the assets to receive updates. You must specify
   // either or both of asset_names and asset_types. Only asset updates matching
-  // specified asset_names and asset_types are exported to the feed. For
-  // example:
+  // specified asset_names or asset_types are exported to the feed.
+  // Example:
   // `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`.
   // See [Resource
   // Names](https://cloud.google.com/apis/design/resource_names#full_resource_name)
@@ -412,8 +414,8 @@ message Feed {
 
   // A list of types of the assets to receive updates. You must specify either
   // or both of asset_names and asset_types. Only asset updates matching
-  // specified asset_names and asset_types are exported to the feed.
-  // For example: `"compute.googleapis.com/Disk"`
+  // specified asset_names or asset_types are exported to the feed.
+  // Example: `"compute.googleapis.com/Disk"`
   //
   // See [this
   // topic](https://cloud.google.com/asset-inventory/docs/supported-asset-types)
@@ -428,6 +430,16 @@ message Feed {
   // published to.
   FeedOutputConfig feed_output_config = 5
       [(google.api.field_behavior) = REQUIRED];
+
+  // A condition which determines whether an asset update should be published.
+  // If specified, an asset will be returned only when the expression evaluates
+  // to true.
+  // When set, `expression` field in the `Expr` must be a valid [CEL expression]
+  // (https://github.com/google/cel-spec) on a TemporalAsset with name
+  // `temporal_asset`. Example: a Feed with expression ("temporal_asset.deleted
+  // == true") will only publish Asset deletions. Other fields in `Expr` are
+  // optional.
+  google.type.Expr condition = 6;
 }
 
 // Search all resources request.
diff --git a/google/cloud/asset/v1/assets.proto b/google/cloud/asset/v1/assets.proto
index 4e537d5ce..584259b18 100644
--- a/google/cloud/asset/v1/assets.proto
+++ b/google/cloud/asset/v1/assets.proto
@@ -26,6 +26,7 @@ import "google/identity/accesscontextmanager/v1/service_perimeter.proto";
 import "google/protobuf/any.proto";
 import "google/protobuf/struct.proto";
 import "google/protobuf/timestamp.proto";
+import "google/rpc/code.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Asset.V1";
@@ -38,6 +39,24 @@ option php_namespace = "Google\\Cloud\\Asset\\V1";
 // An asset in Google Cloud and its temporal metadata, including the time window
 // when it was observed and its status during that window.
 message TemporalAsset {
+  // State of prior asset.
+  enum PriorAssetState {
+    // prior_asset is not applicable for the current asset.
+    PRIOR_ASSET_STATE_UNSPECIFIED = 0;
+
+    // prior_asset is populated correctly.
+    PRESENT = 1;
+
+    // Failed to set prior_asset.
+    INVALID = 2;
+
+    // Current asset is the first known state.
+    DOES_NOT_EXIST = 3;
+
+    // prior_asset is a deletion.
+    DELETED = 4;
+  }
+
   // The time window when the asset data and state was observed.
   TimeWindow window = 1;
 
@@ -46,9 +65,16 @@ message TemporalAsset {
 
   // An asset in Google Cloud.
   Asset asset = 3;
+
+  // State of prior_asset.
+  PriorAssetState prior_asset_state = 4;
+
+  // Prior copy of the asset. Populated if prior_asset_state is PRESENT.
+  // Currently this is only set for responses in Real-Time Feed.
+  Asset prior_asset = 5;
 }
 
-// A time window specified by its "start_time" and "end_time".
+// A time window specified by its `start_time` and `end_time`.
 message TimeWindow {
   // Start time of the time window (exclusive).
   google.protobuf.Timestamp start_time = 1;
@@ -62,22 +88,29 @@ message TimeWindow {
 // [resource
 // hierarchy](https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy),
 // a resource outside the Google Cloud resource hierarchy (such as Google
-// Kubernetes Engine clusters and objects), or a Cloud IAM policy.
+// Kubernetes Engine clusters and objects), or a policy (e.g. Cloud IAM policy).
+// See [Supported asset
+// types](https://cloud.google.com/asset-inventory/docs/supported-asset-types)
+// for more information.
 message Asset {
   option (google.api.resource) = {
     type: "cloudasset.googleapis.com/Asset"
     pattern: "*"
   };
 
-  // The full name of the asset. For example:
-  // "//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1"
+  // The last update timestamp of an asset. update_time is updated when
+  // create/update/delete operation is performed.
+  google.protobuf.Timestamp update_time = 11;
+
+  // The full name of the asset. Example:
+  // `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`
   //
   // See [Resource
   // names](https://cloud.google.com/apis/design/resource_names#full_resource_name)
   // for more information.
   string name = 1;
 
-  // The type of the asset. For example: "compute.googleapis.com/Disk"
+  // The type of the asset. Example: `compute.googleapis.com/Disk`
   //
   // See [Supported asset
   // types](https://cloud.google.com/asset-inventory/docs/supported-asset-types)
@@ -107,10 +140,16 @@ message Asset {
   // A representation of an [access
   // policy](https://cloud.google.com/access-context-manager/docs/overview#access-policies).
   oneof access_context_policy {
+    // Please also refer to the [access policy user
+    // guide](https://cloud.google.com/access-context-manager/docs/overview#access-policies).
     google.identity.accesscontextmanager.v1.AccessPolicy access_policy = 7;
 
+    // Please also refer to the [access level user
+    // guide](https://cloud.google.com/access-context-manager/docs/overview#access-levels).
     google.identity.accesscontextmanager.v1.AccessLevel access_level = 8;
 
+    // Please also refer to the [service perimeter user
+    // guide](https://cloud.google.com/vpc-service-controls/docs/overview).
     google.identity.accesscontextmanager.v1.ServicePerimeter service_perimeter =
         9;
   }
@@ -122,33 +161,33 @@ message Asset {
   // is a project, folder, or organization, the ancestry path starts from the
   // asset itself.
   //
-  // For example: `["projects/123456789", "folders/5432", "organizations/1234"]`
+  // Example: `["projects/123456789", "folders/5432", "organizations/1234"]`
   repeated string ancestors = 10;
 }
 
 // A representation of a Google Cloud resource.
 message Resource {
-  // The API version. For example: "v1"
+  // The API version. Example: `v1`
   string version = 1;
 
   // The URL of the discovery document containing the resource's JSON schema.
-  // For example:
-  // "https://www.googleapis.com/discovery/v1/apis/compute/v1/rest"
+  // Example:
+  // `https://www.googleapis.com/discovery/v1/apis/compute/v1/rest`
   //
   // This value is unspecified for resources that do not have an API based on a
   // discovery document, such as Cloud Bigtable.
   string discovery_document_uri = 2;
 
-  // The JSON schema name listed in the discovery document. For example:
-  // "Project"
+  // The JSON schema name listed in the discovery document. Example:
+  // `Project`
   //
   // This value is unspecified for resources that do not have an API based on a
   // discovery document, such as Cloud Bigtable.
   string discovery_name = 3;
 
   // The REST URL for accessing the resource. An HTTP `GET` request using this
-  // URL returns the resource itself. For example:
-  // "https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123"
+  // URL returns the resource itself. Example:
+  // `https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123`
   //
   // This value is unspecified for resources without a REST API.
   string resource_url = 4;
@@ -161,8 +200,8 @@ message Resource {
   // For Google Cloud assets, this value is the parent resource defined in the
   // [Cloud IAM policy
   // hierarchy](https://cloud.google.com/iam/docs/overview#policy_hierarchy).
-  // For example:
-  // "//cloudresourcemanager.googleapis.com/projects/my_project_123"
+  // Example:
+  // `//cloudresourcemanager.googleapis.com/projects/my_project_123`
   //
   // For third-party assets, this field may be set differently.
   string parent = 5;
@@ -179,7 +218,7 @@ message Resource {
 // A result of Resource Search, containing information of a cloud resoure.
 message ResourceSearchResult {
   // The full resource name of this resource. Example:
-  // "//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1".
+  // `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`.
   // See [Cloud Asset Inventory Resource Name
   // Format](https://cloud.google.com/asset-inventory/docs/resource-name-format)
   // for more information.
@@ -190,7 +229,7 @@ message ResourceSearchResult {
   // * use a free text query. Example: `"instance1"`
   string name = 1;
 
-  // The type of this resource. Example: "compute.googleapis.com/Disk".
+  // The type of this resource. Example: `compute.googleapis.com/Disk`.
   //
   // To search against the `asset_type`:
   //
@@ -222,8 +261,8 @@ message ResourceSearchResult {
   // * use a free text query. Example: `"*important instance*"`
   string description = 5;
 
-  // Location can be "global", regional like "us-east1", or zonal like
-  // "us-west1-b".
+  // Location can be `global`, regional like `us-east1`, or zonal like
+  // `us-west1-b`.
   //
   // To search against the `location`:
   //
@@ -256,13 +295,13 @@ message ResourceSearchResult {
   repeated string network_tags = 8;
 
   // The additional attributes of this resource. The attributes may vary from
-  // one resource type to another. Examples: "projectId" for Project,
-  // "dnsName" for DNS ManagedZone.
+  // one resource type to another. Examples: `projectId` for Project,
+  // `dnsName` for DNS ManagedZone.
   //
   // To search against the `additional_attributes`:
   //
   // * use a free text query to match the attributes values. Example: to search
-  //   additional_attributes = { dnsName: "foobar" }, you can issue a query
+  //   `additional_attributes = { dnsName: "foobar" }`, you can issue a query
   //   `"foobar"`.
   google.protobuf.Struct additional_attributes = 9;
 }
@@ -273,7 +312,7 @@ message IamPolicySearchResult {
   message Explanation {
     // IAM permissions
     message Permissions {
-      // A list of permissions. A sample permission string: "compute.disk.get".
+      // A list of permissions. A sample permission string: `compute.disk.get`.
       repeated string permissions = 1;
     }
 
@@ -281,7 +320,7 @@ message IamPolicySearchResult {
     // permission query (i.e., a query containing `policy.role.permissions:`).
     // Example: if query `policy.role.permissions : "compute.disk.get"`
     // matches a policy binding that contains owner role, the
-    // matched_permissions will be {"roles/owner": ["compute.disk.get"]}. The
+    // matched_permissions will be `{"roles/owner": ["compute.disk.get"]}`. The
     // roles can also be found in the returned `policy` bindings. Note that the
     // map is populated only for requests with permission queries.
     map matched_permissions = 1;
@@ -289,7 +328,7 @@ message IamPolicySearchResult {
 
   // The full resource name of the resource associated with this IAM policy.
   // Example:
-  // "//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1".
+  // `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`.
   // See [Cloud Asset Inventory Resource Name
   // Format](https://cloud.google.com/asset-inventory/docs/resource-name-format)
   // for more information.
diff --git a/google/cloud/asset/v1beta1/BUILD.bazel b/google/cloud/asset/v1beta1/BUILD.bazel
index fbf50ebc8..f00d1a129 100644
--- a/google/cloud/asset/v1beta1/BUILD.bazel
+++ b/google/cloud/asset/v1beta1/BUILD.bazel
@@ -63,6 +63,7 @@ java_gapic_library(
     name = "asset_java_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1beta1",
     service_yaml = "cloudasset_v1beta1.yaml",
     test_deps = [
@@ -132,7 +133,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
@@ -199,6 +199,7 @@ py_gapic_library(
     name = "asset_py_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1beta1",
     service_yaml = "cloudasset_v1beta1.yaml",
     deps = [
@@ -243,6 +244,7 @@ php_gapic_library(
     name = "asset_php_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1beta1",
     service_yaml = "cloudasset_v1beta1.yaml",
     deps = [
@@ -273,7 +275,7 @@ load(
 nodejs_gapic_library(
     name = "asset_nodejs_gapic",
     src = ":asset_proto_with_info",
-    gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1beta1",
     service_yaml = "cloudasset_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/asset/v1p1beta1/BUILD.bazel b/google/cloud/asset/v1p1beta1/BUILD.bazel
index f039fdd85..11b4ac529 100644
--- a/google/cloud/asset/v1p1beta1/BUILD.bazel
+++ b/google/cloud/asset/v1p1beta1/BUILD.bazel
@@ -58,6 +58,7 @@ java_gapic_library(
     name = "asset_java_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p1beta1",
     service_yaml = "cloudasset_v1p1beta1.yaml",
     test_deps = [
@@ -179,6 +180,7 @@ py_gapic_library(
     name = "asset_py_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p1beta1",
     service_yaml = "cloudasset_v1p1beta1.yaml",
     deps = [
@@ -223,6 +225,7 @@ php_gapic_library(
     name = "asset_php_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p1beta1",
     service_yaml = "cloudasset_v1p1beta1.yaml",
     deps = [
@@ -253,7 +256,7 @@ load(
 nodejs_gapic_library(
     name = "asset_nodejs_gapic",
     src = ":asset_proto_with_info",
-    gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p1beta1",
     service_yaml = "cloudasset_v1p1beta1.yaml",
     deps = [],
diff --git a/google/cloud/asset/v1p2beta1/BUILD.bazel b/google/cloud/asset/v1p2beta1/BUILD.bazel
index 45ef0b256..9ea0f377c 100644
--- a/google/cloud/asset/v1p2beta1/BUILD.bazel
+++ b/google/cloud/asset/v1p2beta1/BUILD.bazel
@@ -65,6 +65,7 @@ java_gapic_library(
     name = "asset_java_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p2beta1",
     service_yaml = "cloudasset_v1p2beta1.yaml",
     test_deps = [
@@ -131,7 +132,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
@@ -200,6 +200,7 @@ py_gapic_library(
     name = "asset_py_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p2beta1",
     service_yaml = "cloudasset_v1p2beta1.yaml",
     deps = [
@@ -244,6 +245,7 @@ php_gapic_library(
     name = "asset_php_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p2beta1",
     service_yaml = "cloudasset_v1p2beta1.yaml",
     deps = [
@@ -274,7 +276,7 @@ load(
 nodejs_gapic_library(
     name = "asset_nodejs_gapic",
     src = ":asset_proto_with_info",
-    gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p2beta1",
     service_yaml = "cloudasset_v1p2beta1.yaml",
     deps = [],
diff --git a/google/cloud/asset/v1p4beta1/BUILD.bazel b/google/cloud/asset/v1p4beta1/BUILD.bazel
index f7a8b2233..66b805498 100644
--- a/google/cloud/asset/v1p4beta1/BUILD.bazel
+++ b/google/cloud/asset/v1p4beta1/BUILD.bazel
@@ -61,6 +61,7 @@ java_gapic_library(
     name = "asset_java_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p4beta1",
     service_yaml = "cloudasset_v1p4beta1.yaml",
     test_deps = [
@@ -128,7 +129,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -192,6 +192,7 @@ py_gapic_library(
     name = "asset_py_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p4beta1",
     service_yaml = "cloudasset_v1p4beta1.yaml",
     deps = [
@@ -236,6 +237,7 @@ php_gapic_library(
     name = "asset_php_gapic",
     src = ":asset_proto_with_info",
     gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p4beta1",
     service_yaml = "cloudasset_v1p4beta1.yaml",
     deps = [
@@ -266,7 +268,7 @@ load(
 nodejs_gapic_library(
     name = "asset_nodejs_gapic",
     src = ":asset_proto_with_info",
-    gapic_yaml = "cloudasset_gapic.yaml",
+    grpc_service_config = "cloudasset_grpc_service_config.json",
     package = "google.cloud.asset.v1p4beta1",
     service_yaml = "cloudasset_v1p4beta1.yaml",
     deps = [],
diff --git a/google/cloud/asset/v1p5beta1/BUILD.bazel b/google/cloud/asset/v1p5beta1/BUILD.bazel
new file mode 100644
index 000000000..c32d92781
--- /dev/null
+++ b/google/cloud/asset/v1p5beta1/BUILD.bazel
@@ -0,0 +1,375 @@
+# This file was automatically generated by BuildFileGenerator
+
+# This is an API workspace, having public visibility by default makes perfect sense.
+package(default_visibility = ["//visibility:public"])
+
+##############################################################################
+# Common
+##############################################################################
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@com_google_googleapis_imports//:imports.bzl", "proto_library_with_info")
+
+proto_library(
+    name = "asset_proto",
+    srcs = [
+        "asset_service.proto",
+        "assets.proto",
+    ],
+    deps = [
+        "//google/api:annotations_proto",
+        "//google/api:client_proto",
+        "//google/api:field_behavior_proto",
+        "//google/api:resource_proto",
+        "//google/cloud/orgpolicy/v1:orgpolicy_proto",
+        "//google/iam/v1:policy_proto",
+        "//google/identity/accesscontextmanager/v1:accesscontextmanager_proto",
+        "@com_google_protobuf//:any_proto",
+        "@com_google_protobuf//:struct_proto",
+        "@com_google_protobuf//:timestamp_proto",
+    ],
+)
+
+proto_library_with_info(
+    name = "asset_proto_with_info",
+    deps = [
+        ":asset_proto",
+        "//google/cloud:common_resources_proto",
+    ],
+)
+
+##############################################################################
+# Java
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "java_gapic_assembly_gradle_pkg",
+    "java_gapic_library",
+    "java_gapic_test",
+    "java_grpc_library",
+    "java_proto_library",
+)
+
+java_proto_library(
+    name = "asset_java_proto",
+    deps = [":asset_proto"],
+)
+
+java_grpc_library(
+    name = "asset_java_grpc",
+    srcs = [":asset_proto"],
+    deps = [":asset_java_proto"],
+)
+
+java_gapic_library(
+    name = "asset_java_gapic",
+    src = ":asset_proto_with_info",
+    gapic_yaml = "cloudasset_gapic.yaml",
+    package = "google.cloud.asset.v1p5beta1",
+    service_yaml = "cloudasset_v1p5beta1.yaml",
+    test_deps = [
+        ":asset_java_grpc",
+        "//google/iam/v1:iam_java_grpc",
+    ],
+    deps = [
+        ":asset_java_proto",
+        "//google/iam/v1:iam_java_proto",
+    ],
+)
+
+java_gapic_test(
+    name = "asset_java_gapic_test_suite",
+    test_classes = [
+        "com.google.cloud.asset.v1p5beta1.AssetServiceClientTest",
+    ],
+    runtime_deps = [":asset_java_gapic_test"],
+)
+
+# Open Source Packages
+java_gapic_assembly_gradle_pkg(
+    name = "google-cloud-asset-v1p5beta1-java",
+    deps = [
+        ":asset_java_gapic",
+        ":asset_java_grpc",
+        ":asset_java_proto",
+        ":asset_proto",
+    ],
+)
+
+##############################################################################
+# Go
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "go_gapic_assembly_pkg",
+    "go_gapic_library",
+    "go_proto_library",
+    "go_test",
+)
+
+go_proto_library(
+    name = "asset_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "google.golang.org/genproto/googleapis/cloud/asset/v1p5beta1",
+    protos = [":asset_proto"],
+    deps = [
+        "//google/api:annotations_go_proto",
+        "//google/cloud/orgpolicy/v1:orgpolicy_go_proto",
+        "//google/iam/v1:iam_go_proto",
+        "//google/identity/accesscontextmanager/v1:accesscontextmanager_go_proto",
+    ],
+)
+
+go_gapic_library(
+    name = "asset_go_gapic",
+    srcs = [":asset_proto_with_info"],
+    grpc_service_config = "cloudasset_grpc_service_config.json",
+    importpath = "cloud.google.com/go/asset/apiv1p5beta1;asset",
+    service_yaml = "cloudasset_v1p5beta1.yaml",
+    deps = [
+        ":asset_go_proto",
+        "//google/iam/v1:iam_go_proto",
+    ],
+)
+
+go_test(
+    name = "asset_go_gapic_test",
+    srcs = [":asset_go_gapic_srcjar_test"],
+    embed = [":asset_go_gapic"],
+    importpath = "cloud.google.com/go/asset/apiv1p5beta1",
+)
+
+# Open Source Packages
+go_gapic_assembly_pkg(
+    name = "gapi-cloud-asset-v1p5beta1-go",
+    deps = [
+        ":asset_go_gapic",
+        ":asset_go_gapic_srcjar-test.srcjar",
+        ":asset_go_proto",
+    ],
+)
+
+##############################################################################
+# Python
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "moved_proto_library",
+    "py_gapic_assembly_pkg",
+    "py_gapic_library",
+    "py_grpc_library",
+    "py_proto_library",
+)
+
+moved_proto_library(
+    name = "asset_moved_proto",
+    srcs = [":asset_proto"],
+    deps = [
+        "//google/api:annotations_proto",
+        "//google/api:client_proto",
+        "//google/api:field_behavior_proto",
+        "//google/api:resource_proto",
+        "//google/cloud/orgpolicy/v1:orgpolicy_proto",
+        "//google/iam/v1:policy_proto",
+        "//google/identity/accesscontextmanager/v1:accesscontextmanager_proto",
+        "@com_google_protobuf//:any_proto",
+        "@com_google_protobuf//:struct_proto",
+        "@com_google_protobuf//:timestamp_proto",
+    ],
+)
+
+py_proto_library(
+    name = "asset_py_proto",
+    plugin = "@protoc_docs_plugin//:docs_plugin",
+    deps = [":asset_moved_proto"],
+)
+
+py_grpc_library(
+    name = "asset_py_grpc",
+    srcs = [":asset_moved_proto"],
+    deps = [":asset_py_proto"],
+)
+
+py_gapic_library(
+    name = "asset_py_gapic",
+    src = ":asset_proto_with_info",
+    gapic_yaml = "cloudasset_gapic.yaml",
+    package = "google.cloud.asset.v1p5beta1",
+    service_yaml = "cloudasset_v1p5beta1.yaml",
+    deps = [
+        ":asset_py_grpc",
+        ":asset_py_proto",
+    ],
+)
+
+# Open Source Packages
+py_gapic_assembly_pkg(
+    name = "asset-v1p5beta1-py",
+    deps = [
+        ":asset_py_gapic",
+        ":asset_py_grpc",
+        ":asset_py_proto",
+    ],
+)
+
+##############################################################################
+# PHP
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "php_gapic_assembly_pkg",
+    "php_gapic_library",
+    "php_grpc_library",
+    "php_proto_library",
+)
+
+php_proto_library(
+    name = "asset_php_proto",
+    deps = [":asset_proto"],
+)
+
+php_grpc_library(
+    name = "asset_php_grpc",
+    srcs = [":asset_proto"],
+    deps = [":asset_php_proto"],
+)
+
+php_gapic_library(
+    name = "asset_php_gapic",
+    src = ":asset_proto_with_info",
+    gapic_yaml = "cloudasset_gapic.yaml",
+    package = "google.cloud.asset.v1p5beta1",
+    service_yaml = "cloudasset_v1p5beta1.yaml",
+    deps = [
+        ":asset_php_grpc",
+        ":asset_php_proto",
+    ],
+)
+
+# Open Source Packages
+php_gapic_assembly_pkg(
+    name = "google-cloud-asset-v1p5beta1-php",
+    deps = [
+        ":asset_php_gapic",
+        ":asset_php_grpc",
+        ":asset_php_proto",
+    ],
+)
+
+##############################################################################
+# Node.js
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "nodejs_gapic_assembly_pkg",
+    "nodejs_gapic_library",
+)
+
+nodejs_gapic_library(
+    name = "asset_nodejs_gapic",
+    src = ":asset_proto_with_info",
+    gapic_yaml = "cloudasset_gapic.yaml",
+    package = "google.cloud.asset.v1p5beta1",
+    service_yaml = "cloudasset_v1p5beta1.yaml",
+    deps = [],
+)
+
+nodejs_gapic_assembly_pkg(
+    name = "asset-v1p5beta1-nodejs",
+    deps = [
+        ":asset_nodejs_gapic",
+        ":asset_proto",
+    ],
+)
+
+##############################################################################
+# Ruby
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "ruby_gapic_assembly_pkg",
+    "ruby_gapic_library",
+    "ruby_grpc_library",
+    "ruby_proto_library",
+)
+
+ruby_proto_library(
+    name = "asset_ruby_proto",
+    deps = [":asset_proto"],
+)
+
+ruby_grpc_library(
+    name = "asset_ruby_grpc",
+    srcs = [":asset_proto"],
+    deps = [":asset_ruby_proto"],
+)
+
+ruby_gapic_library(
+    name = "asset_ruby_gapic",
+    src = ":asset_proto_with_info",
+    gapic_yaml = "cloudasset_gapic.yaml",
+    package = "google.cloud.asset.v1p5beta1",
+    service_yaml = "cloudasset_v1p5beta1.yaml",
+    deps = [
+        ":asset_ruby_grpc",
+        ":asset_ruby_proto",
+    ],
+)
+
+# Open Source Packages
+ruby_gapic_assembly_pkg(
+    name = "google-cloud-asset-v1p5beta1-ruby",
+    deps = [
+        ":asset_ruby_gapic",
+        ":asset_ruby_grpc",
+        ":asset_ruby_proto",
+    ],
+)
+
+##############################################################################
+# C#
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "csharp_gapic_assembly_pkg",
+    "csharp_gapic_library",
+    "csharp_grpc_library",
+    "csharp_proto_library",
+)
+
+csharp_proto_library(
+    name = "asset_csharp_proto",
+    deps = [":asset_proto"],
+)
+
+csharp_grpc_library(
+    name = "asset_csharp_grpc",
+    srcs = [":asset_proto"],
+    deps = [":asset_csharp_proto"],
+)
+
+csharp_gapic_library(
+    name = "asset_csharp_gapic",
+    src = ":asset_proto_with_info",
+    gapic_yaml = "cloudasset_gapic.yaml",
+    package = "google.cloud.asset.v1p5beta1",
+    service_yaml = "cloudasset_v1p5beta1.yaml",
+    deps = [
+        ":asset_csharp_grpc",
+        ":asset_csharp_proto",
+    ],
+)
+
+# Open Source Packages
+csharp_gapic_assembly_pkg(
+    name = "google-cloud-asset-v1p5beta1-csharp",
+    deps = [
+        ":asset_csharp_gapic",
+        ":asset_csharp_grpc",
+        ":asset_csharp_proto",
+    ],
+)
+
+##############################################################################
+# C++
+##############################################################################
+# Put your C++ rules here
diff --git a/google/cloud/asset/v1p5beta1/asset_service.proto b/google/cloud/asset/v1p5beta1/asset_service.proto
new file mode 100644
index 000000000..52233ad05
--- /dev/null
+++ b/google/cloud/asset/v1p5beta1/asset_service.proto
@@ -0,0 +1,112 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.asset.v1p5beta1;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/cloud/asset/v1p5beta1/assets.proto";
+import "google/protobuf/timestamp.proto";
+
+option csharp_namespace = "Google.Cloud.Asset.V1P5Beta1";
+option go_package = "google.golang.org/genproto/googleapis/cloud/asset/v1p5beta1;asset";
+option java_multiple_files = true;
+option java_outer_classname = "AssetServiceProto";
+option java_package = "com.google.cloud.asset.v1p5beta1";
+option php_namespace = "Google\\Cloud\\Asset\\V1p5beta1";
+
+// Asset service definition.
+service AssetService {
+  option (google.api.default_host) = "cloudasset.googleapis.com";
+  option (google.api.oauth_scopes) =
+      "https://www.googleapis.com/auth/cloud-platform";
+
+  // Lists assets with time and resource types and returns paged results in
+  // response.
+  rpc ListAssets(ListAssetsRequest) returns (ListAssetsResponse) {
+    option (google.api.http) = {
+      get: "/v1p5beta1/{parent=*/*}/assets"
+    };
+  }
+}
+
+// ListAssets request.
+message ListAssetsRequest {
+  // Required. Name of the organization or project the assets belong to. Format:
+  // "organizations/[organization-number]" (such as "organizations/123"),
+  // "projects/[project-number]" (such as "projects/my-project-id"), or
+  // "projects/[project-id]" (such as "projects/12345").
+  string parent = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // Timestamp to take an asset snapshot. This can only be set to a timestamp
+  // between 2018-10-02 UTC (inclusive) and the current time. If not specified,
+  // the current time will be used. Due to delays in resource data collection
+  // and indexing, there is a volatile window during which running the same
+  // query may get different results.
+  google.protobuf.Timestamp read_time = 2;
+
+  // A list of asset types of which to take a snapshot for. For  example:
+  // "compute.googleapis.com/Disk". If specified, only matching assets will be
+  // returned. See [Introduction to Cloud Asset
+  // Inventory](https://cloud.google.com/resource-manager/docs/cloud-asset-inventory/overview)
+  // for all supported asset types.
+  repeated string asset_types = 3;
+
+  // Asset content type. If not specified, no content but the asset name will
+  // be returned.
+  ContentType content_type = 4;
+
+  // The maximum number of assets to be returned in a single response. Default
+  // is 100, minimum is 1, and maximum is 1000.
+  int32 page_size = 5;
+
+  // The `next_page_token` returned from the previous `ListAssetsResponse`, or
+  // unspecified for the first `ListAssetsRequest`. It is a continuation of a
+  // prior `ListAssets` call, and the API should return the next page of assets.
+  string page_token = 6;
+}
+
+// Asset content type.
+enum ContentType {
+  // Unspecified content type.
+  CONTENT_TYPE_UNSPECIFIED = 0;
+
+  // Resource metadata.
+  RESOURCE = 1;
+
+  // The actual IAM policy set on a resource.
+  IAM_POLICY = 2;
+
+  // The Cloud Organization Policy set on an asset.
+  ORG_POLICY = 4;
+
+  // The Cloud Access context mananger Policy set on an asset.
+  ACCESS_POLICY = 5;
+}
+
+// ListAssets response.
+message ListAssetsResponse {
+  // Time the snapshot was taken.
+  google.protobuf.Timestamp read_time = 1;
+
+  // Assets.
+  repeated Asset assets = 2;
+
+  // Token to retrieve the next page of results. Set to empty if there are no
+  // remaining results.
+  string next_page_token = 3;
+}
diff --git a/google/cloud/asset/v1p5beta1/assets.proto b/google/cloud/asset/v1p5beta1/assets.proto
new file mode 100644
index 000000000..b9d1e1991
--- /dev/null
+++ b/google/cloud/asset/v1p5beta1/assets.proto
@@ -0,0 +1,127 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.asset.v1p5beta1;
+
+import "google/api/annotations.proto";
+import "google/api/resource.proto";
+import "google/cloud/orgpolicy/v1/orgpolicy.proto";
+import "google/iam/v1/policy.proto";
+import "google/identity/accesscontextmanager/v1/access_level.proto";
+import "google/identity/accesscontextmanager/v1/access_policy.proto";
+import "google/identity/accesscontextmanager/v1/service_perimeter.proto";
+import "google/protobuf/any.proto";
+import "google/protobuf/struct.proto";
+import "google/protobuf/timestamp.proto";
+
+option cc_enable_arenas = true;
+option csharp_namespace = "Google.Cloud.Asset.V1p5Beta1";
+option go_package = "google.golang.org/genproto/googleapis/cloud/asset/v1p5beta1;asset";
+option java_multiple_files = true;
+option java_outer_classname = "AssetProto";
+option java_package = "com.google.cloud.asset.v1p5beta1";
+option php_namespace = "Google\\Cloud\\Asset\\V1p5beta1";
+
+// Cloud asset. This includes all Google Cloud Platform resources,
+// Cloud IAM policies, and other non-GCP assets.
+message Asset {
+  option (google.api.resource) = {
+    type: "cloudasset.googleapis.com/Asset"
+    pattern: "*"
+  };
+
+  // The full name of the asset. For example:
+  // `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`.
+  // See [Resource
+  // Names](https://cloud.google.com/apis/design/resource_names#full_resource_name)
+  // for more information.
+  string name = 1;
+
+  // Type of the asset. Example: "compute.googleapis.com/Disk".
+  string asset_type = 2;
+
+  // Representation of the resource.
+  Resource resource = 3;
+
+  // Representation of the actual Cloud IAM policy set on a cloud resource. For
+  // each resource, there must be at most one Cloud IAM policy set on it.
+  google.iam.v1.Policy iam_policy = 4;
+
+  // Representation of the Cloud Organization Policy set on an asset. For each
+  // asset, there could be multiple Organization policies with different
+  // constraints.
+  repeated google.cloud.orgpolicy.v1.Policy org_policy = 6;
+
+  // Representation of the Cloud Organization access policy.
+  oneof access_context_policy {
+    google.identity.accesscontextmanager.v1.AccessPolicy access_policy = 7;
+
+    google.identity.accesscontextmanager.v1.AccessLevel access_level = 8;
+
+    google.identity.accesscontextmanager.v1.ServicePerimeter service_perimeter =
+        9;
+  }
+
+  // Asset's ancestry path in Cloud Resource Manager (CRM) hierarchy,
+  // represented as a list of relative resource names. Ancestry path starts with
+  // the closest CRM ancestor and ends at root. If the asset is a CRM
+  // project/folder/organization, this starts from the asset itself.
+  //
+  // Example: ["projects/123456789", "folders/5432", "organizations/1234"]
+  repeated string ancestors = 10;
+}
+
+// Representation of a cloud resource.
+message Resource {
+  // The API version. Example: "v1".
+  string version = 1;
+
+  // The URL of the discovery document containing the resource's JSON schema.
+  // For example:
+  // `"https://www.googleapis.com/discovery/v1/apis/compute/v1/rest"`.
+  // It will be left unspecified for resources without a discovery-based API,
+  // such as Cloud Bigtable.
+  string discovery_document_uri = 2;
+
+  // The JSON schema name listed in the discovery document.
+  // Example: "Project". It will be left unspecified for resources (such as
+  // Cloud Bigtable) without a discovery-based API.
+  string discovery_name = 3;
+
+  // The REST URL for accessing the resource. An HTTP GET operation using this
+  // URL returns the resource itself.
+  // Example:
+  // `https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123`.
+  // It will be left unspecified for resources without a REST API.
+  string resource_url = 4;
+
+  // The full name of the immediate parent of this resource. See
+  // [Resource
+  // Names](https://cloud.google.com/apis/design/resource_names#full_resource_name)
+  // for more information.
+  //
+  // For GCP assets, it is the parent resource defined in the [Cloud IAM policy
+  // hierarchy](https://cloud.google.com/iam/docs/overview#policy_hierarchy).
+  // For example:
+  // `"//cloudresourcemanager.googleapis.com/projects/my_project_123"`.
+  //
+  // For third-party assets, it is up to the users to define.
+  string parent = 5;
+
+  // The content of the resource, in which some sensitive fields are scrubbed
+  // away and may not be present.
+  google.protobuf.Struct data = 6;
+}
diff --git a/google/cloud/asset/v1p5beta1/cloudasset_gapic.yaml b/google/cloud/asset/v1p5beta1/cloudasset_gapic.yaml
new file mode 100644
index 000000000..096299acb
--- /dev/null
+++ b/google/cloud/asset/v1p5beta1/cloudasset_gapic.yaml
@@ -0,0 +1,21 @@
+type: com.google.api.codegen.ConfigProto
+config_schema_version: 2.0.0
+# The settings of generated code in a specific language.
+language_settings:
+  java:
+    package_name: com.google.cloud.asset.v1p5beta1
+  python:
+    package_name: google.cloud.asset_v1p5beta1.gapic
+  go:
+    package_name: cloud.google.com/go/asset/apiv1p5beta1
+  csharp:
+    package_name: Google.Cloud.Asset.V1p5beta1
+  ruby:
+    package_name: Google::Cloud::Asset::V1p5beta1
+  php:
+    package_name: Google\Cloud\Asset\V1p5beta1
+  nodejs:
+    package_name: asset.v1p5beta1
+    domain_layer_location: google-cloud
+interfaces:
+- name: google.cloud.asset.v1p5beta1.AssetService
diff --git a/google/cloud/asset/v1p5beta1/cloudasset_grpc_service_config.json b/google/cloud/asset/v1p5beta1/cloudasset_grpc_service_config.json
new file mode 100644
index 000000000..3620a5bb8
--- /dev/null
+++ b/google/cloud/asset/v1p5beta1/cloudasset_grpc_service_config.json
@@ -0,0 +1,22 @@
+{
+  "methodConfig": [
+    {
+      "name": [
+        {
+          "service": "google.cloud.asset.v1p5beta1.AssetService",
+          "method": "ListAssets"
+        }
+      ],
+      "timeout": "60s",
+      "retryPolicy": {
+        "initialBackoff": "0.100s",
+        "maxBackoff": "60s",
+        "backoffMultiplier": 1.3,
+        "retryableStatusCodes": [
+          "DEADLINE_EXCEEDED",
+          "UNAVAILABLE"
+        ]
+      }
+    }
+  ]
+}
diff --git a/google/cloud/asset/v1p5beta1/cloudasset_v1p5beta1.yaml b/google/cloud/asset/v1p5beta1/cloudasset_v1p5beta1.yaml
new file mode 100644
index 000000000..07dbadacd
--- /dev/null
+++ b/google/cloud/asset/v1p5beta1/cloudasset_v1p5beta1.yaml
@@ -0,0 +1,32 @@
+type: google.api.Service
+config_version: 3
+name: cloudasset.googleapis.com
+title: Cloud Asset API
+
+apis:
+- name: google.cloud.asset.v1p5beta1.AssetService
+
+documentation:
+  summary: The cloud asset API manages the history and inventory of cloud resources.
+  overview: |-
+    # Cloud Asset API
+
+    The Cloud Asset API keeps a history of Google Cloud Platform (GCP) asset
+    metadata, and allows GCP users to download a dump of all asset metadata
+    for the resource types listed below within an organization or a project at
+    a given timestamp.
+
+    Read more documents here:
+    https://cloud.google.com/asset-inventory/docs
+
+backend:
+  rules:
+  - selector: google.cloud.asset.v1p5beta1.AssetService.ListAssets
+    deadline: 600.0
+
+authentication:
+  rules:
+  - selector: google.cloud.asset.v1p5beta1.AssetService.ListAssets
+    oauth:
+      canonical_scopes: |-
+        https://www.googleapis.com/auth/cloud-platform
diff --git a/google/cloud/automl/v1/BUILD.bazel b/google/cloud/automl/v1/BUILD.bazel
index 0f849c873..7f48a3d0c 100644
--- a/google/cloud/automl/v1/BUILD.bazel
+++ b/google/cloud/automl/v1/BUILD.bazel
@@ -147,7 +147,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
@@ -292,7 +291,7 @@ load(
 nodejs_gapic_library(
     name = "automl_nodejs_gapic",
     src = ":automl_proto_with_info",
-    gapic_yaml = "automl_gapic.yaml",
+    grpc_service_config = "automl_grpc_service_config.json",
     package = "google.cloud.automl.v1",
     service_yaml = "automl_v1.yaml",
     deps = [],
diff --git a/google/cloud/automl/v1beta1/BUILD.bazel b/google/cloud/automl/v1beta1/BUILD.bazel
index 87ca7a56e..a1cbcb2b9 100644
--- a/google/cloud/automl/v1beta1/BUILD.bazel
+++ b/google/cloud/automl/v1beta1/BUILD.bazel
@@ -156,7 +156,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
@@ -301,7 +300,7 @@ load(
 nodejs_gapic_library(
     name = "automl_nodejs_gapic",
     src = ":automl_proto_with_info",
-    gapic_yaml = "automl_gapic.yaml",
+    grpc_service_config = "automl_grpc_service_config.json",
     package = "google.cloud.automl.v1beta1",
     service_yaml = "automl_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/connection/v1/BUILD.bazel b/google/cloud/bigquery/connection/v1/BUILD.bazel
index f97c0d8f1..d4f2180b2 100644
--- a/google/cloud/bigquery/connection/v1/BUILD.bazel
+++ b/google/cloud/bigquery/connection/v1/BUILD.bazel
@@ -7,6 +7,7 @@ package(default_visibility = ["//visibility:public"])
 # Common
 ##############################################################################
 load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@com_google_googleapis_imports//:imports.bzl", "proto_library_with_info")
 
 proto_library(
     name = "connection_proto",
@@ -26,11 +27,22 @@ proto_library(
     ],
 )
 
+proto_library_with_info(
+    name = "connection_proto_with_info",
+    deps = [
+        ":connection_proto",
+        "//google/cloud:common_resources_proto",
+    ],
+)
+
 ##############################################################################
 # Java
 ##############################################################################
 load(
     "@com_google_googleapis_imports//:imports.bzl",
+    "java_gapic_assembly_gradle_pkg",
+    "java_gapic_library",
+    "java_gapic_test",
     "java_grpc_library",
     "java_proto_library",
 )
@@ -46,12 +58,50 @@ java_grpc_library(
     deps = [":connection_java_proto"],
 )
 
+java_gapic_library(
+    name = "connection_java_gapic",
+    src = ":connection_proto_with_info",
+    gapic_yaml = "connection_gapic.yaml",
+    package = "google.cloud.bigquery.connection.v1",
+    service_yaml = "bigqueryconnection_v1.yaml",
+    test_deps = [
+        ":connection_java_grpc",
+        "//google/iam/v1:iam_java_grpc",
+    ],
+    deps = [
+        ":connection_java_proto",
+        "//google/iam/v1:iam_java_proto",
+    ],
+)
+
+java_gapic_test(
+    name = "connection_java_gapic_test_suite",
+    test_classes = [
+        "com.google.cloud.bigqueryconnection.v1.ConnectionServiceClientTest",
+    ],
+    runtime_deps = [":connection_java_gapic_test"],
+)
+
+# Open Source Packages
+java_gapic_assembly_gradle_pkg(
+    name = "google-cloud-bigquery-connection-v1-java",
+    deps = [
+        ":connection_java_gapic",
+        ":connection_java_grpc",
+        ":connection_java_proto",
+        ":connection_proto",
+    ],
+)
+
 ##############################################################################
 # Go
 ##############################################################################
 load(
     "@com_google_googleapis_imports//:imports.bzl",
+    "go_gapic_assembly_pkg",
+    "go_gapic_library",
     "go_proto_library",
+    "go_test",
 )
 
 go_proto_library(
@@ -65,12 +115,43 @@ go_proto_library(
     ],
 )
 
+go_gapic_library(
+    name = "connection_go_gapic",
+    srcs = [":connection_proto_with_info"],
+    grpc_service_config = "bigqueryconnection_grpc_service_config.json",
+    importpath = "cloud.google.com/go/bigquery/connection/apiv1;connection",
+    service_yaml = "bigqueryconnection_v1.yaml",
+    deps = [
+        ":connection_go_proto",
+        "//google/iam/v1:iam_go_proto",
+    ],
+)
+
+go_test(
+    name = "connection_go_gapic_test",
+    srcs = [":connection_go_gapic_srcjar_test"],
+    embed = [":connection_go_gapic"],
+    importpath = "cloud.google.com/go/bigquery/connection/apiv1",
+)
+
+# Open Source Packages
+go_gapic_assembly_pkg(
+    name = "gapi-cloud-bigquery-connection-v1-go",
+    deps = [
+        ":connection_go_gapic",
+        ":connection_go_gapic_srcjar-test.srcjar",
+        ":connection_go_proto",
+    ],
+)
+
 ##############################################################################
 # Python
 ##############################################################################
 load(
     "@com_google_googleapis_imports//:imports.bzl",
     "moved_proto_library",
+    "py_gapic_assembly_pkg",
+    "py_gapic_library",
     "py_grpc_library",
     "py_proto_library",
 )
@@ -103,11 +184,35 @@ py_grpc_library(
     deps = [":connection_py_proto"],
 )
 
+py_gapic_library(
+    name = "connection_py_gapic",
+    src = ":connection_proto_with_info",
+    gapic_yaml = "connection_gapic.yaml",
+    package = "google.cloud.bigquery.connection.v1",
+    service_yaml = "bigqueryconnection_v1.yaml",
+    deps = [
+        ":connection_py_grpc",
+        ":connection_py_proto",
+    ],
+)
+
+# Open Source Packages
+py_gapic_assembly_pkg(
+    name = "bigquery-connection-v1-py",
+    deps = [
+        ":connection_py_gapic",
+        ":connection_py_grpc",
+        ":connection_py_proto",
+    ],
+)
+
 ##############################################################################
 # PHP
 ##############################################################################
 load(
     "@com_google_googleapis_imports//:imports.bzl",
+    "php_gapic_assembly_pkg",
+    "php_gapic_library",
     "php_grpc_library",
     "php_proto_library",
 )
@@ -123,6 +228,28 @@ php_grpc_library(
     deps = [":connection_php_proto"],
 )
 
+php_gapic_library(
+    name = "connection_php_gapic",
+    src = ":connection_proto_with_info",
+    gapic_yaml = "connection_gapic.yaml",
+    package = "google.cloud.bigquery.connection.v1",
+    service_yaml = "bigqueryconnection_v1.yaml",
+    deps = [
+        ":connection_php_grpc",
+        ":connection_php_proto",
+    ],
+)
+
+# Open Source Packages
+php_gapic_assembly_pkg(
+    name = "google-cloud-bigquery-connection-v1-php",
+    deps = [
+        ":connection_php_gapic",
+        ":connection_php_grpc",
+        ":connection_php_proto",
+    ],
+)
+
 ##############################################################################
 # Node.js
 ##############################################################################
@@ -132,12 +259,31 @@ load(
     "nodejs_gapic_library",
 )
 
+nodejs_gapic_library(
+    name = "connection_nodejs_gapic",
+    src = ":connection_proto_with_info",
+    gapic_yaml = "connection_gapic.yaml",
+    grpc_service_config = "bigqueryconnection_grpc_service_config.json",
+    package = "google.cloud.bigquery.connection.v1",
+    service_yaml = "bigqueryconnection_v1.yaml",
+    deps = [],
+)
+
+nodejs_gapic_assembly_pkg(
+    name = "bigquery-connection-v1-nodejs",
+    deps = [
+        ":connection_nodejs_gapic",
+        ":connection_proto",
+    ],
+)
 
 ##############################################################################
 # Ruby
 ##############################################################################
 load(
     "@com_google_googleapis_imports//:imports.bzl",
+    "ruby_gapic_assembly_pkg",
+    "ruby_gapic_library",
     "ruby_grpc_library",
     "ruby_proto_library",
 )
@@ -153,11 +299,35 @@ ruby_grpc_library(
     deps = [":connection_ruby_proto"],
 )
 
+ruby_gapic_library(
+    name = "connection_ruby_gapic",
+    src = ":connection_proto_with_info",
+    gapic_yaml = "connection_gapic.yaml",
+    package = "google.cloud.bigquery.connection.v1",
+    service_yaml = "bigqueryconnection_v1.yaml",
+    deps = [
+        ":connection_ruby_grpc",
+        ":connection_ruby_proto",
+    ],
+)
+
+# Open Source Packages
+ruby_gapic_assembly_pkg(
+    name = "google-cloud-bigquery-connection-v1-ruby",
+    deps = [
+        ":connection_ruby_gapic",
+        ":connection_ruby_grpc",
+        ":connection_ruby_proto",
+    ],
+)
+
 ##############################################################################
 # C#
 ##############################################################################
 load(
     "@com_google_googleapis_imports//:imports.bzl",
+    "csharp_gapic_assembly_pkg",
+    "csharp_gapic_library",
     "csharp_grpc_library",
     "csharp_proto_library",
 )
@@ -173,7 +343,29 @@ csharp_grpc_library(
     deps = [":connection_csharp_proto"],
 )
 
+csharp_gapic_library(
+    name = "connection_csharp_gapic",
+    src = ":connection_proto_with_info",
+    gapic_yaml = "connection_gapic.yaml",
+    package = "google.cloud.bigquery.connection.v1",
+    service_yaml = "bigqueryconnection_v1.yaml",
+    deps = [
+        ":connection_csharp_grpc",
+        ":connection_csharp_proto",
+    ],
+)
+
+# Open Source Packages
+csharp_gapic_assembly_pkg(
+    name = "google-cloud-bigquery-connection-v1-csharp",
+    deps = [
+        ":connection_csharp_gapic",
+        ":connection_csharp_grpc",
+        ":connection_csharp_proto",
+    ],
+)
+
 ##############################################################################
 # C++
 ##############################################################################
-# Put your C++ code here
+# Put your C++ rules here
diff --git a/google/cloud/bigquery/connection/v1/connection.proto b/google/cloud/bigquery/connection/v1/connection.proto
index 3bde8c124..71290a6bc 100644
--- a/google/cloud/bigquery/connection/v1/connection.proto
+++ b/google/cloud/bigquery/connection/v1/connection.proto
@@ -28,7 +28,6 @@ import "google/protobuf/wrappers.proto";
 
 option csharp_namespace = "Google.Cloud.BigQuery.Connection.V1";
 option go_package = "google.golang.org/genproto/googleapis/cloud/bigquery/connection/v1;connection";
-option java_multiple_files = true;
 option java_outer_classname = "ConnectionProto";
 option java_package = "com.google.cloud.bigquery.connection.v1";
 
@@ -61,6 +60,7 @@ service ConnectionService {
     option (google.api.http) = {
       get: "/v1/{parent=projects/*/locations/*}/connections"
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Updates the specified connection. For security reasons, also resets
@@ -95,7 +95,7 @@ service ConnectionService {
   // Sets the access control policy on the specified resource. Replaces any
   // existing policy.
   //
-  // Can return Public Errors: NOT_FOUND, INVALID_ARGUMENT and PERMISSION_DENIED
+  // Can return `NOT_FOUND`, `INVALID_ARGUMENT`, and `PERMISSION_DENIED` errors.
   rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest) returns (google.iam.v1.Policy) {
     option (google.api.http) = {
       post: "/v1/{resource=projects/*/locations/*/connections/*}:setIamPolicy"
@@ -106,7 +106,7 @@ service ConnectionService {
 
   // Returns permissions that a caller has on the specified resource.
   // If the resource does not exist, this will return an empty set of
-  // permissions, not a NOT_FOUND error.
+  // permissions, not a `NOT_FOUND` error.
   //
   // Note: This operation is designed to be used for building permission-aware
   // UIs and command-line tools, not for authorization checking. This operation
diff --git a/google/cloud/bigquery/connection/v1/connection_gapic.yaml b/google/cloud/bigquery/connection/v1/connection_gapic.yaml
new file mode 100644
index 000000000..354bfddbe
--- /dev/null
+++ b/google/cloud/bigquery/connection/v1/connection_gapic.yaml
@@ -0,0 +1,9 @@
+type: com.google.api.codegen.ConfigProto
+config_schema_version: 2.0.0
+language_settings:
+  java:
+    package_name: com.google.cloud.bigqueryconnection.v1
+  python:
+    package_name: google.cloud.bigquery.connection_v1.gapic
+  go:
+    package_name: cloud.google.com/go/bigquery/connection/apiv1
diff --git a/google/cloud/bigquery/connection/v1beta1/BUILD.bazel b/google/cloud/bigquery/connection/v1beta1/BUILD.bazel
index f2ccafc2a..60f198b7e 100644
--- a/google/cloud/bigquery/connection/v1beta1/BUILD.bazel
+++ b/google/cloud/bigquery/connection/v1beta1/BUILD.bazel
@@ -115,36 +115,34 @@ go_proto_library(
     ],
 )
 
-#go_gapic_library(
-#    name = "connection_go_gapic",
-#    src = ":connection_proto_with_info",
-#    gapic_yaml = "bigqueryconnection_gapic.yaml",
-#    importpath = "cloud.google.com/go/bigquery/connection/apiv1beta1",
-#    package = "google.cloud.bigquery.connection.v1beta1",
-#    service_yaml = "bigqueryconnection_v1beta1.yaml",
-#    deps = [
-#        ":connection_go_proto",
-#        "//google/iam/v1:iam_go_proto",
-#    ],
-#)
-#
-#go_test(
-#    name = "connection_go_gapic_test",
-#    srcs = [":connection_go_gapic_srcjar_test"],
-#    embed = [":connection_go_gapic"],
-#    importpath = "cloud.google.com/go/bigquery/connection/apiv1beta1",
-#)
-#
-## Open Source Packages
-#go_gapic_assembly_pkg(
-#    name = "gapi-cloud-bigquery-connection-v1beta1-go",
-#    deps = [
-#        ":connection_go_gapic",
-#        ":connection_go_gapic_srcjar-smoke-test.srcjar",
-#        ":connection_go_gapic_srcjar-test.srcjar",
-#        ":connection_go_proto",
-#    ],
-#)
+go_gapic_library(
+    name = "connection_go_gapic",
+    srcs = [":connection_proto_with_info"],
+    grpc_service_config = "bigqueryconnection_grpc_service_config.json",
+    importpath = "cloud.google.com/go/bigquery/connection/apiv1beta1;connection",
+    service_yaml = "bigqueryconnection_v1beta1.yaml",
+    deps = [
+        ":connection_go_proto",
+        "//google/iam/v1:iam_go_proto",
+    ],
+)
+
+go_test(
+    name = "connection_go_gapic_test",
+    srcs = [":connection_go_gapic_srcjar_test"],
+    embed = [":connection_go_gapic"],
+    importpath = "cloud.google.com/go/bigquery/connection/apiv1beta1",
+)
+
+# Open Source Packages
+go_gapic_assembly_pkg(
+    name = "gapi-cloud-bigquery-connection-v1beta1-go",
+    deps = [
+        ":connection_go_gapic",
+        ":connection_go_gapic_srcjar-test.srcjar",
+        ":connection_go_proto",
+    ],
+)
 
 ##############################################################################
 # Python
@@ -264,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "connection_nodejs_gapic",
     src = ":connection_proto_with_info",
-    gapic_yaml = "bigqueryconnection_gapic.yaml",
+    grpc_service_config = "bigqueryconnection_grpc_service_config.json",
     package = "google.cloud.bigquery.connection.v1beta1",
     service_yaml = "bigqueryconnection_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/datatransfer/v1/BUILD.bazel b/google/cloud/bigquery/datatransfer/v1/BUILD.bazel
index 47f825f96..c606d03f8 100644
--- a/google/cloud/bigquery/datatransfer/v1/BUILD.bazel
+++ b/google/cloud/bigquery/datatransfer/v1/BUILD.bazel
@@ -265,7 +265,7 @@ load(
 nodejs_gapic_library(
     name = "datatransfer_nodejs_gapic",
     src = ":datatransfer_proto_with_info",
-    gapic_yaml = "bigquerydatatransfer_gapic.yaml",
+    grpc_service_config = "bigquerydatatransfer_grpc_service_config.json",
     package = "google.cloud.bigquery.datatransfer.v1",
     service_yaml = "bigquerydatatransfer_v1.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/reservation/v1/BUILD.bazel b/google/cloud/bigquery/reservation/v1/BUILD.bazel
index 15108ea72..2cb2cc31f 100644
--- a/google/cloud/bigquery/reservation/v1/BUILD.bazel
+++ b/google/cloud/bigquery/reservation/v1/BUILD.bazel
@@ -257,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "reservation_nodejs_gapic",
     src = ":reservation_proto_with_info",
-    gapic_yaml = "bigqueryreservation_gapic.yaml",
+    grpc_service_config = "bigqueryreservation_grpc_service_config.json",
     package = "google.cloud.bigquery.reservation.v1",
     service_yaml = "bigqueryreservation_v1.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/reservation/v1/reservation.proto b/google/cloud/bigquery/reservation/v1/reservation.proto
index e3c24d422..62a237f2b 100644
--- a/google/cloud/bigquery/reservation/v1/reservation.proto
+++ b/google/cloud/bigquery/reservation/v1/reservation.proto
@@ -25,6 +25,7 @@ import "google/protobuf/field_mask.proto";
 import "google/protobuf/timestamp.proto";
 import "google/rpc/status.proto";
 
+option csharp_namespace = "Google.Cloud.BigQuery.Reservation.V1";
 option go_package = "google.golang.org/genproto/googleapis/cloud/bigquery/reservation/v1;reservation";
 option java_multiple_files = true;
 option java_outer_classname = "ReservationProto";
@@ -61,8 +62,7 @@ service ReservationService {
   }
 
   // Lists all the reservations for the project in the specified location.
-  rpc ListReservations(ListReservationsRequest)
-      returns (ListReservationsResponse) {
+  rpc ListReservations(ListReservationsRequest) returns (ListReservationsResponse) {
     option (google.api.http) = {
       get: "/v1/{parent=projects/*/locations/*}/reservations"
     };
@@ -80,8 +80,7 @@ service ReservationService {
   // Deletes a reservation.
   // Returns `google.rpc.Code.FAILED_PRECONDITION` when reservation has
   // assignments.
-  rpc DeleteReservation(DeleteReservationRequest)
-      returns (google.protobuf.Empty) {
+  rpc DeleteReservation(DeleteReservationRequest) returns (google.protobuf.Empty) {
     option (google.api.http) = {
       delete: "/v1/{name=projects/*/locations/*/reservations/*}"
     };
@@ -98,8 +97,7 @@ service ReservationService {
   }
 
   // Creates a new capacity commitment resource.
-  rpc CreateCapacityCommitment(CreateCapacityCommitmentRequest)
-      returns (CapacityCommitment) {
+  rpc CreateCapacityCommitment(CreateCapacityCommitmentRequest) returns (CapacityCommitment) {
     option (google.api.http) = {
       post: "/v1/{parent=projects/*/locations/*}/capacityCommitments"
       body: "capacity_commitment"
@@ -108,8 +106,7 @@ service ReservationService {
   }
 
   // Lists all the capacity commitments for the admin project.
-  rpc ListCapacityCommitments(ListCapacityCommitmentsRequest)
-      returns (ListCapacityCommitmentsResponse) {
+  rpc ListCapacityCommitments(ListCapacityCommitmentsRequest) returns (ListCapacityCommitmentsResponse) {
     option (google.api.http) = {
       get: "/v1/{parent=projects/*/locations/*}/capacityCommitments"
     };
@@ -117,8 +114,7 @@ service ReservationService {
   }
 
   // Returns information about the capacity commitment.
-  rpc GetCapacityCommitment(GetCapacityCommitmentRequest)
-      returns (CapacityCommitment) {
+  rpc GetCapacityCommitment(GetCapacityCommitmentRequest) returns (CapacityCommitment) {
     option (google.api.http) = {
       get: "/v1/{name=projects/*/locations/*/capacityCommitments/*}"
     };
@@ -128,8 +124,7 @@ service ReservationService {
   // Deletes a capacity commitment. Attempting to delete capacity commitment
   // before its commitment_end_time will fail with the error code
   // `google.rpc.Code.FAILED_PRECONDITION`.
-  rpc DeleteCapacityCommitment(DeleteCapacityCommitmentRequest)
-      returns (google.protobuf.Empty) {
+  rpc DeleteCapacityCommitment(DeleteCapacityCommitmentRequest) returns (google.protobuf.Empty) {
     option (google.api.http) = {
       delete: "/v1/{name=projects/*/locations/*/capacityCommitments/*}"
     };
@@ -143,8 +138,7 @@ service ReservationService {
   // Plan can only be changed to a plan of a longer commitment period.
   // Attempting to change to a plan with shorter commitment period will fail
   // with the error code `google.rpc.Code.FAILED_PRECONDITION`.
-  rpc UpdateCapacityCommitment(UpdateCapacityCommitmentRequest)
-      returns (CapacityCommitment) {
+  rpc UpdateCapacityCommitment(UpdateCapacityCommitmentRequest) returns (CapacityCommitment) {
     option (google.api.http) = {
       patch: "/v1/{capacity_commitment.name=projects/*/locations/*/capacityCommitments/*}"
       body: "capacity_commitment"
@@ -160,8 +154,7 @@ service ReservationService {
   // For example, in order to downgrade from 10000 slots to 8000, you might
   // split a 10000 capacity commitment into commitments of 2000 and 8000. Then,
   // you would change the plan of the first one to `FLEX` and then delete it.
-  rpc SplitCapacityCommitment(SplitCapacityCommitmentRequest)
-      returns (SplitCapacityCommitmentResponse) {
+  rpc SplitCapacityCommitment(SplitCapacityCommitmentRequest) returns (SplitCapacityCommitmentResponse) {
     option (google.api.http) = {
       post: "/v1/{name=projects/*/locations/*/capacityCommitments/*}:split"
       body: "*"
@@ -176,8 +169,7 @@ service ReservationService {
   //
   // Attempting to merge capacity commitments of different plan will fail
   // with the error code `google.rpc.Code.FAILED_PRECONDITION`.
-  rpc MergeCapacityCommitments(MergeCapacityCommitmentsRequest)
-      returns (CapacityCommitment) {
+  rpc MergeCapacityCommitments(MergeCapacityCommitmentsRequest) returns (CapacityCommitment) {
     option (google.api.http) = {
       post: "/v1/{parent=projects/*/locations/*}/capacityCommitments:merge"
       body: "*"
@@ -244,8 +236,7 @@ service ReservationService {
   // specified project and location will be listed.
   //
   // **Note** "-" cannot be used for projects nor locations.
-  rpc ListAssignments(ListAssignmentsRequest)
-      returns (ListAssignmentsResponse) {
+  rpc ListAssignments(ListAssignmentsRequest) returns (ListAssignmentsResponse) {
     option (google.api.http) = {
       get: "/v1/{parent=projects/*/locations/*/reservations/*}/assignments"
     };
@@ -267,8 +258,7 @@ service ReservationService {
   // affect the other assignment ``. After said deletion,
   // queries from `project1` will still use `res1` while queries from
   // `project2` will switch to use on-demand mode.
-  rpc DeleteAssignment(DeleteAssignmentRequest)
-      returns (google.protobuf.Empty) {
+  rpc DeleteAssignment(DeleteAssignmentRequest) returns (google.protobuf.Empty) {
     option (google.api.http) = {
       delete: "/v1/{name=projects/*/locations/*/reservations/*/assignments/*}"
     };
@@ -298,8 +288,7 @@ service ReservationService {
   //
   // **Note** "-" cannot be used for projects
   // nor locations.
-  rpc SearchAssignments(SearchAssignmentsRequest)
-      returns (SearchAssignmentsResponse) {
+  rpc SearchAssignments(SearchAssignmentsRequest) returns (SearchAssignmentsResponse) {
     option (google.api.http) = {
       get: "/v1/{parent=projects/*/locations/*}:searchAssignments"
     };
@@ -449,14 +438,12 @@ message CapacityCommitment {
   // Output only. State of the commitment.
   State state = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
 
-  // Output only. The end of the current commitment period. It is applicable
-  // only for ACTIVE capacity commitments.
-  google.protobuf.Timestamp commitment_end_time = 5
-      [(google.api.field_behavior) = OUTPUT_ONLY];
+  // Output only. The end of the current commitment period. It is applicable only for ACTIVE
+  // capacity commitments.
+  google.protobuf.Timestamp commitment_end_time = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // Output only. For FAILED commitment plan, provides the reason of failure.
-  google.rpc.Status failure_status = 7
-      [(google.api.field_behavior) = OUTPUT_ONLY];
+  google.rpc.Status failure_status = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // The plan this capacity commitment is converted to after commitment_end_time
   // passes. Once the plan is changed, committed period is extended according to
@@ -464,8 +451,7 @@ message CapacityCommitment {
   CommitmentPlan renewal_plan = 8;
 }
 
-// The request for
-// [ReservationService.CreateReservation][google.cloud.bigquery.reservation.v1.ReservationService.CreateReservation].
+// The request for [ReservationService.CreateReservation][google.cloud.bigquery.reservation.v1.ReservationService.CreateReservation].
 message CreateReservationRequest {
   // Required. Project, location. E.g.,
   // `projects/myproject/locations/US`
@@ -484,11 +470,10 @@ message CreateReservationRequest {
   Reservation reservation = 3;
 }
 
-// The request for
-// [ReservationService.ListReservations][google.cloud.bigquery.reservation.v1.ReservationService.ListReservations].
+// The request for [ReservationService.ListReservations][google.cloud.bigquery.reservation.v1.ReservationService.ListReservations].
 message ListReservationsRequest {
   // Required. The parent resource name containing project and location, e.g.:
-  //   "projects/myproject/locations/US"
+  //   `projects/myproject/locations/US`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -503,8 +488,7 @@ message ListReservationsRequest {
   string page_token = 3;
 }
 
-// The response for
-// [ReservationService.ListReservations][google.cloud.bigquery.reservation.v1.ReservationService.ListReservations].
+// The response for [ReservationService.ListReservations][google.cloud.bigquery.reservation.v1.ReservationService.ListReservations].
 message ListReservationsResponse {
   // List of reservations visible to the user.
   repeated Reservation reservations = 1;
@@ -514,8 +498,7 @@ message ListReservationsResponse {
   string next_page_token = 2;
 }
 
-// The request for
-// [ReservationService.GetReservation][google.cloud.bigquery.reservation.v1.ReservationService.GetReservation].
+// The request for [ReservationService.GetReservation][google.cloud.bigquery.reservation.v1.ReservationService.GetReservation].
 message GetReservationRequest {
   // Required. Resource name of the reservation to retrieve. E.g.,
   //    `projects/myproject/locations/US/reservations/team1-prod`
@@ -527,8 +510,7 @@ message GetReservationRequest {
   ];
 }
 
-// The request for
-// [ReservationService.DeleteReservation][google.cloud.bigquery.reservation.v1.ReservationService.DeleteReservation].
+// The request for [ReservationService.DeleteReservation][google.cloud.bigquery.reservation.v1.ReservationService.DeleteReservation].
 message DeleteReservationRequest {
   // Required. Resource name of the reservation to retrieve. E.g.,
   //    `projects/myproject/locations/US/reservations/team1-prod`
@@ -540,8 +522,7 @@ message DeleteReservationRequest {
   ];
 }
 
-// The request for
-// [ReservationService.UpdateReservation][google.cloud.bigquery.reservation.v1.ReservationService.UpdateReservation].
+// The request for [ReservationService.UpdateReservation][google.cloud.bigquery.reservation.v1.ReservationService.UpdateReservation].
 message UpdateReservationRequest {
   // Content of the reservation to update.
   Reservation reservation = 1;
@@ -550,11 +531,10 @@ message UpdateReservationRequest {
   google.protobuf.FieldMask update_mask = 2;
 }
 
-// The request for
-// [ReservationService.CreateCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.CreateCapacityCommitment].
+// The request for [ReservationService.CreateCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.CreateCapacityCommitment].
 message CreateCapacityCommitmentRequest {
   // Required. Resource name of the parent reservation. E.g.,
-  //    projects/myproject/locations/US
+  //    `projects/myproject/locations/US`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -570,11 +550,10 @@ message CreateCapacityCommitmentRequest {
   bool enforce_single_admin_project_per_org = 4;
 }
 
-// The request for
-// [ReservationService.ListCapacityCommitments][google.cloud.bigquery.reservation.v1.ReservationService.ListCapacityCommitments].
+// The request for [ReservationService.ListCapacityCommitments][google.cloud.bigquery.reservation.v1.ReservationService.ListCapacityCommitments].
 message ListCapacityCommitmentsRequest {
   // Required. Resource name of the parent reservation. E.g.,
-  //    projects/myproject/locations/US
+  //    `projects/myproject/locations/US`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -589,8 +568,7 @@ message ListCapacityCommitmentsRequest {
   string page_token = 3;
 }
 
-// The response for
-// [ReservationService.ListCapacityCommitments][google.cloud.bigquery.reservation.v1.ReservationService.ListCapacityCommitments].
+// The response for [ReservationService.ListCapacityCommitments][google.cloud.bigquery.reservation.v1.ReservationService.ListCapacityCommitments].
 message ListCapacityCommitmentsResponse {
   // List of capacity commitments visible to the user.
   repeated CapacityCommitment capacity_commitments = 1;
@@ -600,11 +578,10 @@ message ListCapacityCommitmentsResponse {
   string next_page_token = 2;
 }
 
-// The request for
-// [ReservationService.GetCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.GetCapacityCommitment].
+// The request for [ReservationService.GetCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.GetCapacityCommitment].
 message GetCapacityCommitmentRequest {
   // Required. Resource name of the capacity commitment to retrieve. E.g.,
-  //    projects/myproject/locations/US/capacityCommitments/123
+  //    `projects/myproject/locations/US/capacityCommitments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -613,11 +590,10 @@ message GetCapacityCommitmentRequest {
   ];
 }
 
-// The request for
-// [ReservationService.DeleteCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.DeleteCapacityCommitment].
+// The request for [ReservationService.DeleteCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.DeleteCapacityCommitment].
 message DeleteCapacityCommitmentRequest {
   // Required. Resource name of the capacity commitment to delete. E.g.,
-  //    projects/myproject/locations/US/capacityCommitments/123
+  //    `projects/myproject/locations/US/capacityCommitments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -626,8 +602,7 @@ message DeleteCapacityCommitmentRequest {
   ];
 }
 
-// The request for
-// [ReservationService.UpdateCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.UpdateCapacityCommitment].
+// The request for [ReservationService.UpdateCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.UpdateCapacityCommitment].
 message UpdateCapacityCommitmentRequest {
   // Content of the capacity commitment to update.
   CapacityCommitment capacity_commitment = 1;
@@ -636,11 +611,10 @@ message UpdateCapacityCommitmentRequest {
   google.protobuf.FieldMask update_mask = 2;
 }
 
-// The request for
-// [ReservationService.SplitCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.SplitCapacityCommitment].
+// The request for [ReservationService.SplitCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.SplitCapacityCommitment].
 message SplitCapacityCommitmentRequest {
   // Required. The resource name e.g.,:
-  //   projects/myproject/locations/US/capacityCommitments/123
+  //  `projects/myproject/locations/US/capacityCommitments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -652,8 +626,7 @@ message SplitCapacityCommitmentRequest {
   int64 slot_count = 2;
 }
 
-// The response for
-// [ReservationService.SplitCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.SplitCapacityCommitment].
+// The response for [ReservationService.SplitCapacityCommitment][google.cloud.bigquery.reservation.v1.ReservationService.SplitCapacityCommitment].
 message SplitCapacityCommitmentResponse {
   // First capacity commitment, result of a split.
   CapacityCommitment first = 1;
@@ -662,18 +635,19 @@ message SplitCapacityCommitmentResponse {
   CapacityCommitment second = 2;
 }
 
-// The request for
-// [ReservationService.MergeCapacityCommitments][google.cloud.bigquery.reservation.v1.ReservationService.MergeCapacityCommitments].
+// The request for [ReservationService.MergeCapacityCommitments][google.cloud.bigquery.reservation.v1.ReservationService.MergeCapacityCommitments].
 message MergeCapacityCommitmentsRequest {
   // Parent resource that identifies admin project and location e.g.,
-  // projects/myproject/locations/us
+  //  `projects/myproject/locations/us`
   string parent = 1 [(google.api.resource_reference) = {
-    child_type: "bigqueryreservation.googleapis.com/CapacityCommitment"
-  }];
+                       child_type: "bigqueryreservation.googleapis.com/CapacityCommitment"
+                     }];
 
   // Ids of capacity commitments to merge.
   // These capacity commitments must exist under admin project and location
   // specified in the parent.
+  // ID is the last portion of capacity commitment name e.g., 'abc' for
+  // projects/myproject/locations/US/capacityCommitments/abc
   repeated string capacity_commitment_ids = 2;
 }
 
@@ -728,8 +702,7 @@ message Assignment {
   State state = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
 }
 
-// The request for
-// [ReservationService.CreateAssignment][google.cloud.bigquery.reservation.v1.ReservationService.CreateAssignment].
+// The request for [ReservationService.CreateAssignment][google.cloud.bigquery.reservation.v1.ReservationService.CreateAssignment].
 // Note: "bigquery.reservationAssignments.create" permission is required on the
 // related assignee.
 message CreateAssignmentRequest {
@@ -746,8 +719,7 @@ message CreateAssignmentRequest {
   Assignment assignment = 2;
 }
 
-// The request for
-// [ReservationService.ListAssignments][google.cloud.bigquery.reservation.v1.ReservationService.ListAssignments].
+// The request for [ReservationService.ListAssignments][google.cloud.bigquery.reservation.v1.ReservationService.ListAssignments].
 message ListAssignmentsRequest {
   // Required. The parent resource name e.g.:
   //
@@ -759,7 +731,7 @@ message ListAssignmentsRequest {
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
-      type: "bigqueryreservation.googleapis.com/Reservation"
+      child_type: "bigqueryreservation.googleapis.com/Assignment"
     }
   ];
 
@@ -770,8 +742,7 @@ message ListAssignmentsRequest {
   string page_token = 3;
 }
 
-// The response for
-// [ReservationService.ListAssignments][google.cloud.bigquery.reservation.v1.ReservationService.ListAssignments].
+// The response for [ReservationService.ListAssignments][google.cloud.bigquery.reservation.v1.ReservationService.ListAssignments].
 message ListAssignmentsResponse {
   // List of assignments visible to the user.
   repeated Assignment assignments = 1;
@@ -781,8 +752,7 @@ message ListAssignmentsResponse {
   string next_page_token = 2;
 }
 
-// The request for
-// [ReservationService.DeleteAssignment][google.cloud.bigquery.reservation.v1.ReservationService.DeleteAssignment].
+// The request for [ReservationService.DeleteAssignment][google.cloud.bigquery.reservation.v1.ReservationService.DeleteAssignment].
 // Note: "bigquery.reservationAssignments.delete" permission is required on the
 // related assignee.
 message DeleteAssignmentRequest {
@@ -801,13 +771,13 @@ message DeleteAssignmentRequest {
 // Note: "bigquery.reservationAssignments.search" permission is required on the
 // related assignee.
 message SearchAssignmentsRequest {
-  // Required. The resource name of the admin project(containing project and
-  // location), e.g.:
-  //   "projects/myproject/locations/US".
+  // Required. The resource name of the admin project(containing project and location),
+  // e.g.:
+  //   `projects/myproject/locations/US`.
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
-      child_type: "bigqueryreservation.googleapis.com/Assignment"
+      type: "locations.googleapis.com/Location"
     }
   ];
 
@@ -827,8 +797,7 @@ message SearchAssignmentsRequest {
   string page_token = 4;
 }
 
-// The response for
-// [ReservationService.SearchAssignments][google.cloud.bigquery.reservation.v1.ReservationService.SearchAssignments].
+// The response for [ReservationService.SearchAssignments][google.cloud.bigquery.reservation.v1.ReservationService.SearchAssignments].
 message SearchAssignmentsResponse {
   // List of assignments visible to the user.
   repeated Assignment assignments = 1;
@@ -860,7 +829,9 @@ message MoveAssignmentRequest {
 
   // The new reservation ID, e.g.:
   //   `projects/myotherproject/locations/US/reservations/team2-prod`
-  string destination_id = 3;
+  string destination_id = 3 [(google.api.resource_reference) = {
+                               child_type: "bigqueryreservation.googleapis.com/Assignment"
+                             }];
 }
 
 // Represents a BI Reservation.
@@ -876,8 +847,7 @@ message BiReservation {
   string name = 1;
 
   // Output only. The last update timestamp of a reservation.
-  google.protobuf.Timestamp update_time = 3
-      [(google.api.field_behavior) = OUTPUT_ONLY];
+  google.protobuf.Timestamp update_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // Size of a reservation, in bytes.
   int64 size = 4;
diff --git a/google/cloud/bigquery/reservation/v1beta1/BUILD.bazel b/google/cloud/bigquery/reservation/v1beta1/BUILD.bazel
index 44b12b6d0..60f5c6a70 100644
--- a/google/cloud/bigquery/reservation/v1beta1/BUILD.bazel
+++ b/google/cloud/bigquery/reservation/v1beta1/BUILD.bazel
@@ -257,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "reservation_nodejs_gapic",
     src = ":reservation_proto_with_info",
-    gapic_yaml = "bigqueryreservation_gapic.yaml",
+    grpc_service_config = "bigqueryreservation_grpc_service_config.json",
     package = "google.cloud.bigquery.reservation.v1beta1",
     service_yaml = "bigqueryreservation_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_gapic.legacy.yaml b/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_gapic.legacy.yaml
index 10260b254..8ecc0900b 100644
--- a/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_gapic.legacy.yaml
+++ b/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_gapic.legacy.yaml
@@ -202,6 +202,20 @@ interfaces:
     field_name_patterns:
       reservation.name: reservation
     timeout_millis: 60000
+  - name: CreateCapacityCommitment
+    flattening:
+      groups:
+      - parameters:
+        - parent
+        - capacity_commitment
+    required_fields:
+    - parent
+    - capacity_commitment
+    retry_codes_name: non_idempotent
+    retry_params_name: default
+    field_name_patterns:
+      parent: location
+    timeout_millis: 60000
   - name: ListCapacityCommitments
     flattening:
       groups:
diff --git a/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_grpc_service_config.json b/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_grpc_service_config.json
index f7c774fdb..cafd5140a 100755
--- a/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_grpc_service_config.json
+++ b/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_grpc_service_config.json
@@ -10,6 +10,10 @@
           "service": "google.cloud.bigquery.reservation.v1beta1.ReservationService",
           "method": "UpdateReservation"
         },
+        {
+          "service": "google.cloud.bigquery.reservation.v1beta1.ReservationService",
+          "method": "CreateCapacityCommitment"
+        },
         {
           "service": "google.cloud.bigquery.reservation.v1beta1.ReservationService",
           "method": "UpdateCapacityCommitment"
diff --git a/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_v1beta1.yaml b/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_v1beta1.yaml
index 96ff59e55..a09152d0e 100644
--- a/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_v1beta1.yaml
+++ b/google/cloud/bigquery/reservation/v1beta1/bigqueryreservation_v1beta1.yaml
@@ -9,6 +9,13 @@ apis:
 documentation:
   summary: 'A service to modify your BigQuery flat-rate reservations.'
 
+backend:
+  rules:
+  - selector: 'google.cloud.bigquery.reservation.v1beta1.ReservationService.*'
+    deadline: 30.0
+  - selector: 'google.longrunning.Operations.*'
+    deadline: 30.0
+
 authentication:
   rules:
   - selector: 'google.cloud.bigquery.reservation.v1beta1.ReservationService.*'
diff --git a/google/cloud/bigquery/reservation/v1beta1/reservation.proto b/google/cloud/bigquery/reservation/v1beta1/reservation.proto
index 2a4fb3a77..fffd94f40 100644
--- a/google/cloud/bigquery/reservation/v1beta1/reservation.proto
+++ b/google/cloud/bigquery/reservation/v1beta1/reservation.proto
@@ -37,13 +37,13 @@ option java_package = "com.google.cloud.bigquery.reservation.v1beta1";
 // parallelism. In a scan of a multi-partitioned table, a single slot operates
 // on a single partition of the table. A reservation resource exists as a child
 // resource of the admin project and location, e.g.:
-//   projects/myproject/locations/US/reservations/reservationName.
+//   `projects/myproject/locations/US/reservations/reservationName`.
 //
 // A capacity commitment is a way to purchase compute capacity for BigQuery jobs
 // (in the form of slots) with some committed period of usage. A capacity
 // commitment resource exists as a child resource of the admin project and
 // location, e.g.:
-//   projects/myproject/locations/US/capacityCommitments/id.
+//   `projects/myproject/locations/US/capacityCommitments/id`.
 service ReservationService {
   option (google.api.default_host) = "bigqueryreservation.googleapis.com";
   option (google.api.oauth_scopes) =
@@ -96,13 +96,22 @@ service ReservationService {
     option (google.api.method_signature) = "reservation,update_mask";
   }
 
+  // Creates a new capacity commitment resource.
+  rpc CreateCapacityCommitment(CreateCapacityCommitmentRequest)
+      returns (CapacityCommitment) {
+    option (google.api.http) = {
+      post: "/v1beta1/{parent=projects/*/locations/*}/capacityCommitments"
+      body: "capacity_commitment"
+    };
+    option (google.api.method_signature) = "parent,capacity_commitment";
+  }
+
   // Lists all the capacity commitments for the admin project.
   rpc ListCapacityCommitments(ListCapacityCommitmentsRequest)
       returns (ListCapacityCommitmentsResponse) {
     option (google.api.http) = {
       get: "/v1beta1/{parent=projects/*/locations/*}/capacityCommitments"
     };
-    option (google.api.method_signature) = "parent";
   }
 
   // Returns information about the capacity commitment.
@@ -127,7 +136,11 @@ service ReservationService {
 
   // Updates an existing capacity commitment.
   //
-  // Only renewal_plan field can be updated.
+  // Only `plan` and `renewal_plan` fields can be updated.
+  //
+  // Plan can only be changed to a plan of a longer commitment period.
+  // Attempting to change to a plan with shorter commitment period will fail
+  // with the error code `google.rpc.Code.FAILED_PRECONDITION`.
   rpc UpdateCapacityCommitment(UpdateCapacityCommitmentRequest)
       returns (CapacityCommitment) {
     option (google.api.http) = {
@@ -138,10 +151,13 @@ service ReservationService {
   }
 
   // Splits capacity commitment to two commitments of the same plan and
-  // commitment_end_time. A common use case to do that is to perform a downgrade
-  // e.g., in order to downgrade from 10000 slots to 8000, one might split 10000
-  // capacity commitment to 2000 and 8000, change the plan of the first one to
-  // flex and then delete it.
+  // `commitment_end_time`.
+  //
+  // A common use case is to enable downgrading commitments.
+  //
+  // For example, in order to downgrade from 10000 slots to 8000, you might
+  // split a 10000 capacity commitment into commitments of 2000 and 8000. Then,
+  // you would change the plan of the first one to `FLEX` and then delete it.
   rpc SplitCapacityCommitment(SplitCapacityCommitmentRequest)
       returns (SplitCapacityCommitmentResponse) {
     option (google.api.http) = {
@@ -151,10 +167,13 @@ service ReservationService {
     option (google.api.method_signature) = "name,slot_count";
   }
 
-  // Merges capacity commitments of the same plan into one. Resulting capacity
-  // commitment has the longer commitment_end_time out of the two. Attempting to
-  // merge capacity commitments of different plan will fail with the error code
-  // `google.rpc.Code.FAILED_PRECONDITION`.
+  // Merges capacity commitments of the same plan into a single commitment.
+  //
+  // The resulting capacity commitment has the greater commitment_end_time
+  // out of the to-be-merged capacity commitments.
+  //
+  // Attempting to merge capacity commitments of different plan will fail
+  // with the error code `google.rpc.Code.FAILED_PRECONDITION`.
   rpc MergeCapacityCommitments(MergeCapacityCommitmentsRequest)
       returns (CapacityCommitment) {
     option (google.api.http) = {
@@ -164,9 +183,34 @@ service ReservationService {
     option (google.api.method_signature) = "parent,capacity_commitment_ids";
   }
 
+  // Creates an assignment object which allows the given project to submit jobs
+  // of a certain type using slots from the specified reservation.
+  //
+  // Currently a
+  // resource (project, folder, organization) can only have one assignment per
+  // each (job_type, location) combination, and that reservation will be used
+  // for all jobs of the matching type.
+  //
+  // Different assignments can be created on different levels of the
+  // projects, folders or organization hierarchy.  During query execution,
+  // the assignment is looked up at the project, folder and organization levels
+  // in that order. The first assignment found is applied to the query.
+  //
+  // When creating assignments, it does not matter if other assignments exist at
+  // higher levels.
+  //
+  // Example:
+  //
+  // * The organization `organizationA` contains two projects, `project1`
+  //   and `project2`.
+  // * Assignments for all three entities (`organizationA`, `project1`, and
+  //   `project2`) could all be created and mapped to the same or different
+  //   reservations.
+  //
   // Returns `google.rpc.Code.PERMISSION_DENIED` if user does not have
   // 'bigquery.admin' permissions on the project using the reservation
   // and the project that owns this reservation.
+  //
   // Returns `google.rpc.Code.INVALID_ARGUMENT` when location of the assignment
   // does not match location of the reservation.
   rpc CreateAssignment(CreateAssignmentRequest) returns (Assignment) {
@@ -178,17 +222,26 @@ service ReservationService {
   }
 
   // Lists assignments.
-  // Only explicitly created assignments will be returned. E.g:
-  // organizationA contains project1 and project2. Reservation res1 exists.
-  // CreateAssignment was invoked previously and following assignments were
-  // created explicitly:
-  //   
-  //   
-  // Then this API will just return the above two assignments for reservation
-  // res1, and no expansion/merge will happen. Wildcard "-" can be used for
+  //
+  // Only explicitly created assignments will be returned.
+  //
+  // Example:
+  //
+  // * Organization `organizationA` contains two projects, `project1` and
+  //   `project2`.
+  // * Reservation `res1` exists and was created previously.
+  // * CreateAssignment was used previously to define the following
+  //   associations between entities and reservations: ``
+  //   and ``
+  //
+  // In this example, ListAssignments will just return the above two assignments
+  // for reservation `res1`, and no expansion/merge will happen.
+  //
+  // The wildcard "-" can be used for
   // reservations in the request. In that case all assignments belongs to the
-  // specified project and location will be listed. Note
-  // "-" cannot be used for projects nor locations.
+  // specified project and location will be listed.
+  //
+  // **Note** "-" cannot be used for projects nor locations.
   rpc ListAssignments(ListAssignmentsRequest)
       returns (ListAssignmentsResponse) {
     option (google.api.http) = {
@@ -198,15 +251,20 @@ service ReservationService {
   }
 
   // Deletes a assignment. No expansion will happen.
-  // E.g:
-  // organizationA contains project1 and project2. Reservation res1 exists.
-  // CreateAssignment was invoked previously and following assignments were
-  // created explicitly:
-  //   
-  //   
-  // Then deletion of  won't affect . After
-  // deletion of , queries from project1 will still use
-  // res1, while queries from project2 will use on-demand mode.
+  //
+  // Example:
+  //
+  // * Organization `organizationA` contains two projects, `project1` and
+  //   `project2`.
+  // * Reservation `res1` exists and was created previously.
+  // * CreateAssignment was used previously to define the following
+  //   associations between entities and reservations: ``
+  //   and ``
+  //
+  // In this example, deletion of the `` assignment won't
+  // affect the other assignment ``. After said deletion,
+  // queries from `project1` will still use `res1` while queries from
+  // `project2` will switch to use on-demand mode.
   rpc DeleteAssignment(DeleteAssignmentRequest)
       returns (google.protobuf.Empty) {
     option (google.api.http) = {
@@ -217,19 +275,26 @@ service ReservationService {
 
   // Looks up assignments for a specified resource for a particular region.
   // If the request is about a project:
-  //   1) Assignments created on the project will be returned if they exist.
-  //   2) Otherwise assignments created on the closest ancestor will be
-  //   returned. 3) Assignments for different JobTypes will all be returned.
-  // Same logic applies if the request is about a folder.
+  //
+  // 1. Assignments created on the project will be returned if they exist.
+  // 2. Otherwise assignments created on the closest ancestor will be
+  //    returned.
+  // 3. Assignments for different JobTypes will all be returned.
+  //
+  // The same logic applies if the request is about a folder.
+  //
   // If the request is about an organization, then assignments created on the
   // organization will be returned (organization doesn't have ancestors).
+  //
   // Comparing to ListAssignments, there are some behavior
   // differences:
-  //   1) permission on the assignee will be verified in this API.
-  //   2) Hierarchy lookup (project->folder->organization) happens in this API.
-  //   3) Parent here is projects/*/locations/*, instead of
-  //   projects/*/locations/*reservations/*.
-  // Note "-" cannot be used for projects
+  //
+  // 1. permission on the assignee will be verified in this API.
+  // 2. Hierarchy lookup (project->folder->organization) happens in this API.
+  // 3. Parent here is `projects/*/locations/*`, instead of
+  //    `projects/*/locations/*reservations/*`.
+  //
+  // **Note** "-" cannot be used for projects
   // nor locations.
   rpc SearchAssignments(SearchAssignmentsRequest)
       returns (SearchAssignmentsResponse) {
@@ -239,12 +304,11 @@ service ReservationService {
     option (google.api.method_signature) = "parent,query";
   }
 
-  // Moves a assignment under a new reservation. Customers can do this by
-  // deleting the existing assignment followed by creating another assignment
-  // under the new reservation, but this method provides a transactional way to
-  // do so, to make sure the assignee always has an associated reservation.
-  // Without the method customers might see some queries run on-demand which
-  // might be unexpected.
+  // Moves an assignment under a new reservation.
+  //
+  // This differs from removing an existing assignment and recreating a new one
+  // by providing a transactional change that ensures an assignee always has an
+  // associated reservation.
   rpc MoveAssignment(MoveAssignmentRequest) returns (Assignment) {
     option (google.api.http) = {
       post: "/v1beta1/{name=projects/*/locations/*/reservations/*/assignments/*}:move"
@@ -262,17 +326,19 @@ service ReservationService {
   }
 
   // Updates a BI reservation.
-  // Only fields specified in the field_mask are updated.
-  // Singleton BI reservation always exists with default size 0.
+  //
+  // Only fields specified in the `field_mask` are updated.
+  //
+  // A singleton BI reservation always exists with default size 0.
   // In order to reserve BI capacity it needs to be updated to an amount
   // greater than 0. In order to release BI capacity reservation size
   // must be set to 0.
   rpc UpdateBiReservation(UpdateBiReservationRequest) returns (BiReservation) {
     option (google.api.http) = {
-      patch: "/v1beta1/{bi_reservation.name=projects/*/locations/*/biReservation}"
-      body: "bi_reservation"
+      patch: "/v1beta1/{reservation.name=projects/*/locations/*/biReservation}"
+      body: "reservation"
     };
-    option (google.api.method_signature) = "bi_reservation,update_mask";
+    option (google.api.method_signature) = "reservation,update_mask";
   }
 }
 
@@ -284,13 +350,15 @@ message Reservation {
   };
 
   // The resource name of the reservation, e.g.,
-  // "projects/*/locations/*/reservations/team1-prod".
+  // `projects/*/locations/*/reservations/team1-prod`.
   string name = 1;
 
   // Minimum slots available to this reservation. A slot is a unit of
   // computational power in BigQuery, and serves as the unit of parallelism.
+  //
   // Queries using this reservation might use more slots during runtime if
   // ignore_idle_slots is set to false.
+  //
   // If the new reservation's slot capacity exceed the parent's slot capacity or
   // if total slot capacity of the new reservation and its siblings exceeds the
   // parent's slot capacity, the request will fail with
@@ -304,10 +372,12 @@ message Reservation {
 }
 
 // Capacity commitment is a way to purchase compute capacity for BigQuery jobs
-// (in the form of slots) with some committed period of usage. Monthly and
-// annual commitments renew by default. Only flex commitments can be removed. In
-// order to remove monthly or annual commitments, their plan needs to be changed
-// to flex first.
+// (in the form of slots) with some committed period of usage. Annual
+// commitments renew by default. Commitments can be removed after their
+// commitment end time passes.
+//
+// In order to remove annual commitment, its plan needs to be changed
+// to monthly or flex first.
 //
 // A capacity commitment resource exists as a child resource of the admin
 // project.
@@ -329,12 +399,20 @@ message CapacityCommitment {
     // any time.
     FLEX = 3;
 
+    // Trial commitments have a committed period of 182 days after becoming
+    // ACTIVE. After that, they are converted to a new commitment based on the
+    // `renewal_plan`. Default `renewal_plan` for Trial commitment is Flex so
+    // that it can be deleted right after committed period ends.
+    TRIAL = 5;
+
     // Monthly commitments have a committed period of 30 days after becoming
-    // ACTIVE.
+    // ACTIVE. After that, they are not in a committed period anymore and can be
+    // removed any time.
     MONTHLY = 2;
 
     // Annual commitments have a committed period of 365 days after becoming
-    // ACTIVE.
+    // ACTIVE. After that they are converted to a new commitment based on the
+    // renewal_plan.
     ANNUAL = 4;
   }
 
@@ -357,7 +435,7 @@ message CapacityCommitment {
   }
 
   // Output only. The resource name of the capacity commitment, e.g.,
-  //    projects/myproject/locations/US/capacityCommitments/123
+  // `projects/myproject/locations/US/capacityCommitments/123`
   string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // Number of slots in this commitment.
@@ -380,7 +458,7 @@ message CapacityCommitment {
 
   // The plan this capacity commitment is converted to after commitment_end_time
   // passes. Once the plan is changed, committed period is extended according to
-  // commitment plan. Only applicable for MONTHLY and ANNUAL commitments.
+  // commitment plan. Only applicable for ANNUAL commitments.
   CommitmentPlan renewal_plan = 8;
 }
 
@@ -388,7 +466,7 @@ message CapacityCommitment {
 // [ReservationService.CreateReservation][google.cloud.bigquery.reservation.v1beta1.ReservationService.CreateReservation].
 message CreateReservationRequest {
   // Required. Project, location. E.g.,
-  //    projects/myproject/locations/US
+  // `projects/myproject/locations/US`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -408,7 +486,7 @@ message CreateReservationRequest {
 // [ReservationService.ListReservations][google.cloud.bigquery.reservation.v1beta1.ReservationService.ListReservations].
 message ListReservationsRequest {
   // Required. The parent resource name containing project and location, e.g.:
-  //   "projects/myproject/locations/US"
+  //   `projects/myproject/locations/US`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -445,7 +523,7 @@ message ListReservationsResponse {
 // [ReservationService.GetReservation][google.cloud.bigquery.reservation.v1beta1.ReservationService.GetReservation].
 message GetReservationRequest {
   // Required. Resource name of the reservation to retrieve. E.g.,
-  //    projects/myproject/locations/US/reservations/team1-prod
+  //    `projects/myproject/locations/US/reservations/team1-prod`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -458,7 +536,7 @@ message GetReservationRequest {
 // [ReservationService.DeleteReservation][google.cloud.bigquery.reservation.v1beta1.ReservationService.DeleteReservation].
 message DeleteReservationRequest {
   // Required. Resource name of the reservation to retrieve. E.g.,
-  //    projects/myproject/locations/US/reservations/team1-prod
+  //    `projects/myproject/locations/US/reservations/team1-prod`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -477,11 +555,31 @@ message UpdateReservationRequest {
   google.protobuf.FieldMask update_mask = 2;
 }
 
+// The request for
+// [ReservationService.CreateCapacityCommitment][google.cloud.bigquery.reservation.v1beta1.ReservationService.CreateCapacityCommitment].
+message CreateCapacityCommitmentRequest {
+  // Required. Resource name of the parent reservation. E.g.,
+  //    `projects/myproject/locations/US`
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "bigqueryreservation.googleapis.com/CapacityCommitment"
+    }
+  ];
+
+  // Content of the capacity commitment to create.
+  CapacityCommitment capacity_commitment = 2;
+
+  // If true, fail the request if another project in the organization has a
+  // capacity commitment.
+  bool enforce_single_admin_project_per_org = 4;
+}
+
 // The request for
 // [ReservationService.ListCapacityCommitments][google.cloud.bigquery.reservation.v1beta1.ReservationService.ListCapacityCommitments].
 message ListCapacityCommitmentsRequest {
   // Required. Resource name of the parent reservation. E.g.,
-  //    projects/myproject/locations/US
+  //    `projects/myproject/locations/US`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -511,7 +609,7 @@ message ListCapacityCommitmentsResponse {
 // [ReservationService.GetCapacityCommitment][google.cloud.bigquery.reservation.v1beta1.ReservationService.GetCapacityCommitment].
 message GetCapacityCommitmentRequest {
   // Required. Resource name of the capacity commitment to retrieve. E.g.,
-  //    projects/myproject/locations/US/capacityCommitments/123
+  //    `projects/myproject/locations/US/capacityCommitments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -524,7 +622,7 @@ message GetCapacityCommitmentRequest {
 // [ReservationService.DeleteCapacityCommitment][google.cloud.bigquery.reservation.v1beta1.ReservationService.DeleteCapacityCommitment].
 message DeleteCapacityCommitmentRequest {
   // Required. Resource name of the capacity commitment to delete. E.g.,
-  //    projects/myproject/locations/US/capacityCommitments/123
+  //    `projects/myproject/locations/US/capacityCommitments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -547,7 +645,7 @@ message UpdateCapacityCommitmentRequest {
 // [ReservationService.SplitCapacityCommitment][google.cloud.bigquery.reservation.v1beta1.ReservationService.SplitCapacityCommitment].
 message SplitCapacityCommitmentRequest {
   // Required. The resource name e.g.,:
-  //   projects/myproject/locations/US/capacityCommitments/123
+  //  `projects/myproject/locations/US/capacityCommitments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -573,13 +671,10 @@ message SplitCapacityCommitmentResponse {
 // [ReservationService.MergeCapacityCommitments][google.cloud.bigquery.reservation.v1beta1.ReservationService.MergeCapacityCommitments].
 message MergeCapacityCommitmentsRequest {
   // Parent resource that identifies admin project and location e.g.,
-  // projects/myproject/locations/us
-  string parent = 1 [
-    (google.api.field_behavior) = REQUIRED,
-    (google.api.resource_reference) = {
-      child_type: "bigqueryreservation.googleapis.com/CapacityCommitment"
-    }
-  ];
+  //  `projects/myproject/locations/us`
+  string parent = 1 [(google.api.resource_reference) = {
+    child_type: "bigqueryreservation.googleapis.com/CapacityCommitment"
+  }];
 
   // Ids of capacity commitments to merge.
   // These capacity commitments must exist under admin project and location
@@ -624,12 +719,12 @@ message Assignment {
   }
 
   // Output only. Name of the resource. E.g.:
-  // projects/myproject/locations/US/reservations/team1-prod/assignments/123.
+  // `projects/myproject/locations/US/reservations/team1-prod/assignments/123`.
   string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // The resource which will use the reservation. E.g.
-  // projects/myproject, folders/123, organizations/456.
-  string assignee = 4 [(google.api.resource_reference) = { type: "*" }];
+  // `projects/myproject`, `folders/123`, or `organizations/456`.
+  string assignee = 4;
 
   // Which type of jobs will use the reservation.
   JobType job_type = 3;
@@ -644,7 +739,7 @@ message Assignment {
 // related assignee.
 message CreateAssignmentRequest {
   // Required. The parent resource name of the assignment
-  // E.g.: projects/myproject/locations/US/reservations/team1-prod
+  // E.g. `projects/myproject/locations/US/reservations/team1-prod`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -660,9 +755,12 @@ message CreateAssignmentRequest {
 // [ReservationService.ListAssignments][google.cloud.bigquery.reservation.v1beta1.ReservationService.ListAssignments].
 message ListAssignmentsRequest {
   // Required. The parent resource name e.g.:
-  // projects/myproject/locations/US/reservations/team1-prod
+  //
+  // `projects/myproject/locations/US/reservations/team1-prod`
+  //
   // Or:
-  // projects/myproject/locations/US/reservations/-
+  //
+  // `projects/myproject/locations/US/reservations/-`
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -693,8 +791,8 @@ message ListAssignmentsResponse {
 // Note: "bigquery.reservationAssignments.delete" permission is required on the
 // related assignee.
 message DeleteAssignmentRequest {
-  // Required. Name of the resource, e.g.:
-  //   projects/myproject/locations/US/reservations/team1-prod/assignments/123
+  // Required. Name of the resource, e.g.
+  //   `projects/myproject/locations/US/reservations/team1-prod/assignments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -710,7 +808,7 @@ message DeleteAssignmentRequest {
 message SearchAssignmentsRequest {
   // Required. The resource name of the admin project(containing project and
   // location), e.g.:
-  //   "projects/myproject/locations/US".
+  //   `projects/myproject/locations/US`.
   string parent = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -719,9 +817,12 @@ message SearchAssignmentsRequest {
   ];
 
   // Please specify resource name as assignee in the query.
-  // e.g., "assignee=projects/myproject"
-  //       "assignee=folders/123"
-  //       "assignee=organizations/456"
+  //
+  // Examples:
+  //
+  // * `assignee=projects/myproject`
+  // * `assignee=folders/123`
+  // * `assignee=organizations/456`
   string query = 2;
 
   // The maximum number of items to return.
@@ -744,14 +845,17 @@ message SearchAssignmentsResponse {
 
 // The request for
 // [ReservationService.MoveAssignment][google.cloud.bigquery.reservation.v1beta1.ReservationService.MoveAssignment].
-// Note: "bigquery.reservationAssignments.create" permission is required on the
-// destination_id. Note: "bigquery.reservationAssignments.create" and
-// "bigquery.reservationAssignments.delete" permission is required on the
+//
+// **Note**: "bigquery.reservationAssignments.create" permission is required on
+// the destination_id.
+//
+// **Note**: "bigquery.reservationAssignments.create" and
+// "bigquery.reservationAssignments.delete" permission are required on the
 // related assignee.
 message MoveAssignmentRequest {
   // Required. The resource name of the assignment,
-  // e.g.:
-  //   projects/myproject/locations/US/reservations/team1-prod/assignments/123
+  // e.g.
+  // `projects/myproject/locations/US/reservations/team1-prod/assignments/123`
   string name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
@@ -760,7 +864,7 @@ message MoveAssignmentRequest {
   ];
 
   // The new reservation ID, e.g.:
-  //   projects/myotherproject/locations/US/reservations/team2-prod
+  //   `projects/myotherproject/locations/US/reservations/team2-prod`
   string destination_id = 3 [(google.api.resource_reference) = {
     child_type: "bigqueryreservation.googleapis.com/Assignment"
   }];
@@ -770,7 +874,7 @@ message MoveAssignmentRequest {
 message BiReservation {
   option (google.api.resource) = {
     type: "bigqueryreservation.googleapis.com/BiReservation"
-    pattern: "projects/{project}/locations/{location}/bireservation"
+    pattern: "projects/{project}/locations/{location}/bireservation/{bireservation}"
   };
 
   // The resource name of the singleton BI reservation.
@@ -801,7 +905,7 @@ message GetBiReservationRequest {
 // A request to update a BI reservation.
 message UpdateBiReservationRequest {
   // A reservation to update.
-  BiReservation bi_reservation = 1;
+  BiReservation reservation = 1;
 
   // A list of fields to be updated in this request.
   google.protobuf.FieldMask update_mask = 2;
diff --git a/google/cloud/bigquery/storage/v1/BUILD.bazel b/google/cloud/bigquery/storage/v1/BUILD.bazel
index 0e97194ea..aa12e8aaa 100644
--- a/google/cloud/bigquery/storage/v1/BUILD.bazel
+++ b/google/cloud/bigquery/storage/v1/BUILD.bazel
@@ -252,7 +252,7 @@ load(
 nodejs_gapic_library(
     name = "storage_nodejs_gapic",
     src = ":storage_proto_with_info",
-    gapic_yaml = "bigquerystorage_gapic.yaml",
+    grpc_service_config = "bigquerystorage_grpc_service_config.json",
     package = "google.cloud.bigquery.storage.v1",
     service_yaml = "bigquerystorage_v1.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/storage/v1alpha2/BUILD.bazel b/google/cloud/bigquery/storage/v1alpha2/BUILD.bazel
index 2789b99ea..21527264f 100644
--- a/google/cloud/bigquery/storage/v1alpha2/BUILD.bazel
+++ b/google/cloud/bigquery/storage/v1alpha2/BUILD.bazel
@@ -262,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "storage_nodejs_gapic",
     src = ":storage_proto_with_info",
-    gapic_yaml = "bigquerystorage_gapic.yaml",
+    grpc_service_config = "bigquerystorage_grpc_service_config.json",
     package = "google.cloud.bigquery.storage.v1alpha2",
     service_yaml = "bigquerystorage_v1alpha2.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/storage/v1beta1/BUILD.bazel b/google/cloud/bigquery/storage/v1beta1/BUILD.bazel
index bd8a003b0..95361db33 100644
--- a/google/cloud/bigquery/storage/v1beta1/BUILD.bazel
+++ b/google/cloud/bigquery/storage/v1beta1/BUILD.bazel
@@ -256,7 +256,7 @@ load(
 nodejs_gapic_library(
     name = "storage_nodejs_gapic",
     src = ":storage_proto_with_info",
-    gapic_yaml = "bigquerystorage_gapic.yaml",
+    grpc_service_config = "bigquerystorage_grpc_service_config.json",
     package = "google.cloud.bigquery.storage.v1beta1",
     service_yaml = "bigquerystorage_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/storage/v1beta2/BUILD.bazel b/google/cloud/bigquery/storage/v1beta2/BUILD.bazel
index d2e1ec642..18c7f40a9 100644
--- a/google/cloud/bigquery/storage/v1beta2/BUILD.bazel
+++ b/google/cloud/bigquery/storage/v1beta2/BUILD.bazel
@@ -252,7 +252,7 @@ load(
 nodejs_gapic_library(
     name = "storage_nodejs_gapic",
     src = ":storage_proto_with_info",
-    gapic_yaml = "bigquerystorage_gapic.yaml",
+    grpc_service_config = "bigquerystorage_grpc_service_config.json",
     package = "google.cloud.bigquery.storage.v1beta2",
     service_yaml = "bigquerystorage_v1beta2.yaml",
     deps = [],
diff --git a/google/cloud/bigquery/v2/BUILD.bazel b/google/cloud/bigquery/v2/BUILD.bazel
index 667222cb6..56898b0c3 100644
--- a/google/cloud/bigquery/v2/BUILD.bazel
+++ b/google/cloud/bigquery/v2/BUILD.bazel
@@ -256,7 +256,7 @@ load(
 nodejs_gapic_library(
     name = "bigquery_nodejs_gapic",
     src = ":bigquery_proto_with_info",
-    gapic_yaml = "bigquery_gapic.yaml",
+    grpc_service_config = "bigquery_grpc_service_config.json",
     package = "google.cloud.bigquery.v2",
     service_yaml = "bigquery_v2.yaml",
     deps = [],
diff --git a/google/cloud/billing/budgets/v1alpha1/BUILD.bazel b/google/cloud/billing/budgets/v1alpha1/BUILD.bazel
index 4f1148a00..d679229eb 100644
--- a/google/cloud/billing/budgets/v1alpha1/BUILD.bazel
+++ b/google/cloud/billing/budgets/v1alpha1/BUILD.bazel
@@ -22,6 +22,7 @@ proto_library(
         "//google/type:money_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
+        "@com_google_protobuf//:struct_proto",
     ],
 )
 
@@ -85,6 +86,7 @@ moved_proto_library(
         "//google/type:money_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
+        "@com_google_protobuf//:struct_proto",
     ],
 )
 
diff --git a/google/cloud/billing/budgets/v1alpha1/budget_model.proto b/google/cloud/billing/budgets/v1alpha1/budget_model.proto
index c3d907b2c..b8b4efed1 100644
--- a/google/cloud/billing/budgets/v1alpha1/budget_model.proto
+++ b/google/cloud/billing/budgets/v1alpha1/budget_model.proto
@@ -18,6 +18,7 @@ package google.cloud.billing.budgets.v1alpha1;
 
 import "google/api/field_behavior.proto";
 import "google/api/resource.proto";
+import "google/protobuf/struct.proto";
 import "google/type/money.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/cloud/billing/budgets/v1alpha1;budgets";
@@ -176,4 +177,17 @@ message Filter {
   // The service names are available through the Catalog API:
   // https://cloud.google.com/billing/v1/how-tos/catalog-api.
   repeated string services = 3 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. A set of subaccounts of the form `billingAccounts/{account_id}`, specifying
+  // that usage from only this set of subaccounts should be included in the
+  // budget. If a subaccount is set to the name of the master account, usage
+  // from the master account will be included. If omitted, the report will
+  // include usage from the master account and all subaccounts, if they exist.
+  repeated string subaccounts = 5 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. A single label and value pair specifying that usage from only this set of
+  // labeled resources should be included in the budget. Currently, multiple
+  // entries or multiple values per entry are not allowed. If omitted, the
+  // report will include all labeled and unlabeled usage.
+  map labels = 6 [(google.api.field_behavior) = OPTIONAL];
 }
diff --git a/google/cloud/billing/budgets/v1beta1/BUILD.bazel b/google/cloud/billing/budgets/v1beta1/BUILD.bazel
index 35970baab..3825b1e6d 100644
--- a/google/cloud/billing/budgets/v1beta1/BUILD.bazel
+++ b/google/cloud/billing/budgets/v1beta1/BUILD.bazel
@@ -23,6 +23,7 @@ proto_library(
         "//google/type:money_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
+        "@com_google_protobuf//:struct_proto",
     ],
 )
 
@@ -163,6 +164,7 @@ moved_proto_library(
         "//google/type:money_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
+        "@com_google_protobuf//:struct_proto",
     ],
 )
 
@@ -256,7 +258,7 @@ load(
 nodejs_gapic_library(
     name = "budgets_nodejs_gapic",
     src = ":budgets_proto_with_info",
-    gapic_yaml = "billingbudgets_gapic.yaml",
+    grpc_service_config = "billingbudgets_grpc_service_config.json",
     package = "google.cloud.billing.budgets.v1beta1",
     service_yaml = "billingbudgets.yaml",
     deps = [],
diff --git a/google/cloud/billing/budgets/v1beta1/budget_model.proto b/google/cloud/billing/budgets/v1beta1/budget_model.proto
index d25cf3324..fb2f1cfbd 100644
--- a/google/cloud/billing/budgets/v1beta1/budget_model.proto
+++ b/google/cloud/billing/budgets/v1beta1/budget_model.proto
@@ -18,6 +18,7 @@ package google.cloud.billing.budgets.v1beta1;
 
 import "google/api/field_behavior.proto";
 import "google/api/resource.proto";
+import "google/protobuf/struct.proto";
 import "google/type/money.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/cloud/billing/budgets/v1beta1;budgets";
@@ -176,4 +177,17 @@ message Filter {
   // The service names are available through the Catalog API:
   // https://cloud.google.com/billing/v1/how-tos/catalog-api.
   repeated string services = 3 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. A set of subaccounts of the form `billingAccounts/{account_id}`, specifying
+  // that usage from only this set of subaccounts should be included in the
+  // budget. If a subaccount is set to the name of the master account, usage
+  // from the master account will be included. If omitted, the report will
+  // include usage from the master account and all subaccounts, if they exist.
+  repeated string subaccounts = 5 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. A single label and value pair specifying that usage from only this set of
+  // labeled resources should be included in the budget. Multiple entries or
+  // multiple values per entry are not allowed. If omitted, the report will
+  // include all labeled and unlabeled usage.
+  map labels = 6 [(google.api.field_behavior) = OPTIONAL];
 }
diff --git a/google/cloud/billing/budgets/v1beta1/budget_service.proto b/google/cloud/billing/budgets/v1beta1/budget_service.proto
index ab2b0714c..e15ecf5c4 100644
--- a/google/cloud/billing/budgets/v1beta1/budget_service.proto
+++ b/google/cloud/billing/budgets/v1beta1/budget_service.proto
@@ -47,7 +47,7 @@ service BudgetService {
   // Updates a budget and returns the updated budget.
   //
   // WARNING: There are some fields exposed on the Google Cloud Console that
-  // aren’t available on this API. Budget fields that are not exposed in
+  // aren't available on this API. Budget fields that are not exposed in
   // this API will not be changed by this method.
   rpc UpdateBudget(UpdateBudgetRequest) returns (Budget) {
     option (google.api.http) = {
@@ -59,7 +59,7 @@ service BudgetService {
   // Returns a budget.
   //
   // WARNING: There are some fields exposed on the Google Cloud Console that
-  // aren’t available on this API. When reading from the API, you will not
+  // aren't available on this API. When reading from the API, you will not
   // see these fields in the return value, though they may have been set
   // in the Cloud Console.
   rpc GetBudget(GetBudgetRequest) returns (Budget) {
@@ -71,7 +71,7 @@ service BudgetService {
   // Returns a list of budgets for a billing account.
   //
   // WARNING: There are some fields exposed on the Google Cloud Console that
-  // aren’t available on this API. When reading from the API, you will not
+  // aren't available on this API. When reading from the API, you will not
   // see these fields in the return value, though they may have been set
   // in the Cloud Console.
   rpc ListBudgets(ListBudgetsRequest) returns (ListBudgetsResponse) {
diff --git a/google/cloud/billing/v1/BUILD.bazel b/google/cloud/billing/v1/BUILD.bazel
index e7b406a0a..349f5ca34 100644
--- a/google/cloud/billing/v1/BUILD.bazel
+++ b/google/cloud/billing/v1/BUILD.bazel
@@ -265,7 +265,7 @@ load(
 nodejs_gapic_library(
     name = "billing_nodejs_gapic",
     src = ":billing_proto_with_info",
-    gapic_yaml = "cloud_billing_gapic.yaml",
+    grpc_service_config = "cloud_billing_grpc_service_config.json",
     package = "google.cloud.billing.v1",
     service_yaml = "cloudbilling.yaml",
     deps = [],
diff --git a/google/cloud/binaryauthorization/v1beta1/BUILD.bazel b/google/cloud/binaryauthorization/v1beta1/BUILD.bazel
index c3e3dbb26..6453b69ee 100644
--- a/google/cloud/binaryauthorization/v1beta1/BUILD.bazel
+++ b/google/cloud/binaryauthorization/v1beta1/BUILD.bazel
@@ -61,6 +61,7 @@ java_grpc_library(
 #    name = "binaryauthorization_java_gapic",
 #    src = ":binaryauthorization_proto_with_info",
 #    gapic_yaml = "binaryauthorization_gapic.yaml",
+#    grpc_service_config = "binaryauthorization_grpc_service_config.json",
 #    package = "google.cloud.binaryauthorization.v1beta1",
 #    service_yaml = "binaryauthorization_v1beta1.yaml",
 #    test_deps = [
@@ -180,6 +181,7 @@ py_gapic_library(
     name = "binaryauthorization_py_gapic",
     src = ":binaryauthorization_proto_with_info",
     gapic_yaml = "binaryauthorization_gapic.yaml",
+    grpc_service_config = "binaryauthorization_grpc_service_config.json",
     package = "google.cloud.binaryauthorization.v1beta1",
     service_yaml = "binaryauthorization_v1beta1.yaml",
     deps = [
@@ -224,6 +226,7 @@ php_gapic_library(
     name = "binaryauthorization_php_gapic",
     src = ":binaryauthorization_proto_with_info",
     gapic_yaml = "binaryauthorization_gapic.yaml",
+    grpc_service_config = "binaryauthorization_grpc_service_config.json",
     package = "google.cloud.binaryauthorization.v1beta1",
     service_yaml = "binaryauthorization_v1beta1.yaml",
     deps = [
@@ -254,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "binaryauthorization_nodejs_gapic",
     src = ":binaryauthorization_proto_with_info",
-    gapic_yaml = "binaryauthorization_gapic.yaml",
+    grpc_service_config = "binaryauthorization_grpc_service_config.json",
     package = "google.cloud.binaryauthorization.v1beta1",
     service_yaml = "binaryauthorization_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/datacatalog/v1/BUILD.bazel b/google/cloud/datacatalog/v1/BUILD.bazel
index ddea6a7a2..c0f51279a 100644
--- a/google/cloud/datacatalog/v1/BUILD.bazel
+++ b/google/cloud/datacatalog/v1/BUILD.bazel
@@ -269,7 +269,7 @@ load(
 nodejs_gapic_library(
     name = "datacatalog_nodejs_gapic",
     src = ":datacatalog_proto_with_info",
-    gapic_yaml = "datacatalog_gapic.yaml",
+    grpc_service_config = "datacatalog_grpc_service_config.json",
     package = "google.cloud.datacatalog.v1",
     service_yaml = "datacatalog_v1.yaml",
     deps = [],
diff --git a/google/cloud/datacatalog/v1/gcs_fileset_spec.proto b/google/cloud/datacatalog/v1/gcs_fileset_spec.proto
index b0605c13f..bcf0ead65 100644
--- a/google/cloud/datacatalog/v1/gcs_fileset_spec.proto
+++ b/google/cloud/datacatalog/v1/gcs_fileset_spec.proto
@@ -29,9 +29,11 @@ option ruby_package = "Google::Cloud::DataCatalog::V1";
 
 // Describes a Cloud Storage fileset entry.
 message GcsFilesetSpec {
-  // Required. Patterns to identify a set of files in Google Cloud Storage. See [Cloud
-  // Storage documentation](/storage/docs/gsutil/addlhelp/WildcardNames) for
-  // more information. Note that bucket wildcards are currently not supported.
+  // Required. Patterns to identify a set of files in Google Cloud Storage.
+  // See [Cloud Storage
+  // documentation](https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames)
+  // for more information. Note that bucket wildcards are currently not
+  // supported.
   //
   // Examples of valid file_patterns:
   //
diff --git a/google/cloud/datacatalog/v1beta1/BUILD.bazel b/google/cloud/datacatalog/v1beta1/BUILD.bazel
index 864a16355..34f1997a0 100644
--- a/google/cloud/datacatalog/v1beta1/BUILD.bazel
+++ b/google/cloud/datacatalog/v1beta1/BUILD.bazel
@@ -273,7 +273,7 @@ load(
 nodejs_gapic_library(
     name = "datacatalog_nodejs_gapic",
     src = ":datacatalog_proto_with_info",
-    gapic_yaml = "datacatalog_gapic.yaml",
+    grpc_service_config = "datacatalog_grpc_service_config.json",
     package = "google.cloud.datacatalog.v1beta1",
     service_yaml = "datacatalog_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/datacatalog/v1beta1/gcs_fileset_spec.proto b/google/cloud/datacatalog/v1beta1/gcs_fileset_spec.proto
index 57cdcdfab..c8ca9779f 100644
--- a/google/cloud/datacatalog/v1beta1/gcs_fileset_spec.proto
+++ b/google/cloud/datacatalog/v1beta1/gcs_fileset_spec.proto
@@ -29,9 +29,11 @@ option ruby_package = "Google::Cloud::DataCatalog::V1beta1";
 
 // Describes a Cloud Storage fileset entry.
 message GcsFilesetSpec {
-  // Required. Patterns to identify a set of files in Google Cloud Storage. See [Cloud
-  // Storage documentation](/storage/docs/gsutil/addlhelp/WildcardNames) for
-  // more information. Note that bucket wildcards are currently not supported.
+  // Required. Patterns to identify a set of files in Google Cloud Storage.
+  // See [Cloud Storage
+  // documentation](https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames)
+  // for more information. Note that bucket wildcards are currently not
+  // supported.
   //
   // Examples of valid file_patterns:
   //
diff --git a/google/cloud/datalabeling/v1beta1/BUILD.bazel b/google/cloud/datalabeling/v1beta1/BUILD.bazel
index 51e13936a..3ce7cb175 100644
--- a/google/cloud/datalabeling/v1beta1/BUILD.bazel
+++ b/google/cloud/datalabeling/v1beta1/BUILD.bazel
@@ -135,7 +135,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -276,7 +275,7 @@ load(
 nodejs_gapic_library(
     name = "datalabeling_nodejs_gapic",
     src = ":datalabeling_proto_with_info",
-    gapic_yaml = "datalabeling_gapic.yaml",
+    grpc_service_config = "datalabeling_grpc_service_config.json",
     package = "google.cloud.datalabeling.v1beta1",
     service_yaml = "datalabeling_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/dataproc/v1/BUILD.bazel b/google/cloud/dataproc/v1/BUILD.bazel
index 33b9517ab..5dd89cce9 100644
--- a/google/cloud/dataproc/v1/BUILD.bazel
+++ b/google/cloud/dataproc/v1/BUILD.bazel
@@ -133,7 +133,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -273,7 +272,7 @@ load(
 nodejs_gapic_library(
     name = "dataproc_nodejs_gapic",
     src = ":dataproc_proto_with_info",
-    gapic_yaml = "dataproc_gapic.yaml",
+    grpc_service_config = "dataproc_grpc_service_config.json",
     package = "google.cloud.dataproc.v1",
     service_yaml = "dataproc_v1.yaml",
     deps = [],
diff --git a/google/cloud/dataproc/v1/dataproc_gapic.yaml b/google/cloud/dataproc/v1/dataproc_gapic.yaml
index 57861c84c..01be59364 100644
--- a/google/cloud/dataproc/v1/dataproc_gapic.yaml
+++ b/google/cloud/dataproc/v1/dataproc_gapic.yaml
@@ -41,23 +41,43 @@ interfaces:
     initial_retry_delay_millis: 100
     retry_delay_multiplier: 1.3
     max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 10000
+    initial_rpc_timeout_millis: 30000
     rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 10000
+    max_rpc_timeout_millis: 30000
     total_timeout_millis: 300000
   methods:
   - name: CreateCluster
     retry_codes_name: non_idempotent
+    long_running:
+      initial_poll_delay_millis: 1000
+      poll_delay_multiplier: 2
+      max_poll_delay_millis: 10000
+      total_poll_timeout_millis: 900000
   - name: UpdateCluster
     retry_codes_name: non_idempotent
+    long_running:
+      initial_poll_delay_millis: 1000
+      poll_delay_multiplier: 2
+      max_poll_delay_millis: 10000
+      total_poll_timeout_millis: 900000
   - name: DeleteCluster
     retry_codes_name: non_idempotent
+    long_running:
+      initial_poll_delay_millis: 1000
+      poll_delay_multiplier: 2
+      max_poll_delay_millis: 10000
+      total_poll_timeout_millis: 900000
   - name: GetCluster
     retry_codes_name: idempotent
   - name: ListClusters
     retry_codes_name: idempotent
   - name: DiagnoseCluster
     retry_codes_name: non_idempotent
+    long_running:
+      initial_poll_delay_millis: 1000
+      poll_delay_multiplier: 2
+      max_poll_delay_millis: 10000
+      total_poll_timeout_millis: 30000
 - name: google.cloud.dataproc.v1.JobController
   retry_codes_def:
   - name: idempotent
@@ -100,6 +120,15 @@ interfaces:
   - name: non_idempotent
     retry_codes:
     - UNAVAILABLE
+  retry_params_def:
+  - name: default
+    initial_retry_delay_millis: 100
+    retry_delay_multiplier: 1.3
+    max_retry_delay_millis: 60000
+    initial_rpc_timeout_millis: 30000
+    rpc_timeout_multiplier: 1
+    max_rpc_timeout_millis: 30000
+    total_timeout_millis: 900000
   methods:
   - name: CreateWorkflowTemplate
     retry_codes_name: non_idempotent
@@ -107,8 +136,18 @@ interfaces:
     retry_codes_name: idempotent
   - name: InstantiateWorkflowTemplate
     retry_codes_name: non_idempotent
+    long_running:
+      initial_poll_delay_millis: 1000
+      poll_delay_multiplier: 2
+      max_poll_delay_millis: 10000
+      total_poll_timeout_millis: 43200000
   - name: InstantiateInlineWorkflowTemplate
     retry_codes_name: non_idempotent
+    long_running:
+      initial_poll_delay_millis: 1000
+      poll_delay_multiplier: 2
+      max_poll_delay_millis: 10000
+      total_poll_timeout_millis: 43200000
   - name: UpdateWorkflowTemplate
     retry_codes_name: non_idempotent
   - name: ListWorkflowTemplates
diff --git a/google/cloud/dataproc/v1/jobs.proto b/google/cloud/dataproc/v1/jobs.proto
index 0379c09dd..b9026f62d 100644
--- a/google/cloud/dataproc/v1/jobs.proto
+++ b/google/cloud/dataproc/v1/jobs.proto
@@ -435,8 +435,9 @@ message SparkRJob {
 
 // A Dataproc job for running [Presto](https://prestosql.io/) queries.
 // **IMPORTANT**: The [Dataproc Presto Optional
-// Component](/dataproc/docs/concepts/components/presto) must be enabled when
-// the cluster is created to submit a Presto job to the cluster.
+// Component](https://cloud.google.com/dataproc/docs/concepts/components/presto)
+// must be enabled when the cluster is created to submit a Presto job to the
+// cluster.
 message PrestoJob {
   // Required. The sequence of Presto queries to execute, specified as
   // either an HCFS file URI or as a list of queries.
diff --git a/google/cloud/dataproc/v1beta2/BUILD.bazel b/google/cloud/dataproc/v1beta2/BUILD.bazel
index 62fa2a5a3..251378be3 100644
--- a/google/cloud/dataproc/v1beta2/BUILD.bazel
+++ b/google/cloud/dataproc/v1beta2/BUILD.bazel
@@ -132,7 +132,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -272,7 +271,7 @@ load(
 nodejs_gapic_library(
     name = "dataproc_nodejs_gapic",
     src = ":dataproc_proto_with_info",
-    gapic_yaml = "dataproc_gapic.yaml",
+    grpc_service_config = "dataproc_grpc_service_config.json",
     package = "google.cloud.dataproc.v1beta2",
     service_yaml = "dataproc_v1beta2.yaml",
     deps = [],
diff --git a/google/cloud/dataproc/v1beta2/jobs.proto b/google/cloud/dataproc/v1beta2/jobs.proto
index 325dc9e57..9d9aaae01 100644
--- a/google/cloud/dataproc/v1beta2/jobs.proto
+++ b/google/cloud/dataproc/v1beta2/jobs.proto
@@ -435,8 +435,9 @@ message SparkRJob {
 
 // A Dataproc job for running [Presto](https://prestosql.io/) queries.
 // **IMPORTANT**: The [Dataproc Presto Optional
-// Component](/dataproc/docs/concepts/components/presto) must be enabled when
-// the cluster is created to submit a Presto job to the cluster.
+// Component](https://cloud.google.com/dataproc/docs/concepts/components/presto)
+// must be enabled when the cluster is created to submit a Presto job to the
+// cluster.
 message PrestoJob {
   // Required. The sequence of Presto queries to execute, specified as
   // either an HCFS file URI or as a list of queries.
diff --git a/google/cloud/dialogflow/v2/BUILD.bazel b/google/cloud/dialogflow/v2/BUILD.bazel
index 3bdb813b1..d68c38106 100644
--- a/google/cloud/dialogflow/v2/BUILD.bazel
+++ b/google/cloud/dialogflow/v2/BUILD.bazel
@@ -144,7 +144,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
@@ -288,7 +287,7 @@ load(
 nodejs_gapic_library(
     name = "dialogflow_nodejs_gapic",
     src = ":dialogflow_proto_with_info",
-    gapic_yaml = "dialogflow_gapic.yaml",
+    grpc_service_config = "dialogflow_grpc_service_config.json",
     package = "google.cloud.dialogflow.v2",
     service_yaml = "dialogflow_v2.yaml",
     deps = [],
diff --git a/google/cloud/dialogflow/v2/agent.proto b/google/cloud/dialogflow/v2/agent.proto
index 23a3d44f0..9459029af 100644
--- a/google/cloud/dialogflow/v2/agent.proto
+++ b/google/cloud/dialogflow/v2/agent.proto
@@ -33,34 +33,7 @@ option java_outer_classname = "AgentProto";
 option java_package = "com.google.cloud.dialogflow.v2";
 option objc_class_prefix = "DF";
 
-// Agents are best described as Natural Language Understanding (NLU) modules
-// that transform user requests into actionable data. You can include agents
-// in your app, product, or service to determine user intent and respond to the
-// user in a natural way.
-//
-// After you create an agent, you can add [Intents][google.cloud.dialogflow.v2.Intents], [Contexts][google.cloud.dialogflow.v2.Contexts],
-// [Entity Types][google.cloud.dialogflow.v2.EntityTypes], [Webhooks][google.cloud.dialogflow.v2.WebhookRequest], and so on to
-// manage the flow of a conversation and match user input to predefined intents
-// and actions.
-//
-// You can create an agent using both Dialogflow Standard Edition and
-// Dialogflow Enterprise Edition. For details, see
-// [Dialogflow
-// Editions](https://cloud.google.com/dialogflow/docs/editions).
-//
-// You can save your agent for backup or versioning by exporting the agent by
-// using the [ExportAgent][google.cloud.dialogflow.v2.Agents.ExportAgent] method. You can import a saved
-// agent by using the [ImportAgent][google.cloud.dialogflow.v2.Agents.ImportAgent] method.
-//
-// Dialogflow provides several
-// [prebuilt
-// agents](https://cloud.google.com/dialogflow/docs/agents-prebuilt)
-// for common conversation scenarios such as determining a date and time,
-// converting currency, and so on.
-//
-// For more information about agents, see the
-// [Dialogflow
-// documentation](https://cloud.google.com/dialogflow/docs/agents-overview).
+// Service for managing [Agents][google.cloud.dialogflow.v2.Agent].
 service Agents {
   option (google.api.default_host) = "dialogflow.googleapis.com";
   option (google.api.oauth_scopes) =
@@ -180,7 +153,16 @@ service Agents {
   }
 }
 
-// Represents a conversational agent.
+// A Dialogflow agent is a virtual agent that handles conversations with your
+// end-users. It is a natural language understanding module that understands the
+// nuances of human language. Dialogflow translates end-user text or audio
+// during a conversation to structured data that your apps and services can
+// understand. You design and build a Dialogflow agent to handle the types of
+// conversations required for your system.
+//
+// For more information about agents, see the
+// [Agents
+// documentation](https://cloud.google.com/dialogflow/docs/agents-overview).
 message Agent {
   option (google.api.resource) = {
     type: "dialogflow.googleapis.com/Agent"
diff --git a/google/cloud/dialogflow/v2/audio_config.proto b/google/cloud/dialogflow/v2/audio_config.proto
index 975ea69a6..ec0602f56 100644
--- a/google/cloud/dialogflow/v2/audio_config.proto
+++ b/google/cloud/dialogflow/v2/audio_config.proto
@@ -29,6 +29,35 @@ option java_outer_classname = "AudioConfigProto";
 option java_package = "com.google.cloud.dialogflow.v2";
 option objc_class_prefix = "DF";
 
+// Hints for the speech recognizer to help with recognition in a specific
+// conversation state.
+message SpeechContext {
+  // Optional. A list of strings containing words and phrases that the speech
+  // recognizer should recognize with higher likelihood.
+  //
+  // This list can be used to:
+  // * improve accuracy for words and phrases you expect the user to say,
+  //   e.g. typical commands for your Dialogflow agent
+  // * add additional words to the speech recognizer vocabulary
+  // * ...
+  //
+  // See the [Cloud Speech
+  // documentation](https://cloud.google.com/speech-to-text/quotas) for usage
+  // limits.
+  repeated string phrases = 1;
+
+  // Optional. Boost for this context compared to other contexts:
+  //
+  // * If the boost is positive, Dialogflow will increase the probability that
+  //   the phrases in this context are recognized over similar sounding phrases.
+  // * If the boost is unspecified or non-positive, Dialogflow will not apply
+  //   any boost.
+  //
+  // Dialogflow recommends that you use boosts in the range (0, 20] and that you
+  // find a value that fits your use case with binary search.
+  float boost = 2;
+}
+
 // Audio encoding of the audio content sent in the conversational query request.
 // Refer to the
 // [Cloud Speech API
@@ -78,33 +107,29 @@ enum AudioEncoding {
   AUDIO_ENCODING_SPEEX_WITH_HEADER_BYTE = 7;
 }
 
-// Hints for the speech recognizer to help with recognition in a specific
-// conversation state.
-message SpeechContext {
-  // Optional. A list of strings containing words and phrases that the speech
-  // recognizer should recognize with higher likelihood.
-  //
-  // This list can be used to:
-  // * improve accuracy for words and phrases you expect the user to say,
-  //   e.g. typical commands for your Dialogflow agent
-  // * add additional words to the speech recognizer vocabulary
-  // * ...
-  //
-  // See the [Cloud Speech
-  // documentation](https://cloud.google.com/speech-to-text/quotas) for usage
-  // limits.
-  repeated string phrases = 1;
+// Information for a word recognized by the speech recognizer.
+message SpeechWordInfo {
+  // The word this info is for.
+  string word = 3;
 
-  // Optional. Boost for this context compared to other contexts:
-  //
-  // * If the boost is positive, Dialogflow will increase the probability that
-  //   the phrases in this context are recognized over similar sounding phrases.
-  // * If the boost is unspecified or non-positive, Dialogflow will not apply
-  //   any boost.
+  // Time offset relative to the beginning of the audio that corresponds to the
+  // start of the spoken word. This is an experimental feature and the accuracy
+  // of the time offset can vary.
+  google.protobuf.Duration start_offset = 1;
+
+  // Time offset relative to the beginning of the audio that corresponds to the
+  // end of the spoken word. This is an experimental feature and the accuracy of
+  // the time offset can vary.
+  google.protobuf.Duration end_offset = 2;
+
+  // The Speech confidence between 0.0 and 1.0 for this word. A higher number
+  // indicates an estimated greater likelihood that the recognized word is
+  // correct. The default of 0.0 is a sentinel value indicating that confidence
+  // was not set.
   //
-  // Dialogflow recommends that you use boosts in the range (0, 20] and that you
-  // find a value that fits your use case with binary search.
-  float boost = 2;
+  // This field is not guaranteed to be fully stable over time for the same
+  // audio input. Users should also not rely on it to always be provided.
+  float confidence = 4;
 }
 
 // Variant of the specified [Speech model][google.cloud.dialogflow.v2.InputAudioConfig.model] to use.
@@ -150,31 +175,6 @@ enum SpeechModelVariant {
   USE_ENHANCED = 3;
 }
 
-// Information for a word recognized by the speech recognizer.
-message SpeechWordInfo {
-  // The word this info is for.
-  string word = 3;
-
-  // Time offset relative to the beginning of the audio that corresponds to the
-  // start of the spoken word. This is an experimental feature and the accuracy
-  // of the time offset can vary.
-  google.protobuf.Duration start_offset = 1;
-
-  // Time offset relative to the beginning of the audio that corresponds to the
-  // end of the spoken word. This is an experimental feature and the accuracy of
-  // the time offset can vary.
-  google.protobuf.Duration end_offset = 2;
-
-  // The Speech confidence between 0.0 and 1.0 for this word. A higher number
-  // indicates an estimated greater likelihood that the recognized word is
-  // correct. The default of 0.0 is a sentinel value indicating that confidence
-  // was not set.
-  //
-  // This field is not guaranteed to be fully stable over time for the same
-  // audio input. Users should also not rely on it to always be provided.
-  float confidence = 4;
-}
-
 // Instructs the speech recognizer how to process the audio content.
 message InputAudioConfig {
   // Required. Audio encoding of the audio content to process.
@@ -248,6 +248,21 @@ message InputAudioConfig {
   bool single_utterance = 8;
 }
 
+// Description of which voice to use for speech synthesis.
+message VoiceSelectionParams {
+  // Optional. The name of the voice. If not set, the service will choose a
+  // voice based on the other parameters such as language_code and
+  // [ssml_gender][google.cloud.dialogflow.v2.VoiceSelectionParams.ssml_gender].
+  string name = 1;
+
+  // Optional. The preferred gender of the voice. If not set, the service will
+  // choose a voice based on the other parameters such as language_code and
+  // [name][google.cloud.dialogflow.v2.VoiceSelectionParams.name]. Note that this is only a preference, not requirement. If a
+  // voice of the appropriate gender is not available, the synthesizer should
+  // substitute a voice with a different gender rather than failing the request.
+  SsmlVoiceGender ssml_gender = 2;
+}
+
 // Gender of the voice as described in
 // [SSML voice element](https://www.w3.org/TR/speech-synthesis11/#edef_voice).
 enum SsmlVoiceGender {
@@ -265,21 +280,6 @@ enum SsmlVoiceGender {
   SSML_VOICE_GENDER_NEUTRAL = 3;
 }
 
-// Description of which voice to use for speech synthesis.
-message VoiceSelectionParams {
-  // Optional. The name of the voice. If not set, the service will choose a
-  // voice based on the other parameters such as language_code and
-  // [ssml_gender][google.cloud.dialogflow.v2.VoiceSelectionParams.ssml_gender].
-  string name = 1;
-
-  // Optional. The preferred gender of the voice. If not set, the service will
-  // choose a voice based on the other parameters such as language_code and
-  // [name][google.cloud.dialogflow.v2.VoiceSelectionParams.name]. Note that this is only a preference, not requirement. If a
-  // voice of the appropriate gender is not available, the synthesizer should
-  // substitute a voice with a different gender rather than failing the request.
-  SsmlVoiceGender ssml_gender = 2;
-}
-
 // Configuration of how speech should be synthesized.
 message SynthesizeSpeechConfig {
   // Optional. Speaking rate/speed, in the range [0.25, 4.0]. 1.0 is the normal
@@ -312,6 +312,24 @@ message SynthesizeSpeechConfig {
   VoiceSelectionParams voice = 4;
 }
 
+// Instructs the speech synthesizer on how to generate the output audio content.
+// If this audio config is supplied in a request, it overrides all existing
+// text-to-speech settings applied to the agent.
+message OutputAudioConfig {
+  // Required. Audio encoding of the synthesized audio content.
+  OutputAudioEncoding audio_encoding = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // The synthesis sample rate (in hertz) for this audio. If not
+  // provided, then the synthesizer will use the default sample rate based on
+  // the audio encoding. If this is different from the voice's natural sample
+  // rate, then the synthesizer will honor this request by converting to the
+  // desired sample rate (which might result in worse audio quality).
+  int32 sample_rate_hertz = 2;
+
+  // Configuration of how speech should be synthesized.
+  SynthesizeSpeechConfig synthesize_speech_config = 3;
+}
+
 // Audio encoding of the output audio format in Text-To-Speech.
 enum OutputAudioEncoding {
   // Not specified.
@@ -330,21 +348,3 @@ enum OutputAudioEncoding {
   // than MP3 while using approximately the same bitrate.
   OUTPUT_AUDIO_ENCODING_OGG_OPUS = 3;
 }
-
-// Instructs the speech synthesizer on how to generate the output audio content.
-// If this audio config is supplied in a request, it overrides all existing
-// text-to-speech settings applied to the agent.
-message OutputAudioConfig {
-  // Required. Audio encoding of the synthesized audio content.
-  OutputAudioEncoding audio_encoding = 1 [(google.api.field_behavior) = REQUIRED];
-
-  // The synthesis sample rate (in hertz) for this audio. If not
-  // provided, then the synthesizer will use the default sample rate based on
-  // the audio encoding. If this is different from the voice's natural sample
-  // rate, then the synthesizer will honor this request by converting to the
-  // desired sample rate (which might result in worse audio quality).
-  int32 sample_rate_hertz = 2;
-
-  // Configuration of how speech should be synthesized.
-  SynthesizeSpeechConfig synthesize_speech_config = 3;
-}
diff --git a/google/cloud/dialogflow/v2beta1/BUILD.bazel b/google/cloud/dialogflow/v2beta1/BUILD.bazel
index 424bf53b2..7aaba6b59 100644
--- a/google/cloud/dialogflow/v2beta1/BUILD.bazel
+++ b/google/cloud/dialogflow/v2beta1/BUILD.bazel
@@ -138,39 +138,38 @@ go_proto_library(
     ],
 )
 
-# go_gapic_library(
-#     name = "dialogflow_go_gapic",
-#     srcs = [":dialogflow_proto_with_info"],
-#     grpc_service_config = "dialogflow_grpc_service_config.json",
-#     importpath = "cloud.google.com/go/cloud/dialogflow/apiv2beta1;dialogflow",
-#     service_yaml = "dialogflow_v2beta1.yaml",
-#     deps = [
-#         ":dialogflow_go_proto",
-#         "//google/longrunning:longrunning_go_gapic",
-#         "//google/longrunning:longrunning_go_proto",
-#         "@com_google_cloud_go//longrunning:go_default_library",
-#         "@com_google_cloud_go//longrunning/autogen:go_default_library",
-#         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
-#         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
-#     ],
-# )
-#
-# go_test(
-#     name = "dialogflow_go_gapic_test",
-#     srcs = [":dialogflow_go_gapic_srcjar_test"],
-#     embed = [":dialogflow_go_gapic"],
-#     importpath = "cloud.google.com/go/cloud/dialogflow/apiv2beta1",
-# )
-#
-# # Open Source Packages
-# go_gapic_assembly_pkg(
-#     name = "gapi-cloud-dialogflow-v2beta1-go",
-#     deps = [
-#         ":dialogflow_go_gapic",
-#         ":dialogflow_go_gapic_srcjar-test.srcjar",
-#         ":dialogflow_go_proto",
-#     ],
-# )
+go_gapic_library(
+    name = "dialogflow_go_gapic",
+    srcs = [":dialogflow_proto_with_info"],
+    grpc_service_config = "dialogflow_grpc_service_config.json",
+    importpath = "cloud.google.com/go/dialogflow/apiv2beta1;dialogflow",
+    service_yaml = "dialogflow_v2beta1.yaml",
+    deps = [
+        ":dialogflow_go_proto",
+        "//google/longrunning:longrunning_go_gapic",
+        "//google/longrunning:longrunning_go_proto",
+        "@com_google_cloud_go//longrunning:go_default_library",
+        "@io_bazel_rules_go//proto/wkt:duration_go_proto",
+        "@io_bazel_rules_go//proto/wkt:struct_go_proto",
+    ],
+)
+
+go_test(
+    name = "dialogflow_go_gapic_test",
+    srcs = [":dialogflow_go_gapic_srcjar_test"],
+    embed = [":dialogflow_go_gapic"],
+    importpath = "cloud.google.com/go/dialogflow/apiv2beta1",
+)
+
+# Open Source Packages
+go_gapic_assembly_pkg(
+    name = "gapi-cloud-dialogflow-v2beta1-go",
+    deps = [
+        ":dialogflow_go_gapic",
+        ":dialogflow_go_gapic_srcjar-test.srcjar",
+        ":dialogflow_go_proto",
+    ],
+)
 
 ##############################################################################
 # Python
@@ -293,7 +292,7 @@ load(
 nodejs_gapic_library(
     name = "dialogflow_nodejs_gapic",
     src = ":dialogflow_proto_with_info",
-    gapic_yaml = "dialogflow_gapic.yaml",
+    grpc_service_config = "dialogflow_grpc_service_config.json",
     package = "google.cloud.dialogflow.v2beta1",
     service_yaml = "dialogflow_v2beta1.yaml",
     deps = [],
diff --git a/google/cloud/dialogflow/v2beta1/agent.proto b/google/cloud/dialogflow/v2beta1/agent.proto
index 7bfedab4f..01c79927f 100644
--- a/google/cloud/dialogflow/v2beta1/agent.proto
+++ b/google/cloud/dialogflow/v2beta1/agent.proto
@@ -17,6 +17,7 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
 import "google/api/field_behavior.proto";
 import "google/api/resource.proto";
 import "google/cloud/dialogflow/v2beta1/environment.proto";
@@ -24,7 +25,6 @@ import "google/cloud/dialogflow/v2beta1/validation_result.proto";
 import "google/longrunning/operations.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -76,6 +76,7 @@ service Agents {
         get: "/v2beta1/{parent=projects/*/locations/*}/agent"
       }
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Creates/updates the specified agent.
@@ -88,6 +89,7 @@ service Agents {
         body: "agent"
       }
     };
+    option (google.api.method_signature) = "agent";
   }
 
   // Deletes the specified agent.
@@ -98,10 +100,10 @@ service Agents {
         delete: "/v2beta1/{parent=projects/*/locations/*}/agent"
       }
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Returns the list of agents.
-  //
   // Since there is at most one conversational agent per project, this method is
   // useful primarily for listing all agents across projects the caller has
   // access to. One can achieve that with a wildcard project collection id "-".
@@ -110,7 +112,11 @@ service Agents {
   rpc SearchAgents(SearchAgentsRequest) returns (SearchAgentsResponse) {
     option (google.api.http) = {
       get: "/v2beta1/{parent=projects/*}/agent:search"
+      additional_bindings {
+        get: "/v2beta1/{parent=projects/*/locations/*}/agent:search"
+      }
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Trains the specified agent.
@@ -126,6 +132,11 @@ service Agents {
         body: "*"
       }
     };
+    option (google.api.method_signature) = "parent";
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Exports the specified agent to a ZIP file.
@@ -141,6 +152,11 @@ service Agents {
         body: "*"
       }
     };
+    option (google.api.method_signature) = "parent";
+    option (google.longrunning.operation_info) = {
+      response_type: "google.cloud.dialogflow.v2beta1.ExportAgentResponse"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Imports the specified agent from a ZIP file.
@@ -160,6 +176,10 @@ service Agents {
         body: "*"
       }
     };
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Restores the specified agent from a ZIP file.
@@ -178,6 +198,10 @@ service Agents {
         body: "*"
       }
     };
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Gets agent validation result. Agent validation is performed during
@@ -304,7 +328,12 @@ message Agent {
 message GetAgentRequest {
   // Required. The project that the agent to fetch is associated with.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Agent"
+    }
+  ];
 }
 
 // The request message for [Agents.SetAgent][google.cloud.dialogflow.v2beta1.Agents.SetAgent].
@@ -320,7 +349,12 @@ message SetAgentRequest {
 message DeleteAgentRequest {
   // Required. The project that the agent to delete is associated with.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Agent"
+    }
+  ];
 }
 
 // Contains basic configuration for a sub-agent.
@@ -339,7 +373,12 @@ message SubAgent {
 message SearchAgentsRequest {
   // Required. The project to list agents from.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Agent"
+    }
+  ];
 
   // Optional. The maximum number of items to return in a single page. By
   // default 100 and at most 1000.
@@ -364,7 +403,12 @@ message SearchAgentsResponse {
 message TrainAgentRequest {
   // Required. The project that the agent to train is associated with.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Agent"
+    }
+  ];
 }
 
 // The request message for [Agents.ExportAgent][google.cloud.dialogflow.v2beta1.Agents.ExportAgent].
@@ -398,7 +442,12 @@ message ExportAgentResponse {
 message ImportAgentRequest {
   // Required. The project that the agent to import is associated with.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Agent"
+    }
+  ];
 
   // Required. The agent to import.
   oneof agent {
@@ -415,7 +464,12 @@ message ImportAgentRequest {
 message RestoreAgentRequest {
   // Required. The project that the agent to restore is associated with.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Agent"
+    }
+  ];
 
   // Required. The agent to restore.
   oneof agent {
@@ -432,7 +486,12 @@ message RestoreAgentRequest {
 message GetValidationResultRequest {
   // Required. The project that the agent is associated with.
   // Format: `projects/`.
-  string parent = 1 [(google.api.field_behavior) = REQUIRED];
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Agent"
+    }
+  ];
 
   // Optional. The language for which you want a validation result. If not
   // specified, the agent's default language is used. [Many
diff --git a/google/cloud/dialogflow/v2beta1/audio_config.proto b/google/cloud/dialogflow/v2beta1/audio_config.proto
index 15ac78d21..2b9807c15 100644
--- a/google/cloud/dialogflow/v2beta1/audio_config.proto
+++ b/google/cloud/dialogflow/v2beta1/audio_config.proto
@@ -30,6 +30,35 @@ option java_outer_classname = "AudioConfigProto";
 option java_package = "com.google.cloud.dialogflow.v2beta1";
 option objc_class_prefix = "DF";
 
+// Hints for the speech recognizer to help with recognition in a specific
+// conversation state.
+message SpeechContext {
+  // Optional. A list of strings containing words and phrases that the speech
+  // recognizer should recognize with higher likelihood.
+  //
+  // This list can be used to:
+  // * improve accuracy for words and phrases you expect the user to say,
+  //   e.g. typical commands for your Dialogflow agent
+  // * add additional words to the speech recognizer vocabulary
+  // * ...
+  //
+  // See the [Cloud Speech
+  // documentation](https://cloud.google.com/speech-to-text/quotas) for usage
+  // limits.
+  repeated string phrases = 1;
+
+  // Optional. Boost for this context compared to other contexts:
+  //
+  // * If the boost is positive, Dialogflow will increase the probability that
+  //   the phrases in this context are recognized over similar sounding phrases.
+  // * If the boost is unspecified or non-positive, Dialogflow will not apply
+  //   any boost.
+  //
+  // Dialogflow recommends that you use boosts in the range (0, 20] and that you
+  // find a value that fits your use case with binary search.
+  float boost = 2;
+}
+
 // Audio encoding of the audio content sent in the conversational query request.
 // Refer to the
 // [Cloud Speech API
@@ -79,32 +108,29 @@ enum AudioEncoding {
   AUDIO_ENCODING_SPEEX_WITH_HEADER_BYTE = 7;
 }
 
-// Hints for the speech recognizer to help with recognition in a specific
-// conversation state.
-message SpeechContext {
-  // Optional. A list of strings containing words and phrases that the speech
-  // recognizer should recognize with higher likelihood.
-  //
-  // This list can be used to:
-  // * improve accuracy for words and phrases you expect the user to say,
-  //   e.g. typical commands for your Dialogflow agent
-  // * add additional words to the speech recognizer vocabulary
-  // * ...
-  //
-  // See the [Cloud Speech
-  // documentation](https://cloud.google.com/speech-to-text/quotas) for usage
-  // limits.
-  repeated string phrases = 1;
+// Information for a word recognized by the speech recognizer.
+message SpeechWordInfo {
+  // The word this info is for.
+  string word = 3;
 
-  // Optional. Boost for this context compared to other contexts:
-  // * If the boost is positive, Dialogflow will increase the probability that
-  //   the phrases in this context are recognized over similar sounding phrases.
-  // * If the boost is unspecified or non-positive, Dialogflow will not apply
-  //   any boost.
+  // Time offset relative to the beginning of the audio that corresponds to the
+  // start of the spoken word. This is an experimental feature and the accuracy
+  // of the time offset can vary.
+  google.protobuf.Duration start_offset = 1;
+
+  // Time offset relative to the beginning of the audio that corresponds to the
+  // end of the spoken word. This is an experimental feature and the accuracy of
+  // the time offset can vary.
+  google.protobuf.Duration end_offset = 2;
+
+  // The Speech confidence between 0.0 and 1.0 for this word. A higher number
+  // indicates an estimated greater likelihood that the recognized word is
+  // correct. The default of 0.0 is a sentinel value indicating that confidence
+  // was not set.
   //
-  // Dialogflow recommends that you use boosts in the range (0, 20] and that you
-  // find a value that fits your use case with binary search.
-  float boost = 2;
+  // This field is not guaranteed to be fully stable over time for the same
+  // audio input. Users should also not rely on it to always be provided.
+  float confidence = 4;
 }
 
 // Variant of the specified [Speech model][google.cloud.dialogflow.v2beta1.InputAudioConfig.model] to use.
@@ -150,31 +176,6 @@ enum SpeechModelVariant {
   USE_ENHANCED = 3;
 }
 
-// Information for a word recognized by the speech recognizer.
-message SpeechWordInfo {
-  // The word this info is for.
-  string word = 3;
-
-  // Time offset relative to the beginning of the audio that corresponds to the
-  // start of the spoken word. This is an experimental feature and the accuracy
-  // of the time offset can vary.
-  google.protobuf.Duration start_offset = 1;
-
-  // Time offset relative to the beginning of the audio that corresponds to the
-  // end of the spoken word. This is an experimental feature and the accuracy of
-  // the time offset can vary.
-  google.protobuf.Duration end_offset = 2;
-
-  // The Speech confidence between 0.0 and 1.0 for this word. A higher number
-  // indicates an estimated greater likelihood that the recognized word is
-  // correct. The default of 0.0 is a sentinel value indicating that confidence
-  // was not set.
-  //
-  // This field is not guaranteed to be fully stable over time for the same
-  // audio input. Users should also not rely on it to always be provided.
-  float confidence = 4;
-}
-
 // Instructs the speech recognizer on how to process the audio content.
 message InputAudioConfig {
   // Required. Audio encoding of the audio content to process.
@@ -248,6 +249,21 @@ message InputAudioConfig {
   bool single_utterance = 8;
 }
 
+// Description of which voice to use for speech synthesis.
+message VoiceSelectionParams {
+  // Optional. The name of the voice. If not set, the service will choose a
+  // voice based on the other parameters such as language_code and
+  // [ssml_gender][google.cloud.dialogflow.v2beta1.VoiceSelectionParams.ssml_gender].
+  string name = 1;
+
+  // Optional. The preferred gender of the voice. If not set, the service will
+  // choose a voice based on the other parameters such as language_code and
+  // [name][google.cloud.dialogflow.v2beta1.VoiceSelectionParams.name]. Note that this is only a preference, not requirement. If a
+  // voice of the appropriate gender is not available, the synthesizer should
+  // substitute a voice with a different gender rather than failing the request.
+  SsmlVoiceGender ssml_gender = 2;
+}
+
 // Gender of the voice as described in
 // [SSML voice element](https://www.w3.org/TR/speech-synthesis11/#edef_voice).
 enum SsmlVoiceGender {
@@ -265,21 +281,6 @@ enum SsmlVoiceGender {
   SSML_VOICE_GENDER_NEUTRAL = 3;
 }
 
-// Description of which voice to use for speech synthesis.
-message VoiceSelectionParams {
-  // Optional. The name of the voice. If not set, the service will choose a
-  // voice based on the other parameters such as language_code and
-  // [ssml_gender][google.cloud.dialogflow.v2beta1.VoiceSelectionParams.ssml_gender].
-  string name = 1;
-
-  // Optional. The preferred gender of the voice. If not set, the service will
-  // choose a voice based on the other parameters such as language_code and
-  // [name][google.cloud.dialogflow.v2beta1.VoiceSelectionParams.name]. Note that this is only a preference, not requirement. If a
-  // voice of the appropriate gender is not available, the synthesizer should
-  // substitute a voice with a different gender rather than failing the request.
-  SsmlVoiceGender ssml_gender = 2;
-}
-
 // Configuration of how speech should be synthesized.
 message SynthesizeSpeechConfig {
   // Optional. Speaking rate/speed, in the range [0.25, 4.0]. 1.0 is the normal
@@ -312,6 +313,24 @@ message SynthesizeSpeechConfig {
   VoiceSelectionParams voice = 4;
 }
 
+// Instructs the speech synthesizer how to generate the output audio content.
+// If this audio config is supplied in a request, it overrides all existing
+// text-to-speech settings applied to the agent.
+message OutputAudioConfig {
+  // Required. Audio encoding of the synthesized audio content.
+  OutputAudioEncoding audio_encoding = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // The synthesis sample rate (in hertz) for this audio. If not
+  // provided, then the synthesizer will use the default sample rate based on
+  // the audio encoding. If this is different from the voice's natural sample
+  // rate, then the synthesizer will honor this request by converting to the
+  // desired sample rate (which might result in worse audio quality).
+  int32 sample_rate_hertz = 2;
+
+  // Configuration of how speech should be synthesized.
+  SynthesizeSpeechConfig synthesize_speech_config = 3;
+}
+
 // Audio encoding of the output audio format in Text-To-Speech.
 enum OutputAudioEncoding {
   // Not specified.
@@ -330,21 +349,3 @@ enum OutputAudioEncoding {
   // than MP3 while using approximately the same bitrate.
   OUTPUT_AUDIO_ENCODING_OGG_OPUS = 3;
 }
-
-// Instructs the speech synthesizer how to generate the output audio content.
-// If this audio config is supplied in a request, it overrides all existing
-// text-to-speech settings applied to the agent.
-message OutputAudioConfig {
-  // Required. Audio encoding of the synthesized audio content.
-  OutputAudioEncoding audio_encoding = 1 [(google.api.field_behavior) = REQUIRED];
-
-  // The synthesis sample rate (in hertz) for this audio. If not
-  // provided, then the synthesizer will use the default sample rate based on
-  // the audio encoding. If this is different from the voice's natural sample
-  // rate, then the synthesizer will honor this request by converting to the
-  // desired sample rate (which might result in worse audio quality).
-  int32 sample_rate_hertz = 2;
-
-  // Configuration of how speech should be synthesized.
-  SynthesizeSpeechConfig synthesize_speech_config = 3;
-}
diff --git a/google/cloud/dialogflow/v2beta1/context.proto b/google/cloud/dialogflow/v2beta1/context.proto
index fb1c3cee3..b15121af0 100644
--- a/google/cloud/dialogflow/v2beta1/context.proto
+++ b/google/cloud/dialogflow/v2beta1/context.proto
@@ -17,10 +17,12 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
 import "google/protobuf/struct.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -68,6 +70,7 @@ service Contexts {
         get: "/v2beta1/{parent=projects/*/locations/*/agent/environments/*/users/*/sessions/*}/contexts"
       }
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Retrieves the specified context.
@@ -84,6 +87,7 @@ service Contexts {
         get: "/v2beta1/{name=projects/*/locations/*/agent/environments/*/users/*/sessions/*/contexts/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Creates a context.
@@ -106,6 +110,7 @@ service Contexts {
         body: "context"
       }
     };
+    option (google.api.method_signature) = "parent,context";
   }
 
   // Updates the specified context.
@@ -126,6 +131,7 @@ service Contexts {
         body: "context"
       }
     };
+    option (google.api.method_signature) = "context,update_mask";
   }
 
   // Deletes the specified context.
@@ -142,6 +148,7 @@ service Contexts {
         delete: "/v2beta1/{name=projects/*/locations/*/agent/environments/*/users/*/sessions/*/contexts/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Deletes all active contexts in the specified session.
@@ -158,11 +165,19 @@ service Contexts {
         delete: "/v2beta1/{parent=projects/*/locations/*/agent/environments/*/users/*/sessions/*}/contexts"
       }
     };
+    option (google.api.method_signature) = "parent";
   }
 }
 
 // Represents a context.
 message Context {
+  option (google.api.resource) = {
+    type: "dialogflow.googleapis.com/Context"
+    pattern: "projects/{project}/agent/sessions/{session}/contexts/{context}"
+    pattern: "projects/{project}/agent/environments/{environment}/users/{user}/sessions/{session}/contexts/{context}"
+    pattern: "projects/{project}/locations/{location}/agent/sessions/{session}/contexts/{context}"
+  };
+
   // Required. The unique identifier of the context. Format:
   // `projects//agent/sessions//contexts/`,
   // or `projects//agent/environments//users//sessions/`. If `Environment ID` is not specified, we assume
   // default 'draft' environment. If `User ID` is not specified, we assume
   // default '-' user.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Context"
+    }
+  ];
 
   // Optional. The maximum number of items to return in a single page. By
   // default 100 and at most 1000.
@@ -243,7 +263,12 @@ message GetContextRequest {
   // ID>/sessions//contexts/`. If `Environment ID` is
   // not specified, we assume default 'draft' environment. If `User ID` is not
   // specified, we assume default '-' user.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/Context"
+    }
+  ];
 }
 
 // The request message for [Contexts.CreateContext][google.cloud.dialogflow.v2beta1.Contexts.CreateContext].
@@ -254,19 +279,24 @@ message CreateContextRequest {
   // ID>/sessions/`. If `Environment ID` is not specified, we assume
   // default 'draft' environment. If `User ID` is not specified, we assume
   // default '-' user.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Context"
+    }
+  ];
 
   // Required. The context to create.
-  Context context = 2;
+  Context context = 2 [(google.api.field_behavior) = REQUIRED];
 }
 
 // The request message for [Contexts.UpdateContext][google.cloud.dialogflow.v2beta1.Contexts.UpdateContext].
 message UpdateContextRequest {
   // Required. The context to update.
-  Context context = 1;
+  Context context = 1 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. The mask to control which fields get updated.
-  google.protobuf.FieldMask update_mask = 2;
+  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // The request message for [Contexts.DeleteContext][google.cloud.dialogflow.v2beta1.Contexts.DeleteContext].
@@ -277,7 +307,12 @@ message DeleteContextRequest {
   // ID>/sessions//contexts/`. If `Environment ID` is
   // not specified, we assume default 'draft' environment. If `User ID` is not
   // specified, we assume default '-' user.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/Context"
+    }
+  ];
 }
 
 // The request message for [Contexts.DeleteAllContexts][google.cloud.dialogflow.v2beta1.Contexts.DeleteAllContexts].
@@ -287,5 +322,10 @@ message DeleteAllContextsRequest {
   // ID>/agent/environments//users//sessions/`. If `Environment ID` is not specified we assume default 'draft'
   // environment. If `User ID` is not specified, we assume default '-' user.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Context"
+    }
+  ];
 }
diff --git a/google/cloud/dialogflow/v2beta1/document.proto b/google/cloud/dialogflow/v2beta1/document.proto
index 02b6e4e81..e1e53911c 100644
--- a/google/cloud/dialogflow/v2beta1/document.proto
+++ b/google/cloud/dialogflow/v2beta1/document.proto
@@ -17,14 +17,15 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
 import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
 import "google/cloud/dialogflow/v2beta1/gcs.proto";
 import "google/longrunning/operations.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
 import "google/protobuf/timestamp.proto";
 import "google/rpc/status.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -52,6 +53,7 @@ service Documents {
         get: "/v2beta1/{parent=projects/*/agent/knowledgeBases/*}/documents"
       }
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Retrieves the specified document.
@@ -65,6 +67,7 @@ service Documents {
         get: "/v2beta1/{name=projects/*/agent/knowledgeBases/*/documents/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Creates a new document.
@@ -80,6 +83,7 @@ service Documents {
         body: "document"
       }
     };
+    option (google.api.method_signature) = "parent,document";
     option (google.longrunning.operation_info) = {
       response_type: "Document"
       metadata_type: "KnowledgeOperationMetadata"
@@ -97,6 +101,7 @@ service Documents {
         delete: "/v2beta1/{name=projects/*/agent/knowledgeBases/*/documents/*}"
       }
     };
+    option (google.api.method_signature) = "name";
     option (google.longrunning.operation_info) = {
       response_type: "google.protobuf.Empty"
       metadata_type: "KnowledgeOperationMetadata"
@@ -116,6 +121,7 @@ service Documents {
         body: "document"
       }
     };
+    option (google.api.method_signature) = "document,update_mask";
     option (google.longrunning.operation_info) = {
       response_type: "Document"
       metadata_type: "KnowledgeOperationMetadata"
@@ -150,6 +156,22 @@ service Documents {
 // Note: The `projects.agent.knowledgeBases.documents` resource is deprecated;
 // only use `projects.knowledgeBases.documents`.
 message Document {
+  option (google.api.resource) = {
+    type: "dialogflow.googleapis.com/Document"
+    pattern: "projects/{project}/knowledgeBases/{knowledge_base}/documents/{document}"
+  };
+
+  // The status of a reload attempt.
+  message ReloadStatus {
+    // Output only. The time of a reload attempt.
+    // This reload may have been triggered automatically or manually and may
+    // not have succeeded.
+    google.protobuf.Timestamp time = 1;
+
+    // Output only. The status of a reload attempt or the initial load.
+    google.rpc.Status status = 2;
+  }
+
   // The knowledge type of document content.
   enum KnowledgeType {
     // The type is unspecified or arbitrary.
@@ -169,23 +191,23 @@ message Document {
     EXTRACTIVE_QA = 2;
   }
 
-  // The document resource name.
+  // Optional. The document resource name.
   // The name must be empty when creating a document.
   // Format: `projects//knowledgeBases//documents/`.
-  string name = 1;
+  string name = 1 [(google.api.field_behavior) = OPTIONAL];
 
   // Required. The display name of the document. The name must be 1024 bytes or
   // less; otherwise, the creation request fails.
-  string display_name = 2;
+  string display_name = 2 [(google.api.field_behavior) = REQUIRED];
 
   // Required. The MIME type of this document.
-  string mime_type = 3;
+  string mime_type = 3 [(google.api.field_behavior) = REQUIRED];
 
   // Required. The knowledge type of document content.
-  repeated KnowledgeType knowledge_types = 4;
+  repeated KnowledgeType knowledge_types = 4 [(google.api.field_behavior) = REQUIRED];
 
-  // Required. The source of this document.
+  // The source of this document.
   oneof source {
     // The URI where the file content is located.
     //
@@ -208,20 +230,61 @@ message Document {
     // EXTRACTIVE_QA and FAQ knowledge types.
     bytes raw_content = 9;
   }
+
+  // Optional. If true, we try to automatically reload the document every day
+  // (at a time picked by the system). If false or unspecified, we don't try
+  // to automatically reload the document.
+  //
+  // Currently you can only enable automatic reload for documents sourced from
+  // a public url, see `source` field for the source types.
+  //
+  // Reload status can be tracked in `latest_reload_status`. If a reload
+  // fails, we will keep the document unchanged.
+  //
+  // If a reload fails with internal errors, the system will try to reload the
+  // document on the next day.
+  // If a reload fails with non-retriable errors (e.g. PERMISION_DENIED), the
+  // system will not try to reload the document anymore. You need to manually
+  // reload the document successfully by calling `ReloadDocument` and clear the
+  // errors.
+  bool enable_auto_reload = 11 [(google.api.field_behavior) = OPTIONAL];
+
+  // Output only. The time and status of the latest reload.
+  // This reload may have been triggered automatically or manually
+  // and may not have succeeded.
+  ReloadStatus latest_reload_status = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
+}
+
+// Request message for [Documents.GetDocument][google.cloud.dialogflow.v2beta1.Documents.GetDocument].
+message GetDocumentRequest {
+  // Required. The name of the document to retrieve.
+  // Format `projects//knowledgeBases//documents/`.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/Document"
+    }
+  ];
 }
 
 // Request message for [Documents.ListDocuments][google.cloud.dialogflow.v2beta1.Documents.ListDocuments].
 message ListDocumentsRequest {
   // Required. The knowledge base to list all documents for.
   // Format: `projects//knowledgeBases/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Document"
+    }
+  ];
 
   // Optional. The maximum number of items to return in a single page. By
   // default 10 and at most 100.
-  int32 page_size = 2;
+  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The next_page_token value returned from a previous list request.
-  string page_token = 3;
+  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // Response message for [Documents.ListDocuments][google.cloud.dialogflow.v2beta1.Documents.ListDocuments].
@@ -234,41 +297,43 @@ message ListDocumentsResponse {
   string next_page_token = 2;
 }
 
-// Request message for [Documents.GetDocument][google.cloud.dialogflow.v2beta1.Documents.GetDocument].
-message GetDocumentRequest {
-  // Required. The name of the document to retrieve.
-  // Format `projects//knowledgeBases//documents/`.
-  string name = 1;
-}
-
 // Request message for [Documents.CreateDocument][google.cloud.dialogflow.v2beta1.Documents.CreateDocument].
 message CreateDocumentRequest {
   // Required. The knoweldge base to create a document for.
   // Format: `projects//knowledgeBases/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Document"
+    }
+  ];
 
   // Required. The document to create.
-  Document document = 2;
+  Document document = 2 [(google.api.field_behavior) = REQUIRED];
 }
 
 // Request message for [Documents.DeleteDocument][google.cloud.dialogflow.v2beta1.Documents.DeleteDocument].
 message DeleteDocumentRequest {
-  // The name of the document to delete.
+  // Required. The name of the document to delete.
   // Format: `projects//knowledgeBases//documents/`.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/Document"
+    }
+  ];
 }
 
 // Request message for [Documents.UpdateDocument][google.cloud.dialogflow.v2beta1.Documents.UpdateDocument].
 message UpdateDocumentRequest {
   // Required. The document to update.
-  Document document = 1;
+  Document document = 1 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. Not specified means `update all`.
   // Currently, only `display_name` can be updated, an InvalidArgument will be
   // returned for attempting to update other fields.
-  google.protobuf.FieldMask update_mask = 2;
+  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // Metadata in google::longrunning::Operation for Knowledge operations.
@@ -288,22 +353,27 @@ message KnowledgeOperationMetadata {
     DONE = 3;
   }
 
-  // Required. The current state of this operation.
-  State state = 1;
+  // Required. Output only. The current state of this operation.
+  State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
 }
 
 // Request message for [Documents.ReloadDocument][google.cloud.dialogflow.v2beta1.Documents.ReloadDocument].
 message ReloadDocumentRequest {
-  // The name of the document to reload.
+  // Required. The name of the document to reload.
   // Format: `projects//knowledgeBases//documents/`
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/Document"
+    }
+  ];
 
   // The source for document reloading.
   // Optional. If provided, the service will load the contents from the source
   // and update document in the knowledge base.
   oneof source {
-    // Optional. The path for a Cloud Storage source file for reloading document content.
+    // The path for a Cloud Storage source file for reloading document content.
     // If not provided, the Document's existing source will be reloaded.
     GcsSource gcs_source = 3;
   }
diff --git a/google/cloud/dialogflow/v2beta1/entity_type.proto b/google/cloud/dialogflow/v2beta1/entity_type.proto
index 0f0932d2d..9c0042810 100644
--- a/google/cloud/dialogflow/v2beta1/entity_type.proto
+++ b/google/cloud/dialogflow/v2beta1/entity_type.proto
@@ -17,12 +17,12 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
 import "google/api/field_behavior.proto";
 import "google/api/resource.proto";
 import "google/longrunning/operations.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -74,6 +74,8 @@ service EntityTypes {
         get: "/v2beta1/{parent=projects/*/locations/*/agent}/entityTypes"
       }
     };
+    option (google.api.method_signature) = "parent";
+    option (google.api.method_signature) = "parent,language_code";
   }
 
   // Retrieves the specified entity type.
@@ -84,6 +86,8 @@ service EntityTypes {
         get: "/v2beta1/{name=projects/*/locations/*/agent/entityTypes/*}"
       }
     };
+    option (google.api.method_signature) = "name";
+    option (google.api.method_signature) = "name,language_code";
   }
 
   // Creates an entity type in the specified agent.
@@ -96,6 +100,8 @@ service EntityTypes {
         body: "entity_type"
       }
     };
+    option (google.api.method_signature) = "parent,entity_type";
+    option (google.api.method_signature) = "parent,entity_type,language_code";
   }
 
   // Updates the specified entity type.
@@ -108,6 +114,9 @@ service EntityTypes {
         body: "entity_type"
       }
     };
+    option (google.api.method_signature) = "entity_type";
+    option (google.api.method_signature) = "entity_type,language_code";
+    option (google.api.method_signature) = "entity_type,language_code,update_mask";
   }
 
   // Deletes the specified entity type.
@@ -118,10 +127,10 @@ service EntityTypes {
         delete: "/v2beta1/{name=projects/*/locations/*/agent/entityTypes/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Updates/Creates multiple entity types in the specified agent.
-  //
   // Operation 
   rpc BatchUpdateEntityTypes(BatchUpdateEntityTypesRequest) returns (google.longrunning.Operation) {
     option (google.api.http) = {
@@ -132,10 +141,13 @@ service EntityTypes {
         body: "*"
       }
     };
+    option (google.longrunning.operation_info) = {
+      response_type: "google.cloud.dialogflow.v2beta1.BatchUpdateEntityTypesResponse"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Deletes entity types in the specified agent.
-  //
   // Operation 
   rpc BatchDeleteEntityTypes(BatchDeleteEntityTypesRequest) returns (google.longrunning.Operation) {
     option (google.api.http) = {
@@ -146,6 +158,11 @@ service EntityTypes {
         body: "*"
       }
     };
+    option (google.api.method_signature) = "parent,entity_type_names";
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Creates multiple new entities in the specified entity type.
@@ -160,6 +177,10 @@ service EntityTypes {
         body: "*"
       }
     };
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Updates or creates multiple entities in the specified entity type. This
@@ -176,6 +197,12 @@ service EntityTypes {
         body: "*"
       }
     };
+    option (google.api.method_signature) = "parent,entities";
+    option (google.api.method_signature) = "parent,entities,language_code";
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Deletes entities in the specified entity type.
@@ -190,6 +217,12 @@ service EntityTypes {
         body: "*"
       }
     };
+    option (google.api.method_signature) = "parent,entity_values";
+    option (google.api.method_signature) = "parent,entity_values,language_code";
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 }
 
@@ -197,6 +230,12 @@ service EntityTypes {
 // Entity types serve as a tool for extracting parameter values from natural
 // language queries.
 message EntityType {
+  option (google.api.resource) = {
+    type: "dialogflow.googleapis.com/EntityType"
+    pattern: "projects/{project}/agent/entityTypes/{entity_type}"
+    pattern: "projects/{project}/locations/{location}/agent/entityTypes/{entity_type}"
+  };
+
   // An **entity entry** for an associated entity type.
   message Entity {
     // Required. The primary value associated with this entity entry.
@@ -261,27 +300,32 @@ message EntityType {
   string name = 1;
 
   // Required. The name of the entity type.
-  string display_name = 2;
+  string display_name = 2 [(google.api.field_behavior) = REQUIRED];
 
   // Required. Indicates the kind of entity type.
-  Kind kind = 3;
+  Kind kind = 3 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. Indicates whether the entity type can be automatically
   // expanded.
-  AutoExpansionMode auto_expansion_mode = 4;
+  AutoExpansionMode auto_expansion_mode = 4 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The collection of entity entries associated with the entity type.
-  repeated Entity entities = 6;
+  repeated Entity entities = 6 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. Enables fuzzy entity extraction during classification.
-  bool enable_fuzzy_extraction = 7;
+  bool enable_fuzzy_extraction = 7 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // The request message for [EntityTypes.ListEntityTypes][google.cloud.dialogflow.v2beta1.EntityTypes.ListEntityTypes].
 message ListEntityTypesRequest {
   // Required. The agent to list all entity types from.
   // Format: `projects//agent`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 
   // Optional. The language used to access language-specific data.
   // If not specified, the agent's default language is used.
@@ -292,10 +336,10 @@ message ListEntityTypesRequest {
 
   // Optional. The maximum number of items to return in a single page. By
   // default 100 and at most 1000.
-  int32 page_size = 3;
+  int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The next_page_token value returned from a previous list request.
-  string page_token = 4;
+  string page_token = 4 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // The response message for [EntityTypes.ListEntityTypes][google.cloud.dialogflow.v2beta1.EntityTypes.ListEntityTypes].
@@ -313,7 +357,12 @@ message ListEntityTypesResponse {
 message GetEntityTypeRequest {
   // Required. The name of the entity type.
   // Format: `projects//agent/entityTypes/`.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 
   // Optional. The language used to access language-specific data.
   // If not specified, the agent's default language is used.
@@ -327,10 +376,15 @@ message GetEntityTypeRequest {
 message CreateEntityTypeRequest {
   // Required. The agent to create a entity type for.
   // Format: `projects//agent`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 
   // Required. The entity type to create.
-  EntityType entity_type = 2;
+  EntityType entity_type = 2 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. The language used to access language-specific data.
   // If not specified, the agent's default language is used.
@@ -343,7 +397,7 @@ message CreateEntityTypeRequest {
 // The request message for [EntityTypes.UpdateEntityType][google.cloud.dialogflow.v2beta1.EntityTypes.UpdateEntityType].
 message UpdateEntityTypeRequest {
   // Required. The entity type to update.
-  EntityType entity_type = 1;
+  EntityType entity_type = 1 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. The language used to access language-specific data.
   // If not specified, the agent's default language is used.
@@ -353,23 +407,33 @@ message UpdateEntityTypeRequest {
   string language_code = 2 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The mask to control which fields get updated.
-  google.protobuf.FieldMask update_mask = 3;
+  google.protobuf.FieldMask update_mask = 3 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // The request message for [EntityTypes.DeleteEntityType][google.cloud.dialogflow.v2beta1.EntityTypes.DeleteEntityType].
 message DeleteEntityTypeRequest {
   // Required. The name of the entity type to delete.
   // Format: `projects//agent/entityTypes/`.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 }
 
 // The request message for [EntityTypes.BatchUpdateEntityTypes][google.cloud.dialogflow.v2beta1.EntityTypes.BatchUpdateEntityTypes].
 message BatchUpdateEntityTypesRequest {
   // Required. The name of the agent to update or create entity types in.
   // Format: `projects//agent`.
-  string parent = 1;
-
-  // Required. The source of the entity type batch.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
+
+  // The source of the entity type batch.
   //
   // For each entity type in the batch:
   //
@@ -394,7 +458,7 @@ message BatchUpdateEntityTypesRequest {
   string language_code = 4 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The mask to control which fields get updated.
-  google.protobuf.FieldMask update_mask = 5;
+  google.protobuf.FieldMask update_mask = 5 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // The response message for [EntityTypes.BatchUpdateEntityTypes][google.cloud.dialogflow.v2beta1.EntityTypes.BatchUpdateEntityTypes].
@@ -407,18 +471,28 @@ message BatchUpdateEntityTypesResponse {
 message BatchDeleteEntityTypesRequest {
   // Required. The name of the agent to delete all entities types for. Format:
   // `projects//agent`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 
   // Required. The names entity types to delete. All names must point to the
   // same agent as `parent`.
-  repeated string entity_type_names = 2;
+  repeated string entity_type_names = 2 [(google.api.field_behavior) = REQUIRED];
 }
 
 // The request message for [EntityTypes.BatchCreateEntities][google.cloud.dialogflow.v2beta1.EntityTypes.BatchCreateEntities].
 message BatchCreateEntitiesRequest {
   // Required. The name of the entity type to create entities in. Format:
   // `projects//agent/entityTypes/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 
   // Required. The entities to create.
   repeated EntityType.Entity entities = 2;
@@ -435,7 +509,12 @@ message BatchCreateEntitiesRequest {
 message BatchUpdateEntitiesRequest {
   // Required. The name of the entity type to update or create entities in.
   // Format: `projects//agent/entityTypes/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 
   // Required. The entities to update or create.
   repeated EntityType.Entity entities = 2;
@@ -455,7 +534,12 @@ message BatchUpdateEntitiesRequest {
 message BatchDeleteEntitiesRequest {
   // Required. The name of the entity type to delete entries for. Format:
   // `projects//agent/entityTypes/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/EntityType"
+    }
+  ];
 
   // Required. The reference `values` of the entities to delete. Note that
   // these are not fully-qualified names, i.e. they don't start with
diff --git a/google/cloud/dialogflow/v2beta1/environment.proto b/google/cloud/dialogflow/v2beta1/environment.proto
index 386c014d6..d9cfbb9ed 100644
--- a/google/cloud/dialogflow/v2beta1/environment.proto
+++ b/google/cloud/dialogflow/v2beta1/environment.proto
@@ -58,7 +58,7 @@ message Environment {
     pattern: "projects/{project}/agent/environments/{environment}"
   };
 
-  // Represents an environment state. When a environment is pointed to a new
+  // Represents an environment state. When an environment is pointed to a new
   // agent version, the environment is temporarily set to the `LOADING` state.
   // During that time, the environment keeps on serving the previous version of
   // the agent. After the new agent version is done loading, the environment is
diff --git a/google/cloud/dialogflow/v2beta1/intent.proto b/google/cloud/dialogflow/v2beta1/intent.proto
index 1b1687262..f676a6f15 100644
--- a/google/cloud/dialogflow/v2beta1/intent.proto
+++ b/google/cloud/dialogflow/v2beta1/intent.proto
@@ -17,6 +17,7 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
 import "google/api/field_behavior.proto";
 import "google/api/resource.proto";
 import "google/cloud/dialogflow/v2beta1/audio_config.proto";
@@ -26,7 +27,6 @@ import "google/protobuf/duration.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
 import "google/protobuf/struct.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -82,6 +82,8 @@ service Intents {
         get: "/v2beta1/{parent=projects/*/locations/*/agent}/intents"
       }
     };
+    option (google.api.method_signature) = "parent";
+    option (google.api.method_signature) = "parent,language_code";
   }
 
   // Retrieves the specified intent.
@@ -92,6 +94,8 @@ service Intents {
         get: "/v2beta1/{name=projects/*/locations/*/agent/intents/*}"
       }
     };
+    option (google.api.method_signature) = "name";
+    option (google.api.method_signature) = "name,language_code";
   }
 
   // Creates an intent in the specified agent.
@@ -104,6 +108,8 @@ service Intents {
         body: "intent"
       }
     };
+    option (google.api.method_signature) = "parent,intent";
+    option (google.api.method_signature) = "parent,intent,language_code";
   }
 
   // Updates the specified intent.
@@ -116,6 +122,10 @@ service Intents {
         body: "intent"
       }
     };
+    option (google.api.method_signature) = "intent,update_mask";
+    option (google.api.method_signature) = "intent";
+    option (google.api.method_signature) = "intent,language_code";
+    option (google.api.method_signature) = "intent,language_code,update_mask";
   }
 
   // Deletes the specified intent and its direct or indirect followup intents.
@@ -126,6 +136,7 @@ service Intents {
         delete: "/v2beta1/{name=projects/*/locations/*/agent/intents/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Updates/Creates multiple intents in the specified agent.
@@ -140,6 +151,10 @@ service Intents {
         body: "*"
       }
     };
+    option (google.longrunning.operation_info) = {
+      response_type: "google.cloud.dialogflow.v2beta1.BatchUpdateIntentsResponse"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 
   // Deletes intents in the specified agent.
@@ -154,6 +169,10 @@ service Intents {
         body: "*"
       }
     };
+    option (google.longrunning.operation_info) = {
+      response_type: "google.protobuf.Empty"
+      metadata_type: "google.protobuf.Struct"
+    };
   }
 }
 
@@ -212,7 +231,7 @@ message Intent {
     string name = 1;
 
     // Required. The type of the training phrase.
-    Type type = 2;
+    Type type = 2 [(google.api.field_behavior) = REQUIRED];
 
     // Required. The ordered list of training phrase parts.
     // The parts are concatenated in order to form the training phrase.
@@ -233,12 +252,12 @@ message Intent {
     // -   `Part.text` is set to a part of the phrase that you want to annotate,
     //     and the `entity_type`, `alias`, and `user_defined` fields are all
     //     set.
-    repeated Part parts = 3;
+    repeated Part parts = 3 [(google.api.field_behavior) = REQUIRED];
 
     // Optional. Indicates how many times this example was added to
     // the intent. Each time a developer adds an existing sample by editing an
     // intent or training, this counter is increased.
-    int32 times_added_count = 4;
+    int32 times_added_count = 4 [(google.api.field_behavior) = OPTIONAL];
   }
 
   // Represents intent parameters.
@@ -250,6 +269,7 @@ message Intent {
     string display_name = 2;
 
     // Optional. The definition of the parameter value. It can be:
+    //
     // - a constant string,
     // - a parameter value defined as `$parameter_name`,
     // - an original parameter value defined as `$parameter_name.original`,
@@ -534,7 +554,7 @@ message Intent {
     // with media and suggestions.
     //
     // For more details about RBM rich cards, please see:
-    // https://developers.google.com/rcs-business-messaging/rbm/guides/build/send-messages#rich-cards.
+    // https://developers.google.com/business-communications/rcs-business-messaging/guides/build/messages/send#rich-cards
     // If you want to show a single card with more control over the layout,
     // please use [RbmStandaloneCard][google.cloud.dialogflow.v2beta1.Intent.Message.RbmStandaloneCard] instead.
     message RbmCarouselCard {
@@ -564,7 +584,7 @@ message Intent {
     // with media and suggestions.
     //
     // For more details about RBM rich cards, please see:
-    // https://developers.google.com/rcs-business-messaging/rbm/guides/build/send-messages#rich-cards.
+    // https://developers.google.com/business-communications/rcs-business-messaging/guides/build/messages/send#rich-cards
     // You can group multiple rich cards into one using [RbmCarouselCard][google.cloud.dialogflow.v2beta1.Intent.Message.RbmCarouselCard] but
     // carousel cards will give you less control over the card layout.
     message RbmStandaloneCard {
@@ -1042,7 +1062,7 @@ message Intent {
     }
 
     // Optional. The platform that this message is intended for.
-    Platform platform = 6;
+    Platform platform = 6 [(google.api.field_behavior) = OPTIONAL];
   }
 
   // Represents a single followup intent in the chain.
@@ -1069,19 +1089,19 @@ message Intent {
     WEBHOOK_STATE_ENABLED_FOR_SLOT_FILLING = 2;
   }
 
-  // The unique identifier of this intent.
+  // Optional. The unique identifier of this intent.
   // Required for [Intents.UpdateIntent][google.cloud.dialogflow.v2beta1.Intents.UpdateIntent] and [Intents.BatchUpdateIntents][google.cloud.dialogflow.v2beta1.Intents.BatchUpdateIntents]
   // methods.
   // Format: `projects//agent/intents/`.
-  string name = 1;
+  string name = 1 [(google.api.field_behavior) = OPTIONAL];
 
   // Required. The name of this intent.
-  string display_name = 2;
+  string display_name = 2 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. Indicates whether webhooks are enabled for the intent.
-  WebhookState webhook_state = 6;
+  WebhookState webhook_state = 6 [(google.api.field_behavior) = OPTIONAL];
 
-  // The priority of this intent. Higher numbers represent higher
+  // Optional. The priority of this intent. Higher numbers represent higher
   // priorities.
   //
   // - If the supplied value is unspecified or 0, the service
@@ -1089,10 +1109,10 @@ message Intent {
   //   `Normal` priority in the console.
   // - If the supplied value is negative, the intent is ignored
   //   in runtime detect intent requests.
-  int32 priority = 3;
+  int32 priority = 3 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. Indicates whether this is a fallback intent.
-  bool is_fallback = 4;
+  bool is_fallback = 4 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. Indicates whether Machine Learning is enabled for the intent.
   // Note: If `ml_enabled` setting is set to false, then this intent is not
@@ -1105,51 +1125,54 @@ message Intent {
   //   ml_enabled = false / ml_disabled = true.
   // - After April 15th, 2018 the default is:
   //   ml_enabled = true / ml_disabled = false.
-  bool ml_enabled = 5 [deprecated = true];
+  bool ml_enabled = 5 [
+    deprecated = true,
+    (google.api.field_behavior) = OPTIONAL
+  ];
 
   // Optional. Indicates whether Machine Learning is disabled for the intent.
   // Note: If `ml_disabled` setting is set to true, then this intent is not
   // taken into account during inference in `ML ONLY` match mode. Also,
   // auto-markup in the UI is turned off.
-  bool ml_disabled = 19;
+  bool ml_disabled = 19 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. Indicates that this intent ends an interaction. Some integrations
   // (e.g., Actions on Google or Dialogflow phone gateway) use this information
   // to close interaction with an end user. Default is false.
-  bool end_interaction = 21;
+  bool end_interaction = 21 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The list of context names required for this intent to be
   // triggered.
   // Format: `projects//agent/sessions/-/contexts/`.
-  repeated string input_context_names = 7;
+  repeated string input_context_names = 7 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The collection of event names that trigger the intent.
   // If the collection of input contexts is not empty, all of the contexts must
   // be present in the active user session for an event to trigger this intent.
   // Event names are limited to 150 characters.
-  repeated string events = 8;
+  repeated string events = 8 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The collection of examples that the agent is
   // trained on.
-  repeated TrainingPhrase training_phrases = 9;
+  repeated TrainingPhrase training_phrases = 9 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The name of the action associated with the intent.
   // Note: The action name must not contain whitespaces.
-  string action = 10;
+  string action = 10 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The collection of contexts that are activated when the intent
   // is matched. Context messages in this collection should not set the
   // parameters field. Setting the `lifespan_count` to 0 will reset the context
   // when the intent is matched.
   // Format: `projects//agent/sessions/-/contexts/`.
-  repeated Context output_contexts = 11;
+  repeated Context output_contexts = 11 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. Indicates whether to delete all contexts in the current
   // session when this intent is matched.
-  bool reset_contexts = 12;
+  bool reset_contexts = 12 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The collection of parameters associated with the intent.
-  repeated Parameter parameters = 13;
+  repeated Parameter parameters = 13 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The collection of rich messages corresponding to the
   // `Response` field in the Dialogflow console.
@@ -1157,16 +1180,16 @@ message Intent {
 
   // Optional. The list of platforms for which the first responses will be
   // copied from the messages in PLATFORM_UNSPECIFIED (i.e. default platform).
-  repeated Message.Platform default_response_platforms = 15;
+  repeated Message.Platform default_response_platforms = 15 [(google.api.field_behavior) = OPTIONAL];
 
-  // Read-only. The unique identifier of the root intent in the chain of
+  // Output only. The unique identifier of the root intent in the chain of
   // followup intents. It identifies the correct followup intents chain for
-  // this intent. We populate this field only in the output.
+  // this intent.
   //
   // Format: `projects//agent/intents/`.
-  string root_followup_intent_name = 16;
+  string root_followup_intent_name = 16 [(google.api.field_behavior) = OUTPUT_ONLY];
 
-  // Read-only after creation. The unique identifier of the parent intent in the
+  // Optional. The unique identifier of the parent intent in the
   // chain of followup intents. You can set this field when creating an intent,
   // for example with [CreateIntent][google.cloud.dialogflow.v2beta1.Intents.CreateIntent] or
   // [BatchUpdateIntents][google.cloud.dialogflow.v2beta1.Intents.BatchUpdateIntents], in order to make this
@@ -1174,18 +1197,23 @@ message Intent {
   //
   // It identifies the parent followup intent.
   // Format: `projects//agent/intents/`.
-  string parent_followup_intent_name = 17;
+  string parent_followup_intent_name = 17 [(google.api.field_behavior) = OPTIONAL];
 
-  // Read-only. Information about all followup intents that have this intent as
+  // Output only. Information about all followup intents that have this intent as
   // a direct or indirect parent. We populate this field only in the output.
-  repeated FollowupIntentInfo followup_intent_info = 18;
+  repeated FollowupIntentInfo followup_intent_info = 18 [(google.api.field_behavior) = OUTPUT_ONLY];
 }
 
 // The request message for [Intents.ListIntents][google.cloud.dialogflow.v2beta1.Intents.ListIntents].
 message ListIntentsRequest {
   // Required. The agent to list all intents from.
   // Format: `projects//agent`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Intent"
+    }
+  ];
 
   // Optional. The language used to access language-specific data.
   // If not specified, the agent's default language is used.
@@ -1220,7 +1248,12 @@ message ListIntentsResponse {
 message GetIntentRequest {
   // Required. The name of the intent.
   // Format: `projects//agent/intents/`.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/Intent"
+    }
+  ];
 
   // Optional. The language used to access language-specific data.
   // If not specified, the agent's default language is used.
@@ -1237,7 +1270,12 @@ message GetIntentRequest {
 message CreateIntentRequest {
   // Required. The agent to create a intent for.
   // Format: `projects//agent`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Intent"
+    }
+  ];
 
   // Required. The intent to create.
   Intent intent = 2;
@@ -1278,14 +1316,24 @@ message DeleteIntentRequest {
   // indirect followup intents, we also delete them.
   //
   // Format: `projects//agent/intents/`.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/Intent"
+    }
+  ];
 }
 
 // The request message for [Intents.BatchUpdateIntents][google.cloud.dialogflow.v2beta1.Intents.BatchUpdateIntents].
 message BatchUpdateIntentsRequest {
   // Required. The name of the agent to update or create intents in.
   // Format: `projects//agent`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Intent"
+    }
+  ];
 
   // Required. The source of the intent batch.
   //
@@ -1327,7 +1375,12 @@ message BatchUpdateIntentsResponse {
 message BatchDeleteIntentsRequest {
   // Required. The name of the agent to delete all entities types for. Format:
   // `projects//agent`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/Intent"
+    }
+  ];
 
   // Required. The collection of intents to delete. Only intent `name` must be
   // filled in.
diff --git a/google/cloud/dialogflow/v2beta1/knowledge_base.proto b/google/cloud/dialogflow/v2beta1/knowledge_base.proto
index fa6d32698..aa625a5b2 100644
--- a/google/cloud/dialogflow/v2beta1/knowledge_base.proto
+++ b/google/cloud/dialogflow/v2beta1/knowledge_base.proto
@@ -17,9 +17,11 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -49,6 +51,7 @@ service KnowledgeBases {
         get: "/v2beta1/{parent=projects/*/agent}/knowledgeBases"
       }
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Retrieves the specified knowledge base.
@@ -62,6 +65,7 @@ service KnowledgeBases {
         get: "/v2beta1/{name=projects/*/agent/knowledgeBases/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Creates a knowledge base.
@@ -77,6 +81,7 @@ service KnowledgeBases {
         body: "knowledge_base"
       }
     };
+    option (google.api.method_signature) = "parent,knowledge_base";
   }
 
   // Deletes the specified knowledge base.
@@ -90,6 +95,7 @@ service KnowledgeBases {
         delete: "/v2beta1/{name=projects/*/agent/knowledgeBases/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Updates the specified knowledge base.
@@ -105,6 +111,7 @@ service KnowledgeBases {
         body: "knowledge_base"
       }
     };
+    option (google.api.method_signature) = "knowledge_base,update_mask";
   }
 }
 
@@ -113,6 +120,11 @@ service KnowledgeBases {
 // Note: The `projects.agent.knowledgeBases` resource is deprecated;
 // only use `projects.knowledgeBases`.
 message KnowledgeBase {
+  option (google.api.resource) = {
+    type: "dialogflow.googleapis.com/KnowledgeBase"
+    pattern: "projects/{project}/knowledgeBases/{knowledge_base}"
+  };
+
   // The knowledge base resource name.
   // The name must be empty when creating a knowledge base.
   // Format: `projects//knowledgeBases/`.
@@ -120,7 +132,7 @@ message KnowledgeBase {
 
   // Required. The display name of the knowledge base. The name must be 1024
   // bytes or less; otherwise, the creation request fails.
-  string display_name = 2;
+  string display_name = 2 [(google.api.field_behavior) = REQUIRED];
 
   // Language which represents the KnowledgeBase. When the KnowledgeBase is
   // created/updated, this is populated for all non en-us languages. If not
@@ -132,14 +144,19 @@ message KnowledgeBase {
 message ListKnowledgeBasesRequest {
   // Required. The project to list of knowledge bases for.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/KnowledgeBase"
+    }
+  ];
 
   // Optional. The maximum number of items to return in a single page. By
   // default 10 and at most 100.
-  int32 page_size = 2;
+  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
 
   // Optional. The next_page_token value returned from a previous list request.
-  string page_token = 3;
+  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // Response message for [KnowledgeBases.ListKnowledgeBases][google.cloud.dialogflow.v2beta1.KnowledgeBases.ListKnowledgeBases].
@@ -156,24 +173,39 @@ message ListKnowledgeBasesResponse {
 message GetKnowledgeBaseRequest {
   // Required. The name of the knowledge base to retrieve.
   // Format `projects//knowledgeBases/`.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/KnowledgeBase"
+    }
+  ];
 }
 
 // Request message for [KnowledgeBases.CreateKnowledgeBase][google.cloud.dialogflow.v2beta1.KnowledgeBases.CreateKnowledgeBase].
 message CreateKnowledgeBaseRequest {
   // Required. The project to create a knowledge base for.
   // Format: `projects/`.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/KnowledgeBase"
+    }
+  ];
 
   // Required. The knowledge base to create.
-  KnowledgeBase knowledge_base = 2;
+  KnowledgeBase knowledge_base = 2 [(google.api.field_behavior) = REQUIRED];
 }
 
 // Request message for [KnowledgeBases.DeleteKnowledgeBase][google.cloud.dialogflow.v2beta1.KnowledgeBases.DeleteKnowledgeBase].
 message DeleteKnowledgeBaseRequest {
   // Required. The name of the knowledge base to delete.
   // Format: `projects//knowledgeBases/`.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/KnowledgeBase"
+    }
+  ];
 
   // Optional. Force deletes the knowledge base. When set to true, any documents
   // in the knowledge base are also deleted.
@@ -183,10 +215,10 @@ message DeleteKnowledgeBaseRequest {
 // Request message for [KnowledgeBases.UpdateKnowledgeBase][google.cloud.dialogflow.v2beta1.KnowledgeBases.UpdateKnowledgeBase].
 message UpdateKnowledgeBaseRequest {
   // Required. The knowledge base to update.
-  KnowledgeBase knowledge_base = 1;
+  KnowledgeBase knowledge_base = 1 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. Not specified means `update all`.
   // Currently, only `display_name` can be updated, an InvalidArgument will be
   // returned for attempting to update other fields.
-  google.protobuf.FieldMask update_mask = 2;
+  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = OPTIONAL];
 }
diff --git a/google/cloud/dialogflow/v2beta1/session.proto b/google/cloud/dialogflow/v2beta1/session.proto
index ae25c967d..e36e22e2d 100644
--- a/google/cloud/dialogflow/v2beta1/session.proto
+++ b/google/cloud/dialogflow/v2beta1/session.proto
@@ -17,6 +17,7 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
 import "google/api/field_behavior.proto";
 import "google/api/resource.proto";
 import "google/cloud/dialogflow/v2beta1/agent.proto";
@@ -29,7 +30,6 @@ import "google/protobuf/field_mask.proto";
 import "google/protobuf/struct.proto";
 import "google/rpc/status.proto";
 import "google/type/latlng.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -40,8 +40,9 @@ option java_package = "com.google.cloud.dialogflow.v2beta1";
 option objc_class_prefix = "DF";
 option (google.api.resource_definition) = {
   type: "dialogflow.googleapis.com/Session"
-  pattern: "projects/{project}/locations/{location}/agent/sessions/{session}"
   pattern: "projects/{project}/agent/sessions/{session}"
+  pattern: "projects/{project}/agent/environments/{environment}/users/{user}/sessions/{session}"
+  pattern: "projects/{project}/locations/{location}/agent/sessions/{session}"
 };
 
 // A session represents an interaction with a user. You retrieve user input
@@ -75,6 +76,7 @@ service Sessions {
         body: "*"
       }
     };
+    option (google.api.method_signature) = "session,query_input";
   }
 
   // Processes a natural language query in audio format in a streaming fashion
@@ -160,6 +162,10 @@ message DetectIntentResponse {
   // multiple default text responses exist, they will be concatenated when
   // generating audio. If no default platform text responses exist, the
   // generated audio content will be empty.
+  //
+  // In some scenarios, multiple output audio fields may be present in the
+  // response structure. In these cases, only the top-most-level audio output
+  // has content.
   bytes output_audio = 4;
 
   // The config used by the speech synthesizer to generate the output audio.
@@ -551,6 +557,10 @@ message StreamingDetectIntentResponse {
   // multiple default text responses exist, they will be concatenated when
   // generating audio. If no default platform text responses exist, the
   // generated audio content will be empty.
+  //
+  // In some scenarios, multiple output audio fields may be present in the
+  // response structure. In these cases, only the top-most-level audio output
+  // has content.
   bytes output_audio = 5;
 
   // The config used by the speech synthesizer to generate the output audio.
@@ -633,6 +643,7 @@ message StreamingRecognitionResult {
 
   // An estimate of the likelihood that the speech recognizer will
   // not change its guess about this interim recognition result:
+  //
   // * If the value is unspecified or 0.0, Dialogflow didn't compute the
   //   stability. In particular, Dialogflow will only provide stability for
   //   `TRANSCRIPT` results with `is_final = false`.
diff --git a/google/cloud/dialogflow/v2beta1/session_entity_type.proto b/google/cloud/dialogflow/v2beta1/session_entity_type.proto
index 90b8849a6..97f1869b6 100644
--- a/google/cloud/dialogflow/v2beta1/session_entity_type.proto
+++ b/google/cloud/dialogflow/v2beta1/session_entity_type.proto
@@ -17,10 +17,12 @@ syntax = "proto3";
 package google.cloud.dialogflow.v2beta1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
 import "google/cloud/dialogflow/v2beta1/entity_type.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
-import "google/api/client.proto";
 
 option cc_enable_arenas = true;
 option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
@@ -71,6 +73,7 @@ service SessionEntityTypes {
         get: "/v2beta1/{parent=projects/*/locations/*/agent/environments/*/users/*/sessions/*}/entityTypes"
       }
     };
+    option (google.api.method_signature) = "parent";
   }
 
   // Retrieves the specified session entity type.
@@ -91,6 +94,7 @@ service SessionEntityTypes {
         get: "/v2beta1/{name=projects/*/locations/*/agent/environments/*/users/*/sessions/*/entityTypes/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 
   // Creates a session entity type.
@@ -118,6 +122,7 @@ service SessionEntityTypes {
         body: "session_entity_type"
       }
     };
+    option (google.api.method_signature) = "parent,session_entity_type";
   }
 
   // Updates the specified session entity type.
@@ -142,6 +147,8 @@ service SessionEntityTypes {
         body: "session_entity_type"
       }
     };
+    option (google.api.method_signature) = "session_entity_type";
+    option (google.api.method_signature) = "session_entity_type,update_mask";
   }
 
   // Deletes the specified session entity type.
@@ -162,6 +169,7 @@ service SessionEntityTypes {
         delete: "/v2beta1/{name=projects/*/locations/*/agent/environments/*/users/*/sessions/*/entityTypes/*}"
       }
     };
+    option (google.api.method_signature) = "name";
   }
 }
 
@@ -173,6 +181,13 @@ service SessionEntityTypes {
 //
 // Note: session entity types apply to all queries, regardless of the language.
 message SessionEntityType {
+  option (google.api.resource) = {
+    type: "dialogflow.googleapis.com/SessionEntityType"
+    pattern: "projects/{project}/agent/sessions/{session}/entityTypes/{entity_type}"
+    pattern: "projects/{project}/locations/{location}/agent/sessions/{session}/entityTypes/{entity_type}"
+    pattern: "projects/{project}/agent/environments/{environment}/users/{user}/sessions/{session}/entityTypes/{entity_type}"
+  };
+
   // The types of modifications for a session entity type.
   enum EntityOverrideMode {
     // Not specified. This value should be never used.
@@ -223,7 +238,12 @@ message ListSessionEntityTypesRequest {
   // sessions/`.
   // If `Environment ID` is not specified, we assume default 'draft'
   // environment. If `User ID` is not specified, we assume default '-' user.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/SessionEntityType"
+    }
+  ];
 
   // Optional. The maximum number of items to return in a single page. By
   // default 100 and at most 1000.
@@ -252,7 +272,12 @@ message GetSessionEntityTypeRequest {
   // ID>/users//sessions//entityTypes/`. If `Environment ID` is not specified, we assume default 'draft'
   // environment. If `User ID` is not specified, we assume default '-' user.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/SessionEntityType"
+    }
+  ];
 }
 
 // The request message for [SessionEntityTypes.CreateSessionEntityType][google.cloud.dialogflow.v2beta1.SessionEntityTypes.CreateSessionEntityType].
@@ -263,7 +288,12 @@ message CreateSessionEntityTypeRequest {
   // sessions/`. If `Environment ID` is not specified, we assume
   // default 'draft' environment. If `User ID` is not specified, we assume
   // default '-' user.
-  string parent = 1;
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "dialogflow.googleapis.com/SessionEntityType"
+    }
+  ];
 
   // Required. The session entity type to create.
   SessionEntityType session_entity_type = 2;
@@ -286,5 +316,10 @@ message DeleteSessionEntityTypeRequest {
   // ID>/users//sessions//entityTypes/`. If `Environment ID` is not specified, we assume default 'draft'
   // environment. If `User ID` is not specified, we assume default '-' user.
-  string name = 1;
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "dialogflow.googleapis.com/SessionEntityType"
+    }
+  ];
 }
diff --git a/google/cloud/documentai/artman_documentai_v1beta1.yaml b/google/cloud/documentai/artman_documentai_v1beta1.yaml
deleted file mode 100644
index ae8ab02fc..000000000
--- a/google/cloud/documentai/artman_documentai_v1beta1.yaml
+++ /dev/null
@@ -1,34 +0,0 @@
-common:
-  api_name: documentai
-  api_version: v1beta1
-  organization_name: google-cloud
-  proto_deps:
-  - name: google-common-protos
-  src_proto_paths:
-  - v1beta1
-  service_yaml: documentai_v1beta1.yaml
-  gapic_yaml: v1beta1/documentai_gapic.yaml
-artifacts:
-- name: gapic_config
-  type: GAPIC_CONFIG
-- name: java_gapic
-  type: GAPIC
-  language: JAVA
-- name: python_gapic
-  type: GAPIC
-  language: PYTHON
-- name: nodejs_gapic
-  type: GAPIC
-  language: NODEJS
-- name: php_gapic
-  type: GAPIC
-  language: PHP
-- name: go_gapic
-  type: GAPIC
-  language: GO
-- name: ruby_gapic
-  type: GAPIC
-  language: RUBY
-- name: csharp_gapic
-  type: GAPIC
-  language: CSHARP
diff --git a/google/cloud/documentai/v1beta1/BUILD.bazel b/google/cloud/documentai/v1beta1/BUILD.bazel
index 2c499ccd4..ee89ca512 100644
--- a/google/cloud/documentai/v1beta1/BUILD.bazel
+++ b/google/cloud/documentai/v1beta1/BUILD.bazel
@@ -62,6 +62,7 @@ java_gapic_library(
     name = "documentai_java_gapic",
     src = ":documentai_proto_with_info",
     gapic_yaml = "documentai_gapic.yaml",
+    grpc_service_config = "documentai_grpc_service_config.json",
     package = "google.cloud.documentai.v1beta1",
     service_yaml = "//google/cloud/documentai:documentai_v1beta1.yaml",
     test_deps = [
@@ -126,7 +127,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -189,6 +189,7 @@ py_gapic_library(
     name = "documentai_py_gapic",
     src = ":documentai_proto_with_info",
     gapic_yaml = "documentai_gapic.yaml",
+    grpc_service_config = "documentai_grpc_service_config.json",
     package = "google.cloud.documentai.v1beta1",
     service_yaml = "//google/cloud/documentai:documentai_v1beta1.yaml",
     deps = [
@@ -233,6 +234,7 @@ php_gapic_library(
     name = "documentai_php_gapic",
     src = ":documentai_proto_with_info",
     gapic_yaml = "documentai_gapic.yaml",
+    grpc_service_config = "documentai_grpc_service_config.json",
     package = "google.cloud.documentai.v1beta1",
     service_yaml = "//google/cloud/documentai:documentai_v1beta1.yaml",
     deps = [
@@ -263,7 +265,7 @@ load(
 nodejs_gapic_library(
     name = "documentai_nodejs_gapic",
     src = ":documentai_proto_with_info",
-    gapic_yaml = "documentai_gapic.yaml",
+    grpc_service_config = "documentai_grpc_service_config.json",
     package = "google.cloud.documentai.v1beta1",
     service_yaml = "//google/cloud/documentai:documentai_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/documentai/v1beta1/document.proto b/google/cloud/documentai/v1beta1/document.proto
index 1303c32dd..1ee00b563 100644
--- a/google/cloud/documentai/v1beta1/document.proto
+++ b/google/cloud/documentai/v1beta1/document.proto
@@ -22,10 +22,13 @@ import "google/cloud/documentai/v1beta1/geometry.proto";
 import "google/rpc/status.proto";
 import "google/type/color.proto";
 
+option csharp_namespace = "Google.Cloud.DocumentAI.V1Beta1";
 option go_package = "google.golang.org/genproto/googleapis/cloud/documentai/v1beta1;documentai";
 option java_multiple_files = true;
 option java_outer_classname = "DocumentProto";
 option java_package = "com.google.cloud.documentai.v1beta1";
+option php_namespace = "Google\\Cloud\\DocumentAi\\V1beta1";
+option ruby_package = "Google::Cloud::DocumentAI::V1beta1";
 
 // Document represents the canonical document resource in Document Understanding
 // AI.
diff --git a/google/cloud/documentai/v1beta1/document_understanding.proto b/google/cloud/documentai/v1beta1/document_understanding.proto
index 4f8dfb722..a8890762b 100644
--- a/google/cloud/documentai/v1beta1/document_understanding.proto
+++ b/google/cloud/documentai/v1beta1/document_understanding.proto
@@ -24,10 +24,13 @@ import "google/cloud/documentai/v1beta1/geometry.proto";
 import "google/longrunning/operations.proto";
 import "google/protobuf/timestamp.proto";
 
+option csharp_namespace = "Google.Cloud.DocumentAI.V1Beta1";
 option go_package = "google.golang.org/genproto/googleapis/cloud/documentai/v1beta1;documentai";
 option java_multiple_files = true;
 option java_outer_classname = "DocumentAiProto";
 option java_package = "com.google.cloud.documentai.v1beta1";
+option php_namespace = "Google\\Cloud\\DocumentAi\\V1beta1";
+option ruby_package = "Google::Cloud::DocumentAI::V1beta1";
 
 // Service to parse structured information from unstructured or semi-structured
 // documents using state-of-the-art Google AI such as natural language,
diff --git a/google/cloud/documentai/v1beta1/documentai_gapic.yaml b/google/cloud/documentai/v1beta1/documentai_gapic.yaml
index 99f20ce18..3662bd3eb 100644
--- a/google/cloud/documentai/v1beta1/documentai_gapic.yaml
+++ b/google/cloud/documentai/v1beta1/documentai_gapic.yaml
@@ -17,29 +17,3 @@ language_settings:
   nodejs:
     package_name: documentai.v1beta1
     domain_layer_location: google-cloud
-# A list of API interface configurations.
-interfaces:
-# The fully qualified name of the API interface.
-- name: google.cloud.documentai.v1beta1.DocumentUnderstandingService
-  # A list of resource collection configurations.
-  # Consists of a name_pattern and an entity_name.
-  # The name_pattern is a pattern to describe the names of the resources of this
-  # collection, using the platform's conventions for URI patterns. A generator
-  # may use this to generate methods to compose and decompose such names. The
-  # pattern should use named placeholders as in `shelves/{shelf}/books/{book}`;
-  # those will be taken as hints for the parameter names of the generated
-  # methods. If empty, no name methods are generated.
-  # The entity_name is the name to be used as a basis for generated methods and
-  # classes.
-
-  # A list of method configurations.
-  # Common properties:
-  #
-  #   name - The simple name of the method.
-  #
-  #   retry_codes_name - Specifies the configuration for retryable codes. The
-  #   name must be defined in interfaces.retry_codes_def.
-
-  methods:
-  - name: BatchProcessDocuments
-    retry_codes_name: idempotent
diff --git a/google/cloud/documentai/v1beta1/geometry.proto b/google/cloud/documentai/v1beta1/geometry.proto
index 9dbe2b78b..b4331bc6b 100644
--- a/google/cloud/documentai/v1beta1/geometry.proto
+++ b/google/cloud/documentai/v1beta1/geometry.proto
@@ -19,10 +19,13 @@ package google.cloud.documentai.v1beta1;
 
 import "google/api/annotations.proto";
 
+option csharp_namespace = "Google.Cloud.DocumentAI.V1Beta1";
 option go_package = "google.golang.org/genproto/googleapis/cloud/documentai/v1beta1;documentai";
 option java_multiple_files = true;
 option java_outer_classname = "GeometryProto";
 option java_package = "com.google.cloud.documentai.v1beta1";
+option php_namespace = "Google\\Cloud\\DocumentAi\\V1beta1";
+option ruby_package = "Google::Cloud::DocumentAI::V1beta1";
 
 // A vertex represents a 2D point in the image.
 // NOTE: the vertex coordinates are in the same scale as the original image.
diff --git a/google/cloud/documentai/v1beta2/BUILD.bazel b/google/cloud/documentai/v1beta2/BUILD.bazel
index 85970d3ee..8f7805362 100644
--- a/google/cloud/documentai/v1beta2/BUILD.bazel
+++ b/google/cloud/documentai/v1beta2/BUILD.bazel
@@ -62,6 +62,7 @@ java_gapic_library(
     name = "documentai_java_gapic",
     src = ":documentai_proto_with_info",
     gapic_yaml = "documentai_gapic.yaml",
+    grpc_service_config = "documentai_v1beta2_grpc_service_config.json",
     package = "google.cloud.documentai.v1beta2",
     service_yaml = "documentai_v1beta2.yaml",
     test_deps = [
@@ -126,7 +127,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -196,6 +196,7 @@ php_gapic_library(
     name = "documentai_php_gapic",
     src = ":documentai_proto_with_info",
     gapic_yaml = "documentai_gapic.yaml",
+    grpc_service_config = "documentai_v1beta2_grpc_service_config.json",
     package = "google.cloud.documentai.v1beta2",
     service_yaml = "documentai_v1beta2.yaml",
     deps = [
@@ -226,7 +227,7 @@ load(
 nodejs_gapic_library(
     name = "documentai_nodejs_gapic",
     src = ":documentai_proto_with_info",
-    gapic_yaml = "documentai_gapic.yaml",
+    grpc_service_config = "documentai_v1beta2_grpc_service_config.json",
     package = "google.cloud.documentai.v1beta2",
     service_yaml = "documentai_v1beta2.yaml",
     deps = [],
diff --git a/google/cloud/documentai/v1beta2/document.proto b/google/cloud/documentai/v1beta2/document.proto
index d50320b12..327473048 100644
--- a/google/cloud/documentai/v1beta2/document.proto
+++ b/google/cloud/documentai/v1beta2/document.proto
@@ -22,10 +22,13 @@ import "google/rpc/status.proto";
 import "google/type/color.proto";
 import "google/api/annotations.proto";
 
+option csharp_namespace = "Google.Cloud.DocumentAI.V1Beta2";
 option go_package = "google.golang.org/genproto/googleapis/cloud/documentai/v1beta2;documentai";
 option java_multiple_files = true;
 option java_outer_classname = "DocumentProto";
 option java_package = "com.google.cloud.documentai.v1beta2";
+option php_namespace = "Google\\Cloud\\DocumentAi\\V1beta2";
+option ruby_package = "Google::Cloud::DocumentAI::V1beta2";
 
 // Document represents the canonical document resource in Document Understanding
 // AI.
diff --git a/google/cloud/documentai/v1beta2/document_understanding.proto b/google/cloud/documentai/v1beta2/document_understanding.proto
index e0f94aa22..9d3c8d941 100644
--- a/google/cloud/documentai/v1beta2/document_understanding.proto
+++ b/google/cloud/documentai/v1beta2/document_understanding.proto
@@ -24,10 +24,13 @@ import "google/cloud/documentai/v1beta2/geometry.proto";
 import "google/longrunning/operations.proto";
 import "google/protobuf/timestamp.proto";
 
+option csharp_namespace = "Google.Cloud.DocumentAI.V1Beta2";
 option go_package = "google.golang.org/genproto/googleapis/cloud/documentai/v1beta2;documentai";
 option java_multiple_files = true;
 option java_outer_classname = "DocumentAiProto";
 option java_package = "com.google.cloud.documentai.v1beta2";
+option php_namespace = "Google\\Cloud\\DocumentAi\\V1beta2";
+option ruby_package = "Google::Cloud::DocumentAI::V1beta2";
 
 // Service to parse structured information from unstructured or semi-structured
 // documents using state-of-the-art Google AI such as natural language,
diff --git a/google/cloud/documentai/v1beta2/documentai_gapic.yaml b/google/cloud/documentai/v1beta2/documentai_gapic.yaml
index fe23b39d6..d08c4dfa9 100644
--- a/google/cloud/documentai/v1beta2/documentai_gapic.yaml
+++ b/google/cloud/documentai/v1beta2/documentai_gapic.yaml
@@ -16,32 +16,3 @@ language_settings:
     package_name: Google\Cloud\DocumentAi\V1beta2
   nodejs:
     package_name: documentai.v1beta2
-# A list of API interface configurations.
-interfaces:
-# The fully qualified name of the API interface.
-- name: google.cloud.documentai.v1beta2.DocumentUnderstandingService
-  # A list of resource collection configurations.
-  # Consists of a name_pattern and an entity_name.
-  # The name_pattern is a pattern to describe the names of the resources of this
-  # collection, using the platform's conventions for URI patterns. A generator
-  # may use this to generate methods to compose and decompose such names. The
-  # pattern should use named placeholders as in `shelves/{shelf}/books/{book}`;
-  # those will be taken as hints for the parameter names of the generated
-  # methods. If empty, no name methods are generated.
-  # The entity_name is the name to be used as a basis for generated methods and
-  # classes.
-
-  # A list of method configurations.
-  # Common properties:
-  #
-  #   name - The simple name of the method.
-  #
-  #   retry_codes_name - Specifies the configuration for retryable codes. The
-  #   name must be defined in interfaces.retry_codes_def.
-
-
-  methods:
-  - name: BatchProcessDocuments
-    retry_codes_name: idempotent
-  - name: ProcessDocument
-    retry_codes_name: idempotent
diff --git a/google/cloud/documentai/v1beta2/geometry.proto b/google/cloud/documentai/v1beta2/geometry.proto
index 7f53217fe..21584ecfe 100644
--- a/google/cloud/documentai/v1beta2/geometry.proto
+++ b/google/cloud/documentai/v1beta2/geometry.proto
@@ -18,10 +18,13 @@ package google.cloud.documentai.v1beta2;
 
 import "google/api/annotations.proto";
 
+option csharp_namespace = "Google.Cloud.DocumentAI.V1Beta2";
 option go_package = "google.golang.org/genproto/googleapis/cloud/documentai/v1beta2;documentai";
 option java_multiple_files = true;
 option java_outer_classname = "GeometryProto";
 option java_package = "com.google.cloud.documentai.v1beta2";
+option php_namespace = "Google\\Cloud\\DocumentAi\\V1beta2";
+option ruby_package = "Google::Cloud::DocumentAI::V1beta2";
 
 // A vertex represents a 2D point in the image.
 // NOTE: the vertex coordinates are in the same scale as the original image.
diff --git a/google/cloud/functions/v1beta2/BUILD.bazel b/google/cloud/functions/v1beta2/BUILD.bazel
index 4b4c5d778..4abb48f29 100644
--- a/google/cloud/functions/v1beta2/BUILD.bazel
+++ b/google/cloud/functions/v1beta2/BUILD.bazel
@@ -62,6 +62,7 @@ java_gapic_library(
     name = "functions_java_gapic",
     src = ":functions_proto_with_info",
     gapic_yaml = "functions_gapic.yaml",
+    grpc_service_config = "functions_grpc_service_config.json",
     package = "google.cloud.functions.v1beta2",
     service_yaml = "cloudfunctions_v1beta2.yaml",
     test_deps = [
@@ -124,7 +125,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
@@ -190,6 +190,7 @@ py_gapic_library(
     name = "functions_py_gapic",
     src = ":functions_proto_with_info",
     gapic_yaml = "functions_gapic.yaml",
+    grpc_service_config = "functions_grpc_service_config.json",
     package = "google.cloud.functions.v1beta2",
     service_yaml = "cloudfunctions_v1beta2.yaml",
     deps = [
@@ -234,6 +235,7 @@ php_gapic_library(
     name = "functions_php_gapic",
     src = ":functions_proto_with_info",
     gapic_yaml = "functions_gapic.yaml",
+    grpc_service_config = "functions_grpc_service_config.json",
     package = "google.cloud.functions.v1beta2",
     service_yaml = "cloudfunctions_v1beta2.yaml",
     deps = [
@@ -264,7 +266,7 @@ load(
 nodejs_gapic_library(
     name = "functions_nodejs_gapic",
     src = ":functions_proto_with_info",
-    gapic_yaml = "functions_gapic.yaml",
+    grpc_service_config = "functions_grpc_service_config.json",
     package = "google.cloud.functions.v1beta2",
     service_yaml = "cloudfunctions_v1beta2.yaml",
     deps = [],
diff --git a/google/cloud/gaming/v1beta/BUILD.bazel b/google/cloud/gaming/v1beta/BUILD.bazel
index cce3a1e8d..053862362 100644
--- a/google/cloud/gaming/v1beta/BUILD.bazel
+++ b/google/cloud/gaming/v1beta/BUILD.bazel
@@ -134,7 +134,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -273,7 +272,7 @@ load(
 nodejs_gapic_library(
     name = "gaming_nodejs_gapic",
     src = ":gaming_proto_with_info",
-    gapic_yaml = "gaming_gapic.yaml",
+    grpc_service_config = None,
     package = "google.cloud.gaming.v1beta",
     service_yaml = "gameservices_v1beta.yaml",
     deps = [],
diff --git a/google/cloud/iot/v1/BUILD.bazel b/google/cloud/iot/v1/BUILD.bazel
index 4e582b59d..b250fedbc 100644
--- a/google/cloud/iot/v1/BUILD.bazel
+++ b/google/cloud/iot/v1/BUILD.bazel
@@ -266,7 +266,7 @@ load(
 nodejs_gapic_library(
     name = "iot_nodejs_gapic",
     src = ":iot_proto_with_info",
-    gapic_yaml = "cloudiot_gapic.yaml",
+    grpc_service_config = "cloudiot_grpc_service_config.json",
     package = "google.cloud.iot.v1",
     service_yaml = "cloudiot_v1.yaml",
     deps = [],
diff --git a/google/cloud/irm/v1alpha2/BUILD.bazel b/google/cloud/irm/v1alpha2/BUILD.bazel
index a39af0fa1..0427e1d4e 100644
--- a/google/cloud/irm/v1alpha2/BUILD.bazel
+++ b/google/cloud/irm/v1alpha2/BUILD.bazel
@@ -255,7 +255,7 @@ load(
 nodejs_gapic_library(
     name = "irm_nodejs_gapic",
     src = ":irm_proto_with_info",
-    gapic_yaml = "irm_gapic.yaml",
+    grpc_service_config = "irm_grpc_service_config.json",
     package = "google.cloud.irm.v1alpha2",
     service_yaml = "//google/cloud/irm:irm_v1alpha2.yaml",
     deps = [],
diff --git a/google/cloud/kms/v1/BUILD.bazel b/google/cloud/kms/v1/BUILD.bazel
index 704a79fd3..66c1901bd 100644
--- a/google/cloud/kms/v1/BUILD.bazel
+++ b/google/cloud/kms/v1/BUILD.bazel
@@ -74,6 +74,7 @@ java_gapic_library(
     name = "kms_java_gapic",
     src = ":kms_proto_with_info",
     gapic_yaml = "cloudkms_gapic.yaml",
+    grpc_service_config = "cloudkms_grpc_service_config.json",
     gen_resource_name = False,
     package = "google.cloud.kms.v1",
     service_yaml = "cloudkms_v1.yaml",
@@ -202,6 +203,7 @@ py_gapic_library(
     name = "kms_py_gapic",
     src = ":kms_proto_with_info",
     gapic_yaml = "cloudkms_gapic.yaml",
+    grpc_service_config = "cloudkms_grpc_service_config.json",
     package = "google.cloud.kms.v1",
     service_yaml = "cloudkms_v1.yaml",
     deps = [
@@ -246,6 +248,7 @@ php_gapic_library(
     name = "kms_php_gapic",
     src = ":kms_proto_with_info",
     gapic_yaml = "cloudkms_gapic.legacy.yaml",
+    grpc_service_config = "cloudkms_grpc_service_config.json",
     package = "google.cloud.kms.v1",
     service_yaml = "cloudkms_v1.yaml",
     deps = [
@@ -276,7 +279,7 @@ load(
 nodejs_gapic_library(
     name = "kms_nodejs_gapic",
     src = ":kms_proto_with_info",
-    gapic_yaml = "cloudkms_gapic.yaml",
+    grpc_service_config = "cloudkms_grpc_service_config.json",
     package = "google.cloud.kms.v1",
     service_yaml = "cloudkms_v1.yaml",
     deps = [],
diff --git a/google/cloud/kms/v1/cloudkms_gapic.yaml b/google/cloud/kms/v1/cloudkms_gapic.yaml
index 9e2703d41..3fc41cbe1 100644
--- a/google/cloud/kms/v1/cloudkms_gapic.yaml
+++ b/google/cloud/kms/v1/cloudkms_gapic.yaml
@@ -22,86 +22,31 @@ language_settings:
 interfaces:
   # The fully qualified name of the API interface.
 - name: google.cloud.kms.v1.KeyManagementService
-  retry_codes_def:
-  - name: retryable
-    retry_codes:
-    - INTERNAL
-    - UNAVAILABLE
-    - DEADLINE_EXCEEDED
-  - name: non_retryable
-    retry_codes: []
   methods:
-  - name: ListKeyRings
-    retry_codes_name: retryable
-  - name: ListImportJobs
-    retry_codes_name: retryable
-  - name: ListCryptoKeys
-    retry_codes_name: retryable
-  - name: ListCryptoKeyVersions
-    retry_codes_name: retryable
-  - name: GetKeyRing
-    retry_codes_name: retryable
-  - name: GetImportJob
-    retry_codes_name: retryable
-  - name: GetCryptoKey
-    retry_codes_name: retryable
-  - name: GetCryptoKeyVersion
-    retry_codes_name: retryable
-  - name: CreateKeyRing
-    retry_codes_name: retryable
   - name: CreateImportJob
-    retry_codes_name: retryable
     sample_code_init_fields:
     - import_job_id=my-import-job
     - import_job.import_method=RSA_OAEP_3072_SHA1_AES_256
     - import_job.protection_level=HSM
   - name: CreateCryptoKey
-    retry_codes_name: retryable
     sample_code_init_fields:
     - crypto_key_id=my-app-key
     - crypto_key.purpose=ENCRYPT_DECRYPT
     - crypto_key.next_rotation_time.seconds=2147483647
     - crypto_key.rotation_period.seconds=604800
-  - name: CreateCryptoKeyVersion
-    retry_codes_name: non_retryable
-  - name: ImportCryptoKeyVersion
-    retry_codes_name: non_retryable
-  - name: UpdateCryptoKey
-    retry_codes_name: retryable
-  - name: UpdateCryptoKeyVersion
-    retry_codes_name: retryable
-  - name: Encrypt
-    retry_codes_name: retryable
-  - name: Decrypt
-    retry_codes_name: retryable
-  - name: UpdateCryptoKeyPrimaryVersion
-    retry_codes_name: retryable
-  - name: DestroyCryptoKeyVersion
-    retry_codes_name: retryable
-  - name: RestoreCryptoKeyVersion
-    retry_codes_name: retryable
-  - name: GetPublicKey
-    retry_codes_name: retryable
-  - name: AsymmetricDecrypt
-    retry_codes_name: retryable
-  - name: AsymmetricSign
-    retry_codes_name: retryable
   - name: SetIamPolicy
-    retry_codes_name: retryable
     reroute_to_grpc_interface: google.iam.v1.IAMPolicy
     surface_treatments:
     - include_languages:
       - go
       visibility: DISABLED
   - name: GetIamPolicy
-    retry_codes_name: retryable
     reroute_to_grpc_interface: google.iam.v1.IAMPolicy
     surface_treatments:
     - include_languages:
       - go
       visibility: DISABLED
   - name: TestIamPermissions
-    retry_codes_name: retryable
     reroute_to_grpc_interface: google.iam.v1.IAMPolicy
     surface_treatments:
     - include_languages:
diff --git a/google/cloud/kms/v1/resources.proto b/google/cloud/kms/v1/resources.proto
index b2b7ab919..e78b10cc2 100644
--- a/google/cloud/kms/v1/resources.proto
+++ b/google/cloud/kms/v1/resources.proto
@@ -138,7 +138,7 @@ message CryptoKey {
   CryptoKeyVersionTemplate version_template = 11;
 
   // Labels with user-defined metadata. For more information, see
-  // [Labeling Keys](/kms/docs/labeling-keys).
+  // [Labeling Keys](https://cloud.google.com/kms/docs/labeling-keys).
   map labels = 10;
 }
 
diff --git a/google/cloud/language/v1/BUILD.bazel b/google/cloud/language/v1/BUILD.bazel
index 23f50c44c..5bc5f1c8d 100644
--- a/google/cloud/language/v1/BUILD.bazel
+++ b/google/cloud/language/v1/BUILD.bazel
@@ -246,7 +246,7 @@ load(
 nodejs_gapic_library(
     name = "language_nodejs_gapic",
     src = ":language_proto_with_info",
-    gapic_yaml = "language_gapic.yaml",
+    grpc_service_config = "language_grpc_service_config.json",
     package = "google.cloud.language.v1",
     service_yaml = "//google/cloud/language:language_v1.yaml",
     deps = [],
diff --git a/google/cloud/language/v1beta2/BUILD.bazel b/google/cloud/language/v1beta2/BUILD.bazel
index cb3e79e86..24f2f00d4 100644
--- a/google/cloud/language/v1beta2/BUILD.bazel
+++ b/google/cloud/language/v1beta2/BUILD.bazel
@@ -248,7 +248,7 @@ load(
 nodejs_gapic_library(
     name = "language_nodejs_gapic",
     src = ":language_proto_with_info",
-    gapic_yaml = "language_gapic.yaml",
+    grpc_service_config = "language_grpc_service_config.json",
     package = "google.cloud.language.v1beta2",
     service_yaml = "language_v1beta2.yaml",
     deps = [],
diff --git a/google/cloud/managedidentities/v1/BUILD.bazel b/google/cloud/managedidentities/v1/BUILD.bazel
index f6d9664cc..741989930 100644
--- a/google/cloud/managedidentities/v1/BUILD.bazel
+++ b/google/cloud/managedidentities/v1/BUILD.bazel
@@ -61,6 +61,7 @@ java_gapic_library(
     name = "managedidentities_java_gapic",
     src = ":managedidentities_proto_with_info",
     gapic_yaml = "managedidentities_gapic.yaml",
+    grpc_service_config = "managedidentities_grpc_service_config.json",
     package = "google.cloud.managedidentities.v1",
     service_yaml = "managedidentities_v1.yaml",
     test_deps = [
@@ -123,7 +124,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -186,6 +186,7 @@ py_gapic_library(
     name = "managedidentities_py_gapic",
     src = ":managedidentities_proto_with_info",
     gapic_yaml = "managedidentities_gapic.yaml",
+    grpc_service_config = "managedidentities_grpc_service_config.json",
     package = "google.cloud.managedidentities.v1",
     service_yaml = "managedidentities_v1.yaml",
     deps = [
@@ -230,6 +231,7 @@ php_gapic_library(
     name = "managedidentities_php_gapic",
     src = ":managedidentities_proto_with_info",
     gapic_yaml = "managedidentities_gapic.yaml",
+    grpc_service_config = "managedidentities_grpc_service_config.json",
     package = "google.cloud.managedidentities.v1",
     service_yaml = "managedidentities_v1.yaml",
     deps = [
@@ -260,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "managedidentities_nodejs_gapic",
     src = ":managedidentities_proto_with_info",
-    gapic_yaml = "managedidentities_gapic.yaml",
+    grpc_service_config = "managedidentities_grpc_service_config.json",
     package = "google.cloud.managedidentities.v1",
     service_yaml = "managedidentities_v1.yaml",
     deps = [],
diff --git a/google/cloud/managedidentities/v1beta1/BUILD.bazel b/google/cloud/managedidentities/v1beta1/BUILD.bazel
index 7d26d9b3d..5322f329c 100644
--- a/google/cloud/managedidentities/v1beta1/BUILD.bazel
+++ b/google/cloud/managedidentities/v1beta1/BUILD.bazel
@@ -122,7 +122,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -258,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "managedidentities_nodejs_gapic",
     src = ":managedidentities_proto_with_info",
-    gapic_yaml = "managedidentities_gapic.yaml",
+    grpc_service_config = None,
     package = "google.cloud.managedidentities.v1beta1",
     service_yaml = "managedidentities_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/mediatranslation/v1beta1/BUILD.bazel b/google/cloud/mediatranslation/v1beta1/BUILD.bazel
index 4ccba1e41..b4899d77d 100644
--- a/google/cloud/mediatranslation/v1beta1/BUILD.bazel
+++ b/google/cloud/mediatranslation/v1beta1/BUILD.bazel
@@ -56,6 +56,7 @@ java_gapic_library(
     name = "mediatranslation_java_gapic",
     src = ":mediatranslation_proto_with_info",
     gapic_yaml = "mediatranslation_gapic.yaml",
+    grpc_service_config = "mediatranslation_grpc_service_config.json",
     package = "google.cloud.mediatranslation.v1beta1",
     service_yaml = "mediatranslation_v1beta1.yaml",
     test_deps = [
@@ -173,6 +174,7 @@ py_gapic_library(
     name = "mediatranslation_py_gapic",
     src = ":mediatranslation_proto_with_info",
     gapic_yaml = "mediatranslation_gapic.yaml",
+    grpc_service_config = "mediatranslation_grpc_service_config.json",
     package = "google.cloud.mediatranslation.v1beta1",
     service_yaml = "mediatranslation_v1beta1.yaml",
     deps = [
@@ -217,6 +219,7 @@ php_gapic_library(
     name = "mediatranslation_php_gapic",
     src = ":mediatranslation_proto_with_info",
     gapic_yaml = "mediatranslation_gapic.yaml",
+    grpc_service_config = "mediatranslation_grpc_service_config.json",
     package = "google.cloud.mediatranslation.v1beta1",
     service_yaml = "mediatranslation_v1beta1.yaml",
     deps = [
@@ -247,7 +250,7 @@ load(
 nodejs_gapic_library(
     name = "mediatranslation_nodejs_gapic",
     src = ":mediatranslation_proto_with_info",
-    gapic_yaml = "mediatranslation_gapic.yaml",
+    grpc_service_config = "mediatranslation_grpc_service_config.json",
     package = "google.cloud.mediatranslation.v1beta1",
     service_yaml = "mediatranslation_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/memcache/v1beta2/BUILD.bazel b/google/cloud/memcache/v1beta2/BUILD.bazel
index e95cb420e..14d33f8c3 100644
--- a/google/cloud/memcache/v1beta2/BUILD.bazel
+++ b/google/cloud/memcache/v1beta2/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "memcache_java_gapic",
     src = ":memcache_proto_with_info",
     gapic_yaml = "memcache_gapic.yaml",
+    grpc_service_config = "memcache_grpc_service_config.json",
     package = "google.cloud.memcache.v1beta2",
     service_yaml = "memcache_v1beta2.yaml",
     test_deps = [
@@ -122,7 +123,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -185,6 +185,7 @@ py_gapic_library(
     name = "memcache_py_gapic",
     src = ":memcache_proto_with_info",
     gapic_yaml = "memcache_gapic.yaml",
+    grpc_service_config = "memcache_grpc_service_config.json",
     package = "google.cloud.memcache.v1beta2",
     service_yaml = "memcache_v1beta2.yaml",
     deps = [
@@ -229,6 +230,7 @@ php_gapic_library(
     name = "memcache_php_gapic",
     src = ":memcache_proto_with_info",
     gapic_yaml = "memcache_gapic.yaml",
+    grpc_service_config = "memcache_grpc_service_config.json",
     package = "google.cloud.memcache.v1beta2",
     service_yaml = "memcache_v1beta2.yaml",
     deps = [
@@ -259,7 +261,7 @@ load(
 nodejs_gapic_library(
     name = "memcache_nodejs_gapic",
     src = ":memcache_proto_with_info",
-    gapic_yaml = "memcache_gapic.yaml",
+    grpc_service_config = "memcache_grpc_service_config.json",
     package = "google.cloud.memcache.v1beta2",
     service_yaml = "memcache_v1beta2.yaml",
     deps = [],
diff --git a/google/cloud/memcache/v1beta2/cloud_memcache.proto b/google/cloud/memcache/v1beta2/cloud_memcache.proto
index 5d75ae49e..56bd2ef78 100644
--- a/google/cloud/memcache/v1beta2/cloud_memcache.proto
+++ b/google/cloud/memcache/v1beta2/cloud_memcache.proto
@@ -244,7 +244,7 @@ message Instance {
   map labels = 3;
 
   // Optional. The full name of the Google Compute Engine
-  // [network](/compute/docs/networks-and-firewalls#networks) to which the
+  // [network](https://cloud.google.com/vpc/docs/vpc) to which the
   // instance is connected. If left unspecified, the `default` network
   // will be used.
   string authorized_network = 4;
diff --git a/google/cloud/osconfig/agentendpoint/v1/BUILD.bazel b/google/cloud/osconfig/agentendpoint/v1/BUILD.bazel
index bcd5045e3..d9b1e2697 100644
--- a/google/cloud/osconfig/agentendpoint/v1/BUILD.bazel
+++ b/google/cloud/osconfig/agentendpoint/v1/BUILD.bazel
@@ -57,6 +57,7 @@ java_gapic_library(
     name = "agentendpoint_java_gapic",
     src = ":agentendpoint_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "agentendpoint_grpc_service_config.json",
     package = "google.cloud.osconfig.agentendpoint.v1",
     service_yaml = "osconfig_v1.yaml",
     test_deps = [
@@ -172,6 +173,7 @@ py_gapic_library(
     name = "agentendpoint_py_gapic",
     src = ":agentendpoint_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "agentendpoint_grpc_service_config.json",
     package = "google.cloud.osconfig.agentendpoint.v1",
     service_yaml = "osconfig_v1.yaml",
     deps = [
@@ -216,6 +218,7 @@ py_gapic_assembly_pkg(
 #     name = "agentendpoint_php_gapic",
 #     src = ":agentendpoint_proto_with_info",
 #     gapic_yaml = "osconfig_gapic.yaml",
+#     grpc_service_config = "agentendpoint_grpc_service_config.json",
 #     package = "google.cloud.osconfig.agentendpoint.v1",
 #     service_yaml = "osconfig_v1.yaml",
 #     deps = [
@@ -246,7 +249,7 @@ load(
 nodejs_gapic_library(
     name = "agentendpoint_nodejs_gapic",
     src = ":agentendpoint_proto_with_info",
-    gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "agentendpoint_grpc_service_config.json",
     package = "google.cloud.osconfig.agentendpoint.v1",
     service_yaml = "osconfig_v1.yaml",
     deps = [],
diff --git a/google/cloud/osconfig/agentendpoint/v1beta/BUILD.bazel b/google/cloud/osconfig/agentendpoint/v1beta/BUILD.bazel
index f1d590e9b..6b1a693e2 100644
--- a/google/cloud/osconfig/agentendpoint/v1beta/BUILD.bazel
+++ b/google/cloud/osconfig/agentendpoint/v1beta/BUILD.bazel
@@ -58,6 +58,7 @@ java_gapic_library(
     name = "agentendpoint_java_gapic",
     src = ":agentendpoint_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "agentendpoint_grpc_service_config.json",
     package = "google.cloud.osconfig.agentendpoint.v1beta",
     service_yaml = "osconfig_v1beta.yaml",
     test_deps = [
@@ -173,6 +174,7 @@ py_gapic_library(
     name = "agentendpoint_py_gapic",
     src = ":agentendpoint_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "agentendpoint_grpc_service_config.json",
     package = "google.cloud.osconfig.agentendpoint.v1beta",
     service_yaml = "osconfig_v1beta.yaml",
     deps = [
@@ -219,6 +221,7 @@ php_grpc_library(
 #    name = "agentendpoint_php_gapic",
 #    src = ":agentendpoint_proto_with_info",
 #    gapic_yaml = "osconfig_gapic.yaml",
+#    grpc_service_config = "agentendpoint_grpc_service_config.json",
 #    package = "google.cloud.osconfig.agentendpoint.v1beta",
 #    service_yaml = "osconfig_v1beta.yaml",
 #    deps = [
@@ -249,7 +252,7 @@ load(
 nodejs_gapic_library(
     name = "agentendpoint_nodejs_gapic",
     src = ":agentendpoint_proto_with_info",
-    gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "agentendpoint_grpc_service_config.json",
     package = "google.cloud.osconfig.agentendpoint.v1beta",
     service_yaml = "osconfig_v1beta.yaml",
     deps = [],
diff --git a/google/cloud/osconfig/v1/BUILD.bazel b/google/cloud/osconfig/v1/BUILD.bazel
index 6dc29a2c0..0b2d91568 100644
--- a/google/cloud/osconfig/v1/BUILD.bazel
+++ b/google/cloud/osconfig/v1/BUILD.bazel
@@ -65,6 +65,7 @@ java_gapic_library(
     name = "osconfig_java_gapic",
     src = ":osconfig_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1",
     service_yaml = "osconfig_v1.yaml",
     test_deps = [
@@ -192,6 +193,7 @@ py_gapic_library(
     name = "osconfig_py_gapic",
     src = ":osconfig_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1",
     service_yaml = "osconfig_v1.yaml",
     deps = [
@@ -236,6 +238,7 @@ php_gapic_library(
     name = "osconfig_php_gapic",
     src = ":osconfig_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1",
     service_yaml = "osconfig_v1.yaml",
     deps = [
@@ -266,7 +269,7 @@ load(
 nodejs_gapic_library(
     name = "osconfig_nodejs_gapic",
     src = ":osconfig_proto_with_info",
-    gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1",
     service_yaml = "osconfig_v1.yaml",
     deps = [],
diff --git a/google/cloud/osconfig/v1beta/BUILD.bazel b/google/cloud/osconfig/v1beta/BUILD.bazel
index 5fed2fba8..86f177bd4 100644
--- a/google/cloud/osconfig/v1beta/BUILD.bazel
+++ b/google/cloud/osconfig/v1beta/BUILD.bazel
@@ -67,6 +67,7 @@ java_gapic_library(
     name = "osconfig_java_gapic",
     src = ":osconfig_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1beta",
     service_yaml = "osconfig_v1beta.yaml",
     test_deps = [
@@ -195,6 +196,7 @@ py_gapic_library(
     name = "osconfig_py_gapic",
     src = ":osconfig_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1beta",
     service_yaml = "osconfig_v1beta.yaml",
     deps = [
@@ -239,6 +241,7 @@ php_gapic_library(
     name = "osconfig_php_gapic",
     src = ":osconfig_proto_with_info",
     gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1beta",
     service_yaml = "osconfig_v1beta.yaml",
     deps = [
@@ -269,7 +272,7 @@ load(
 nodejs_gapic_library(
     name = "osconfig_nodejs_gapic",
     src = ":osconfig_proto_with_info",
-    gapic_yaml = "osconfig_gapic.yaml",
+    grpc_service_config = "osconfig_grpc_service_config.json",
     package = "google.cloud.osconfig.v1beta",
     service_yaml = "osconfig_v1beta.yaml",
     deps = [],
diff --git a/google/cloud/oslogin/artman_oslogin_v1beta.yaml b/google/cloud/oslogin/artman_oslogin_v1beta.yaml
index 6e3c099b6..671233fcc 100644
--- a/google/cloud/oslogin/artman_oslogin_v1beta.yaml
+++ b/google/cloud/oslogin/artman_oslogin_v1beta.yaml
@@ -8,7 +8,7 @@ common:
   - common
   - v1beta
   service_yaml: oslogin_v1beta.yaml
-  gapic_yaml: v1beta/oslogin_gapic.yaml
+  gapic_yaml: v1beta/oslogin_gapic.legacy.yaml
 artifacts:
 - name: gapic_config
   type: GAPIC_CONFIG
diff --git a/google/cloud/oslogin/v1/BUILD.bazel b/google/cloud/oslogin/v1/BUILD.bazel
index ba92c5804..70eee512e 100644
--- a/google/cloud/oslogin/v1/BUILD.bazel
+++ b/google/cloud/oslogin/v1/BUILD.bazel
@@ -81,6 +81,7 @@ java_gapic_library(
     name = "oslogin_java_gapic",
     src = ":oslogin_proto_with_info",
     gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
     gen_resource_name = False,
     package = "google.cloud.oslogin.v1",
     service_yaml = ":oslogin_v1.yaml",
@@ -211,6 +212,7 @@ py_gapic_library(
     name = "oslogin_py_gapic",
     src = ":oslogin_proto_with_info",
     gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
     package = "google.cloud.oslogin.v1",
     service_yaml = "oslogin_v1.yaml",
     deps = [
@@ -260,6 +262,7 @@ php_gapic_library(
     name = "oslogin_php_gapic",
     src = ":oslogin_proto_with_info",
     gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
     package = "google.cloud.oslogin.v1",
     service_yaml = "oslogin_v1.yaml",
     deps = [
@@ -290,7 +293,7 @@ load(
 nodejs_gapic_library(
     name = "oslogin_nodejs_gapic",
     src = ":oslogin_proto_with_info",
-    gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
     package = "google.cloud.oslogin.v1",
     service_yaml = "oslogin_v1.yaml",
     deps = [],
diff --git a/google/cloud/oslogin/v1/oslogin_gapic.yaml b/google/cloud/oslogin/v1/oslogin_gapic.yaml
index fc163107c..bf6900535 100644
--- a/google/cloud/oslogin/v1/oslogin_gapic.yaml
+++ b/google/cloud/oslogin/v1/oslogin_gapic.yaml
@@ -17,23 +17,3 @@ language_settings:
   nodejs:
     package_name: os-login.v1
     domain_layer_location: google-cloud
-interfaces:
-- name: google.cloud.oslogin.v1.OsLoginService
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 10000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 10000
-    total_timeout_millis: 600000
-  methods:
-  - name: DeletePosixAccount
-    retry_codes_name: idempotent
-  - name: DeleteSshPublicKey
-    retry_codes_name: idempotent
-  - name: ImportSshPublicKey
-    retry_codes_name: idempotent
-  - name: UpdateSshPublicKey
-    retry_codes_name: idempotent
diff --git a/google/cloud/oslogin/v1beta/BUILD.bazel b/google/cloud/oslogin/v1beta/BUILD.bazel
index ff1e42d5e..2324cdad3 100644
--- a/google/cloud/oslogin/v1beta/BUILD.bazel
+++ b/google/cloud/oslogin/v1beta/BUILD.bazel
@@ -45,6 +45,7 @@ load(
     "java_gapic_test",
     "java_grpc_library",
     "java_proto_library",
+    "java_resource_name_proto_library",
 )
 
 _JAVA_PROTO_SUBPACKAGE_DEPS = [
@@ -66,14 +67,26 @@ java_grpc_library(
     deps = [":oslogin_java_proto"] + _JAVA_PROTO_SUBPACKAGE_DEPS,
 )
 
+java_resource_name_proto_library(
+    name = "oslogin_java_gapic_resource_name",
+    gapic_yaml = "//google/cloud/oslogin/v1:oslogin_gapic.yaml",
+    deps = [
+        ":oslogin_proto",
+        "//google/cloud:common_resources_proto",
+    ] + _PROTO_SUBPACKAGE_DEPS,
+)
+
 java_gapic_library(
     name = "oslogin_java_gapic",
     src = ":oslogin_proto_with_info",
     gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
+    gen_resource_name = False,
     service_yaml = "//google/cloud/oslogin:oslogin_v1beta.yaml",
     test_deps = [":oslogin_java_grpc"],
     deps = [
         ":oslogin_java_proto",
+        ":oslogin_java_gapic_resource_name",
     ] + _JAVA_PROTO_SUBPACKAGE_DEPS,
 )
 
@@ -194,6 +207,7 @@ py_gapic_library(
     name = "oslogin_py_gapic",
     src = ":oslogin_proto_with_info",
     gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
     package = "google.cloud.oslogin.v1beta",
     service_yaml = "oslogin_v1beta.yaml",
     deps = [
@@ -243,6 +257,7 @@ php_gapic_library(
     name = "oslogin_php_gapic",
     src = ":oslogin_proto_with_info",
     gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
     package = "google.cloud.oslogin.v1beta",
     service_yaml = "oslogin_v1beta.yaml",
     deps = [
@@ -273,7 +288,7 @@ load(
 nodejs_gapic_library(
     name = "oslogin_nodejs_gapic",
     src = ":oslogin_proto_with_info",
-    gapic_yaml = "oslogin_gapic.yaml",
+    grpc_service_config = "oslogin_grpc_service_config.json",
     package = "google.cloud.oslogin.v1beta",
     service_yaml = "oslogin_v1beta.yaml",
     deps = [],
diff --git a/google/cloud/oslogin/v1beta/oslogin_gapic.legacy.yaml b/google/cloud/oslogin/v1beta/oslogin_gapic.legacy.yaml
new file mode 100644
index 000000000..09251d436
--- /dev/null
+++ b/google/cloud/oslogin/v1beta/oslogin_gapic.legacy.yaml
@@ -0,0 +1,222 @@
+type: com.google.api.codegen.ConfigProto
+config_schema_version: 1.0.0
+# The settings of generated code in a specific language.
+language_settings:
+  java:
+    package_name: com.google.cloud.oslogin.v1beta
+  python:
+    package_name: google.cloud.oslogin_v1beta.gapic
+  go:
+    package_name: cloud.google.com/go/oslogin/apiv1beta
+  csharp:
+    package_name: Google.Cloud.OsLogin.V1Beta
+  ruby:
+    package_name: Google::Cloud::OsLogin::V1beta
+  php:
+    package_name: Google\Cloud\OsLogin\V1beta
+  nodejs:
+    package_name: os-login.v1beta
+    domain_layer_location: google-cloud
+# A list of API interface configurations.
+interfaces:
+  # The fully qualified name of the API interface.
+- name: google.cloud.oslogin.v1beta.OsLoginService
+  # A list of resource collection configurations.
+  # Consists of a name_pattern and an entity_name.
+  # The name_pattern is a pattern to describe the names of the resources of this
+  # collection, using the platform's conventions for URI patterns. A generator
+  # may use this to generate methods to compose and decompose such names. The
+  # pattern should use named placeholders as in `shelves/{shelf}/books/{book}`;
+  # those will be taken as hints for the parameter names of the generated
+  # methods. If empty, no name methods are generated.
+  # The entity_name is the name to be used as a basis for generated methods and
+  # classes.
+  collections:
+  - name_pattern: users/{user}
+    entity_name: user
+  - name_pattern: users/{user}/projects/{project}
+    entity_name: project
+  - name_pattern: users/{user}/sshPublicKeys/{fingerprint}
+    entity_name: fingerprint
+  # Definition for retryable codes.
+  retry_codes_def:
+  - name: idempotent
+    retry_codes:
+    - UNAVAILABLE
+    - DEADLINE_EXCEEDED
+  - name: non_idempotent
+    retry_codes: []
+  # Definition for retry/backoff parameters.
+  retry_params_def:
+  - name: default
+    initial_retry_delay_millis: 100
+    retry_delay_multiplier: 1.3
+    max_retry_delay_millis: 60000
+    initial_rpc_timeout_millis: 10000
+    rpc_timeout_multiplier: 1
+    max_rpc_timeout_millis: 10000
+    total_timeout_millis: 600000
+  # A list of method configurations.
+  # Common properties:
+  #
+  #   name - The simple name of the method.
+  #
+  #   flattening - Specifies the configuration for parameter flattening.
+  #   Describes the parameter groups for which a generator should produce method
+  #   overloads which allow a client to directly pass request message fields as
+  #   method parameters. This information may or may not be used, depending on
+  #   the target language.
+  #   Consists of groups, which each represent a list of parameters to be
+  #   flattened. Each parameter listed must be a field of the request message.
+  #
+  #   required_fields - Fields that are always required for a request to be
+  #   valid.
+  #
+  #   resource_name_treatment - An enum that specifies how to treat the resource
+  #   name formats defined in the field_name_patterns and
+  #   response_field_name_patterns fields.
+  #   UNSET: default value
+  #   NONE: the collection configs will not be used by the generated code.
+  #   VALIDATE: string fields will be validated by the client against the
+  #   specified resource name formats.
+  #   STATIC_TYPES: the client will use generated types for resource names.
+  #
+  #   page_streaming - Specifies the configuration for paging.
+  #   Describes information for generating a method which transforms a paging
+  #   list RPC into a stream of resources.
+  #   Consists of a request and a response.
+  #   The request specifies request information of the list method. It defines
+  #   which fields match the paging pattern in the request. The request consists
+  #   of a page_size_field and a token_field. The page_size_field is the name of
+  #   the optional field specifying the maximum number of elements to be
+  #   returned in the response. The token_field is the name of the field in the
+  #   request containing the page token.
+  #   The response specifies response information of the list method. It defines
+  #   which fields match the paging pattern in the response. The response
+  #   consists of a token_field and a resources_field. The token_field is the
+  #   name of the field in the response containing the next page token. The
+  #   resources_field is the name of the field in the response containing the
+  #   list of resources belonging to the page.
+  #
+  #   retry_codes_name - Specifies the configuration for retryable codes. The
+  #   name must be defined in interfaces.retry_codes_def.
+  #
+  #   retry_params_name - Specifies the configuration for retry/backoff
+  #   parameters. The name must be defined in interfaces.retry_params_def.
+  #
+  #   field_name_patterns - Maps the field name of the request type to
+  #   entity_name of interfaces.collections.
+  #   Specifies the string pattern that the field must follow.
+  #
+  #   timeout_millis - Specifies the default timeout for a non-retrying call. If
+  #   the call is retrying, refer to retry_params_name instead.
+  methods:
+  - name: DeletePosixAccount
+    flattening:
+      groups:
+      - parameters:
+        - name
+    required_fields:
+    - name
+    retry_codes_name: idempotent
+    retry_params_name: default
+    field_name_patterns:
+      name: project
+    resource_name_treatment: STATIC_TYPES
+    timeout_millis: 10000
+  - name: DeleteSshPublicKey
+    flattening:
+      groups:
+      - parameters:
+        - name
+    required_fields:
+    - name
+    retry_codes_name: idempotent
+    retry_params_name: default
+    field_name_patterns:
+      name: fingerprint
+    resource_name_treatment: STATIC_TYPES
+    timeout_millis: 10000
+  - name: GetLoginProfile
+    flattening:
+      groups:
+      - parameters:
+        - name
+    required_fields:
+    - name
+    retry_codes_name: idempotent
+    retry_params_name: default
+    field_name_patterns:
+      name: user
+    resource_name_treatment: STATIC_TYPES
+    timeout_millis: 10000
+  - name: GetSshPublicKey
+    flattening:
+      groups:
+      - parameters:
+        - name
+    required_fields:
+    - name
+    retry_codes_name: idempotent
+    retry_params_name: default
+    field_name_patterns:
+      name: fingerprint
+    resource_name_treatment: STATIC_TYPES
+    timeout_millis: 10000
+  - name: ImportSshPublicKey
+    flattening:
+      groups:
+      - parameters:
+        - parent
+        - ssh_public_key
+      - parameters:
+        - parent
+        - ssh_public_key
+        - project_id
+    required_fields:
+    - parent
+    - ssh_public_key
+    retry_codes_name: idempotent
+    retry_params_name: default
+    field_name_patterns:
+      parent: user
+    resource_name_treatment: STATIC_TYPES
+    timeout_millis: 10000
+  - name: UpdateSshPublicKey
+    flattening:
+      groups:
+      - parameters:
+        - name
+        - ssh_public_key
+      - parameters:
+        - name
+        - ssh_public_key
+        - update_mask
+    required_fields:
+    - name
+    - ssh_public_key
+    retry_codes_name: idempotent
+    retry_params_name: default
+    field_name_patterns:
+      name: fingerprint
+    resource_name_treatment: STATIC_TYPES
+    timeout_millis: 10000
+resource_name_generation:
+- message_name: DeletePosixAccountRequest
+  field_entity_map:
+    name: project
+- message_name: DeleteSshPublicKeyRequest
+  field_entity_map:
+    name: fingerprint
+- message_name: GetLoginProfileRequest
+  field_entity_map:
+    name: user
+- message_name: GetSshPublicKeyRequest
+  field_entity_map:
+    name: fingerprint
+- message_name: ImportSshPublicKeyRequest
+  field_entity_map:
+    parent: user
+- message_name: UpdateSshPublicKeyRequest
+  field_entity_map:
+    name: fingerprint
diff --git a/google/cloud/oslogin/v1beta/oslogin_gapic.yaml b/google/cloud/oslogin/v1beta/oslogin_gapic.yaml
index 09251d436..fee957f5b 100644
--- a/google/cloud/oslogin/v1beta/oslogin_gapic.yaml
+++ b/google/cloud/oslogin/v1beta/oslogin_gapic.yaml
@@ -1,5 +1,5 @@
 type: com.google.api.codegen.ConfigProto
-config_schema_version: 1.0.0
+config_schema_version: 2.0.0
 # The settings of generated code in a specific language.
 language_settings:
   java:
@@ -17,206 +17,5 @@ language_settings:
   nodejs:
     package_name: os-login.v1beta
     domain_layer_location: google-cloud
-# A list of API interface configurations.
 interfaces:
-  # The fully qualified name of the API interface.
 - name: google.cloud.oslogin.v1beta.OsLoginService
-  # A list of resource collection configurations.
-  # Consists of a name_pattern and an entity_name.
-  # The name_pattern is a pattern to describe the names of the resources of this
-  # collection, using the platform's conventions for URI patterns. A generator
-  # may use this to generate methods to compose and decompose such names. The
-  # pattern should use named placeholders as in `shelves/{shelf}/books/{book}`;
-  # those will be taken as hints for the parameter names of the generated
-  # methods. If empty, no name methods are generated.
-  # The entity_name is the name to be used as a basis for generated methods and
-  # classes.
-  collections:
-  - name_pattern: users/{user}
-    entity_name: user
-  - name_pattern: users/{user}/projects/{project}
-    entity_name: project
-  - name_pattern: users/{user}/sshPublicKeys/{fingerprint}
-    entity_name: fingerprint
-  # Definition for retryable codes.
-  retry_codes_def:
-  - name: idempotent
-    retry_codes:
-    - UNAVAILABLE
-    - DEADLINE_EXCEEDED
-  - name: non_idempotent
-    retry_codes: []
-  # Definition for retry/backoff parameters.
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 10000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 10000
-    total_timeout_millis: 600000
-  # A list of method configurations.
-  # Common properties:
-  #
-  #   name - The simple name of the method.
-  #
-  #   flattening - Specifies the configuration for parameter flattening.
-  #   Describes the parameter groups for which a generator should produce method
-  #   overloads which allow a client to directly pass request message fields as
-  #   method parameters. This information may or may not be used, depending on
-  #   the target language.
-  #   Consists of groups, which each represent a list of parameters to be
-  #   flattened. Each parameter listed must be a field of the request message.
-  #
-  #   required_fields - Fields that are always required for a request to be
-  #   valid.
-  #
-  #   resource_name_treatment - An enum that specifies how to treat the resource
-  #   name formats defined in the field_name_patterns and
-  #   response_field_name_patterns fields.
-  #   UNSET: default value
-  #   NONE: the collection configs will not be used by the generated code.
-  #   VALIDATE: string fields will be validated by the client against the
-  #   specified resource name formats.
-  #   STATIC_TYPES: the client will use generated types for resource names.
-  #
-  #   page_streaming - Specifies the configuration for paging.
-  #   Describes information for generating a method which transforms a paging
-  #   list RPC into a stream of resources.
-  #   Consists of a request and a response.
-  #   The request specifies request information of the list method. It defines
-  #   which fields match the paging pattern in the request. The request consists
-  #   of a page_size_field and a token_field. The page_size_field is the name of
-  #   the optional field specifying the maximum number of elements to be
-  #   returned in the response. The token_field is the name of the field in the
-  #   request containing the page token.
-  #   The response specifies response information of the list method. It defines
-  #   which fields match the paging pattern in the response. The response
-  #   consists of a token_field and a resources_field. The token_field is the
-  #   name of the field in the response containing the next page token. The
-  #   resources_field is the name of the field in the response containing the
-  #   list of resources belonging to the page.
-  #
-  #   retry_codes_name - Specifies the configuration for retryable codes. The
-  #   name must be defined in interfaces.retry_codes_def.
-  #
-  #   retry_params_name - Specifies the configuration for retry/backoff
-  #   parameters. The name must be defined in interfaces.retry_params_def.
-  #
-  #   field_name_patterns - Maps the field name of the request type to
-  #   entity_name of interfaces.collections.
-  #   Specifies the string pattern that the field must follow.
-  #
-  #   timeout_millis - Specifies the default timeout for a non-retrying call. If
-  #   the call is retrying, refer to retry_params_name instead.
-  methods:
-  - name: DeletePosixAccount
-    flattening:
-      groups:
-      - parameters:
-        - name
-    required_fields:
-    - name
-    retry_codes_name: idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: project
-    resource_name_treatment: STATIC_TYPES
-    timeout_millis: 10000
-  - name: DeleteSshPublicKey
-    flattening:
-      groups:
-      - parameters:
-        - name
-    required_fields:
-    - name
-    retry_codes_name: idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: fingerprint
-    resource_name_treatment: STATIC_TYPES
-    timeout_millis: 10000
-  - name: GetLoginProfile
-    flattening:
-      groups:
-      - parameters:
-        - name
-    required_fields:
-    - name
-    retry_codes_name: idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: user
-    resource_name_treatment: STATIC_TYPES
-    timeout_millis: 10000
-  - name: GetSshPublicKey
-    flattening:
-      groups:
-      - parameters:
-        - name
-    required_fields:
-    - name
-    retry_codes_name: idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: fingerprint
-    resource_name_treatment: STATIC_TYPES
-    timeout_millis: 10000
-  - name: ImportSshPublicKey
-    flattening:
-      groups:
-      - parameters:
-        - parent
-        - ssh_public_key
-      - parameters:
-        - parent
-        - ssh_public_key
-        - project_id
-    required_fields:
-    - parent
-    - ssh_public_key
-    retry_codes_name: idempotent
-    retry_params_name: default
-    field_name_patterns:
-      parent: user
-    resource_name_treatment: STATIC_TYPES
-    timeout_millis: 10000
-  - name: UpdateSshPublicKey
-    flattening:
-      groups:
-      - parameters:
-        - name
-        - ssh_public_key
-      - parameters:
-        - name
-        - ssh_public_key
-        - update_mask
-    required_fields:
-    - name
-    - ssh_public_key
-    retry_codes_name: idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: fingerprint
-    resource_name_treatment: STATIC_TYPES
-    timeout_millis: 10000
-resource_name_generation:
-- message_name: DeletePosixAccountRequest
-  field_entity_map:
-    name: project
-- message_name: DeleteSshPublicKeyRequest
-  field_entity_map:
-    name: fingerprint
-- message_name: GetLoginProfileRequest
-  field_entity_map:
-    name: user
-- message_name: GetSshPublicKeyRequest
-  field_entity_map:
-    name: fingerprint
-- message_name: ImportSshPublicKeyRequest
-  field_entity_map:
-    parent: user
-- message_name: UpdateSshPublicKeyRequest
-  field_entity_map:
-    name: fingerprint
diff --git a/google/cloud/phishingprotection/v1beta1/BUILD.bazel b/google/cloud/phishingprotection/v1beta1/BUILD.bazel
index 8daf4df24..d57df81b9 100644
--- a/google/cloud/phishingprotection/v1beta1/BUILD.bazel
+++ b/google/cloud/phishingprotection/v1beta1/BUILD.bazel
@@ -57,6 +57,7 @@ java_gapic_library(
     name = "phishingprotection_java_gapic",
     src = ":phishingprotection_proto_with_info",
     gapic_yaml = "phishingprotection_gapic.yaml",
+    grpc_service_config = "phishingprotection_grpc_service_config.json",
     package = "google.cloud.phishingprotection.v1beta1",
     service_yaml = "phishingprotection_v1beta1.yaml",
     test_deps = [
@@ -174,6 +175,7 @@ py_gapic_library(
     name = "phishingprotection_py_gapic",
     src = ":phishingprotection_proto_with_info",
     gapic_yaml = "phishingprotection_gapic.yaml",
+    grpc_service_config = "phishingprotection_grpc_service_config.json",
     package = "google.cloud.phishingprotection.v1beta1",
     service_yaml = "phishingprotection_v1beta1.yaml",
     deps = [
@@ -218,6 +220,7 @@ php_gapic_library(
     name = "phishingprotection_php_gapic",
     src = ":phishingprotection_proto_with_info",
     gapic_yaml = "phishingprotection_gapic.yaml",
+    grpc_service_config = "phishingprotection_grpc_service_config.json",
     package = "google.cloud.phishingprotection.v1beta1",
     service_yaml = "phishingprotection_v1beta1.yaml",
     deps = [
@@ -248,7 +251,7 @@ load(
 nodejs_gapic_library(
     name = "phishingprotection_nodejs_gapic",
     src = ":phishingprotection_proto_with_info",
-    gapic_yaml = "phishingprotection_gapic.yaml",
+    grpc_service_config = "phishingprotection_grpc_service_config.json",
     package = "google.cloud.phishingprotection.v1beta1",
     service_yaml = "phishingprotection_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/pubsublite/v1/BUILD.bazel b/google/cloud/pubsublite/v1/BUILD.bazel
new file mode 100644
index 000000000..e00e0d37b
--- /dev/null
+++ b/google/cloud/pubsublite/v1/BUILD.bazel
@@ -0,0 +1,180 @@
+# This file was automatically generated by BuildFileGenerator
+
+# This is an API workspace, having public visibility by default makes perfect sense.
+package(default_visibility = ["//visibility:public"])
+
+##############################################################################
+# Common
+##############################################################################
+load("@rules_proto//proto:defs.bzl", "proto_library")
+
+proto_library(
+    name = "pubsublite_proto",
+    srcs = [
+        "admin.proto",
+        "common.proto",
+        "cursor.proto",
+        "publisher.proto",
+        "subscriber.proto",
+    ],
+    deps = [
+        "//google/api:annotations_proto",
+        "//google/api:client_proto",
+        "//google/api:field_behavior_proto",
+        "//google/api:resource_proto",
+        "@com_google_protobuf//:duration_proto",
+        "@com_google_protobuf//:empty_proto",
+        "@com_google_protobuf//:field_mask_proto",
+        "@com_google_protobuf//:timestamp_proto",
+    ],
+)
+
+##############################################################################
+# Java
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "java_grpc_library",
+    "java_proto_library",
+)
+
+java_proto_library(
+    name = "pubsublite_java_proto",
+    deps = [":pubsublite_proto"],
+)
+
+java_grpc_library(
+    name = "pubsublite_java_grpc",
+    srcs = [":pubsublite_proto"],
+    deps = [":pubsublite_java_proto"],
+)
+
+##############################################################################
+# Go
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "go_proto_library",
+)
+
+go_proto_library(
+    name = "pubsublite_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "google.golang.org/genproto/googleapis/cloud/pubsublite/v1",
+    protos = [":pubsublite_proto"],
+    deps = [
+        "//google/api:annotations_go_proto",
+    ],
+)
+
+##############################################################################
+# Python
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "moved_proto_library",
+    "py_grpc_library",
+    "py_proto_library",
+)
+
+moved_proto_library(
+    name = "pubsublite_moved_proto",
+    srcs = [":pubsublite_proto"],
+    deps = [
+        "//google/api:annotations_proto",
+        "//google/api:client_proto",
+        "//google/api:field_behavior_proto",
+        "//google/api:resource_proto",
+        "@com_google_protobuf//:duration_proto",
+        "@com_google_protobuf//:empty_proto",
+        "@com_google_protobuf//:field_mask_proto",
+        "@com_google_protobuf//:timestamp_proto",
+    ],
+)
+
+py_proto_library(
+    name = "pubsublite_py_proto",
+    plugin = "@protoc_docs_plugin//:docs_plugin",
+    deps = [":pubsublite_moved_proto"],
+)
+
+py_grpc_library(
+    name = "pubsublite_py_grpc",
+    srcs = [":pubsublite_moved_proto"],
+    deps = [":pubsublite_py_proto"],
+)
+
+##############################################################################
+# PHP
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "php_grpc_library",
+    "php_proto_library",
+)
+
+php_proto_library(
+    name = "pubsublite_php_proto",
+    deps = [":pubsublite_proto"],
+)
+
+php_grpc_library(
+    name = "pubsublite_php_grpc",
+    srcs = [":pubsublite_proto"],
+    deps = [":pubsublite_php_proto"],
+)
+
+##############################################################################
+# Node.js
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "nodejs_gapic_assembly_pkg",
+    "nodejs_gapic_library",
+)
+
+
+##############################################################################
+# Ruby
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "ruby_grpc_library",
+    "ruby_proto_library",
+)
+
+ruby_proto_library(
+    name = "pubsublite_ruby_proto",
+    deps = [":pubsublite_proto"],
+)
+
+ruby_grpc_library(
+    name = "pubsublite_ruby_grpc",
+    srcs = [":pubsublite_proto"],
+    deps = [":pubsublite_ruby_proto"],
+)
+
+##############################################################################
+# C#
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "csharp_grpc_library",
+    "csharp_proto_library",
+)
+
+csharp_proto_library(
+    name = "pubsublite_csharp_proto",
+    deps = [":pubsublite_proto"],
+)
+
+csharp_grpc_library(
+    name = "pubsublite_csharp_grpc",
+    srcs = [":pubsublite_proto"],
+    deps = [":pubsublite_csharp_proto"],
+)
+
+##############################################################################
+# C++
+##############################################################################
+# Put your C++ code here
diff --git a/google/cloud/pubsublite/v1/admin.proto b/google/cloud/pubsublite/v1/admin.proto
new file mode 100644
index 000000000..fb32fa0f9
--- /dev/null
+++ b/google/cloud/pubsublite/v1/admin.proto
@@ -0,0 +1,363 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.pubsublite.v1;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "google/cloud/pubsublite/v1/common.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/field_mask.proto";
+
+option go_package = "google.golang.org/genproto/googleapis/cloud/pubsublite/v1;pubsublite";
+option java_multiple_files = true;
+option java_outer_classname = "AdminProto";
+option java_package = "com.google.cloud.pubsublite.proto";
+
+// The service that a client application uses to manage topics and
+// subscriptions, such creating, listing, and deleting topics and subscriptions.
+service AdminService {
+  option (google.api.default_host) = "pubsublite.googleapis.com";
+  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";
+
+  // Creates a new topic.
+  rpc CreateTopic(CreateTopicRequest) returns (Topic) {
+    option (google.api.http) = {
+      post: "/v1/admin/{parent=projects/*/locations/*}/topics"
+      body: "topic"
+    };
+    option (google.api.method_signature) = "parent,topic,topic_id";
+  }
+
+  // Returns the topic configuration.
+  rpc GetTopic(GetTopicRequest) returns (Topic) {
+    option (google.api.http) = {
+      get: "/v1/admin/{name=projects/*/locations/*/topics/*}"
+    };
+    option (google.api.method_signature) = "name";
+  }
+
+  // Returns the partition information for the requested topic.
+  rpc GetTopicPartitions(GetTopicPartitionsRequest) returns (TopicPartitions) {
+    option (google.api.http) = {
+      get: "/v1/admin/{name=projects/*/locations/*/topics/*}/partitions"
+    };
+    option (google.api.method_signature) = "name";
+  }
+
+  // Returns the list of topics for the given project.
+  rpc ListTopics(ListTopicsRequest) returns (ListTopicsResponse) {
+    option (google.api.http) = {
+      get: "/v1/admin/{parent=projects/*/locations/*}/topics"
+    };
+    option (google.api.method_signature) = "parent";
+  }
+
+  // Updates properties of the specified topic.
+  rpc UpdateTopic(UpdateTopicRequest) returns (Topic) {
+    option (google.api.http) = {
+      patch: "/v1/admin/{topic.name=projects/*/locations/*/topics/*}"
+      body: "topic"
+    };
+    option (google.api.method_signature) = "topic,update_mask";
+  }
+
+  // Deletes the specified topic.
+  rpc DeleteTopic(DeleteTopicRequest) returns (google.protobuf.Empty) {
+    option (google.api.http) = {
+      delete: "/v1/admin/{name=projects/*/locations/*/topics/*}"
+    };
+    option (google.api.method_signature) = "name";
+  }
+
+  // Lists the subscriptions attached to the specified topic.
+  rpc ListTopicSubscriptions(ListTopicSubscriptionsRequest) returns (ListTopicSubscriptionsResponse) {
+    option (google.api.http) = {
+      get: "/v1/admin/{name=projects/*/locations/*/topics/*}/subscriptions"
+    };
+    option (google.api.method_signature) = "name";
+  }
+
+  // Creates a new subscription.
+  rpc CreateSubscription(CreateSubscriptionRequest) returns (Subscription) {
+    option (google.api.http) = {
+      post: "/v1/admin/{parent=projects/*/locations/*}/subscriptions"
+      body: "subscription"
+    };
+    option (google.api.method_signature) = "parent,subscription,subscription_id";
+  }
+
+  // Returns the subscription configuration.
+  rpc GetSubscription(GetSubscriptionRequest) returns (Subscription) {
+    option (google.api.http) = {
+      get: "/v1/admin/{name=projects/*/locations/*/subscriptions/*}"
+    };
+    option (google.api.method_signature) = "name";
+  }
+
+  // Returns the list of subscriptions for the given project.
+  rpc ListSubscriptions(ListSubscriptionsRequest) returns (ListSubscriptionsResponse) {
+    option (google.api.http) = {
+      get: "/v1/admin/{parent=projects/*/locations/*}/subscriptions"
+    };
+    option (google.api.method_signature) = "parent";
+  }
+
+  // Updates properties of the specified subscription.
+  rpc UpdateSubscription(UpdateSubscriptionRequest) returns (Subscription) {
+    option (google.api.http) = {
+      patch: "/v1/admin/{subscription.name=projects/*/locations/*/subscriptions/*}"
+      body: "subscription"
+    };
+    option (google.api.method_signature) = "subscription,update_mask";
+  }
+
+  // Deletes the specified subscription.
+  rpc DeleteSubscription(DeleteSubscriptionRequest) returns (google.protobuf.Empty) {
+    option (google.api.http) = {
+      delete: "/v1/admin/{name=projects/*/locations/*/subscriptions/*}"
+    };
+    option (google.api.method_signature) = "name";
+  }
+}
+
+// Request for CreateTopic.
+message CreateTopicRequest {
+  // Required. The parent location in which to create the topic.
+  // Structured like `projects/{project_number}/locations/{location}`.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "locations.googleapis.com/Location"
+    }
+  ];
+
+  // Required. Configuration of the topic to create. Its `name` field is ignored.
+  Topic topic = 2 [(google.api.field_behavior) = REQUIRED];
+
+  // Required. The ID to use for the topic, which will become the final component of
+  // the topic's name.
+  //
+  // This value is structured like: `my-topic-name`.
+  string topic_id = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for GetTopic.
+message GetTopicRequest {
+  // Required. The name of the topic whose configuration to return.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsublite.googleapis.com/Topic"
+    }
+  ];
+}
+
+// Request for GetTopicPartitions.
+message GetTopicPartitionsRequest {
+  // Required. The topic whose partition information to return.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsublite.googleapis.com/Topic"
+    }
+  ];
+}
+
+// Response for GetTopicPartitions.
+message TopicPartitions {
+  // The number of partitions in the topic.
+  int64 partition_count = 1;
+}
+
+// Request for ListTopics.
+message ListTopicsRequest {
+  // Required. The parent whose topics are to be listed.
+  // Structured like `projects/{project_number}/locations/{location}`.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "locations.googleapis.com/Location"
+    }
+  ];
+
+  // The maximum number of topics to return. The service may return fewer than
+  // this value.
+  // If unset or zero, all topics for the parent will be returned.
+  int32 page_size = 2;
+
+  // A page token, received from a previous `ListTopics` call.
+  // Provide this to retrieve the subsequent page.
+  //
+  // When paginating, all other parameters provided to `ListTopics` must match
+  // the call that provided the page token.
+  string page_token = 3;
+}
+
+// Response for ListTopics.
+message ListTopicsResponse {
+  // The list of topic in the requested parent. The order of the topics is
+  // unspecified.
+  repeated Topic topics = 1;
+
+  // A token that can be sent as `page_token` to retrieve the next page of
+  // results. If this field is omitted, there are no more results.
+  string next_page_token = 2;
+}
+
+// Request for UpdateTopic.
+message UpdateTopicRequest {
+  // Required. The topic to update. Its `name` field must be populated.
+  Topic topic = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // Required. A mask specifying the topic fields to change.
+  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for DeleteTopic.
+message DeleteTopicRequest {
+  // Required. The name of the topic to delete.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsublite.googleapis.com/Topic"
+    }
+  ];
+}
+
+// Request for ListTopicSubscriptions.
+message ListTopicSubscriptionsRequest {
+  // Required. The name of the topic whose subscriptions to list.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsublite.googleapis.com/Topic"
+    }
+  ];
+
+  // The maximum number of subscriptions to return. The service may return fewer
+  // than this value.
+  // If unset or zero, all subscriptions for the given topic will be returned.
+  int32 page_size = 2;
+
+  // A page token, received from a previous `ListTopicSubscriptions` call.
+  // Provide this to retrieve the subsequent page.
+  //
+  // When paginating, all other parameters provided to `ListTopicSubscriptions`
+  // must match the call that provided the page token.
+  string page_token = 3;
+}
+
+// Response for ListTopicSubscriptions.
+message ListTopicSubscriptionsResponse {
+  // The names of subscriptions attached to the topic. The order of the
+  // subscriptions is unspecified.
+  repeated string subscriptions = 1;
+
+  // A token that can be sent as `page_token` to retrieve the next page of
+  // results. If this field is omitted, there are no more results.
+  string next_page_token = 2;
+}
+
+// Request for CreateSubscription.
+message CreateSubscriptionRequest {
+  // Required. The parent location in which to create the subscription.
+  // Structured like `projects/{project_number}/locations/{location}`.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "locations.googleapis.com/Location"
+    }
+  ];
+
+  // Required. Configuration of the subscription to create. Its `name` field is ignored.
+  Subscription subscription = 2 [(google.api.field_behavior) = REQUIRED];
+
+  // Required. The ID to use for the subscription, which will become the final component
+  // of the subscription's name.
+  //
+  // This value is structured like: `my-sub-name`.
+  string subscription_id = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for GetSubscription.
+message GetSubscriptionRequest {
+  // Required. The name of the subscription whose configuration to return.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsublite.googleapis.com/Subscription"
+    }
+  ];
+}
+
+// Request for ListSubscriptions.
+message ListSubscriptionsRequest {
+  // Required. The parent whose subscriptions are to be listed.
+  // Structured like `projects/{project_number}/locations/{location}`.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "locations.googleapis.com/Location"
+    }
+  ];
+
+  // The maximum number of subscriptions to return. The service may return fewer
+  // than this value.
+  // If unset or zero, all subscriptions for the parent will be returned.
+  int32 page_size = 2;
+
+  // A page token, received from a previous `ListSubscriptions` call.
+  // Provide this to retrieve the subsequent page.
+  //
+  // When paginating, all other parameters provided to `ListSubscriptions` must
+  // match the call that provided the page token.
+  string page_token = 3;
+}
+
+// Response for ListSubscriptions.
+message ListSubscriptionsResponse {
+  // The list of subscriptions in the requested parent. The order of the
+  // subscriptions is unspecified.
+  repeated Subscription subscriptions = 1;
+
+  // A token that can be sent as `page_token` to retrieve the next page of
+  // results. If this field is omitted, there are no more results.
+  string next_page_token = 2;
+}
+
+// Request for UpdateSubscription.
+message UpdateSubscriptionRequest {
+  // Required. The subscription to update. Its `name` field must be populated.
+  // Topic field must not be populated.
+  Subscription subscription = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // Required. A mask specifying the subscription fields to change.
+  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for DeleteSubscription.
+message DeleteSubscriptionRequest {
+  // Required. The name of the subscription to delete.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsublite.googleapis.com/Subscription"
+    }
+  ];
+}
diff --git a/google/cloud/pubsublite/v1/common.proto b/google/cloud/pubsublite/v1/common.proto
new file mode 100644
index 000000000..285972427
--- /dev/null
+++ b/google/cloud/pubsublite/v1/common.proto
@@ -0,0 +1,188 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.pubsublite.v1;
+
+import "google/api/resource.proto";
+import "google/protobuf/duration.proto";
+import "google/protobuf/timestamp.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/cloud/pubsublite/v1;pubsublite";
+option java_multiple_files = true;
+option java_outer_classname = "CommonProto";
+option java_package = "com.google.cloud.pubsublite.proto";
+
+// The values associated with a key of an attribute.
+message AttributeValues {
+  // The list of values associated with a key.
+  repeated bytes values = 1;
+}
+
+// A message that is published by publishers and delivered to subscribers.
+message PubSubMessage {
+  // The key used for routing messages to partitions or for compaction (e.g.,
+  // keep the last N messages per key). If the key is empty, the message is
+  // routed to an arbitrary partition.
+  bytes key = 1;
+
+  // The payload of the message.
+  bytes data = 2;
+
+  // Optional attributes that can be used for message metadata/headers.
+  map attributes = 3;
+
+  // An optional, user-specified event time.
+  google.protobuf.Timestamp event_time = 4;
+}
+
+// A cursor that describes the position of a message within a topic partition.
+message Cursor {
+  // The offset of a message within a topic partition. Must be greater than or
+  // equal 0.
+  int64 offset = 1;
+}
+
+message SequencedMessage {
+  // The position of a message within the partition where it is stored.
+  Cursor cursor = 1;
+
+  // The time when the message was received by the server when it was first
+  // published.
+  google.protobuf.Timestamp publish_time = 2;
+
+  // The user message.
+  PubSubMessage message = 3;
+
+  // The size in bytes of this message for flow control and quota purposes.
+  int64 size_bytes = 4;
+}
+
+// Metadata about a topic resource.
+message Topic {
+  option (google.api.resource) = {
+    type: "pubsublite.googleapis.com/Topic"
+    pattern: "projects/{project}/locations/{location}/topics/{topic}"
+  };
+
+  // The settings for a topic's partitions.
+  message PartitionConfig {
+    // The number of partitions in the topic. Must be at least 1.
+    int64 count = 1;
+
+    // Every partition in the topic is allocated throughput equivalent to
+    // `scale` times the standard partition throughput (4 MiB/s). This is also
+    // reflected in the cost of this topic; a topic with `scale` of 2 and count
+    // of 10 is charged for 20 partitions. This value must be in the range
+    // [1,4].
+    int32 scale = 2;
+  }
+
+  // The settings for a topic's message retention.
+  message RetentionConfig {
+    // The provisioned storage, in bytes, per partition. If the number of bytes
+    // stored in any of the topic's partitions grows beyond this value, older
+    // messages will be dropped to make room for newer ones, regardless of the
+    // value of `period`.
+    int64 per_partition_bytes = 1;
+
+    // How long a published message is retained. If unset, messages will be
+    // retained as long as the bytes retained for each partition is below
+    // `per_partition_bytes`.
+    google.protobuf.Duration period = 2;
+  }
+
+  // The name of the topic.
+  // Structured like:
+  // projects/{project_number}/locations/{location}/topics/{topic_id}
+  string name = 1;
+
+  // The settings for this topic's partitions.
+  PartitionConfig partition_config = 2;
+
+  // The settings for this topic's message retention.
+  RetentionConfig retention_config = 3;
+}
+
+// Metadata about a subscription resource.
+message Subscription {
+  option (google.api.resource) = {
+    type: "pubsublite.googleapis.com/Subscription"
+    pattern: "projects/{project}/locations/{location}/subscriptions/{subscription}"
+  };
+
+  // The settings for a subscription's message delivery.
+  message DeliveryConfig {
+    // When this subscription should send messages to subscribers relative to
+    // messages persistence in storage.
+    enum DeliveryRequirement {
+      // Default value. This value is unused.
+      DELIVERY_REQUIREMENT_UNSPECIFIED = 0;
+
+      // The server does not wait for a published message to be successfully
+      // written to storage before delivering it to subscribers. As such, a
+      // subscriber may receive a message for which the write to storage failed.
+      // If the subscriber re-reads the offset of that message later on (e.g.,
+      // after a `Seek` operation), there may be a gap at that offset. Even if
+      // not re-reading messages, the delivery of messages for which the write
+      // to storage fails may be inconsistent across subscriptions, with some
+      // receiving the message (e.g., those connected at the time the message is
+      // published) and others not receiving it (e.g., those disconnected at
+      // publish time). Note that offsets are never reused, so even if
+      // DELIVER_IMMEDIATELY is used, subscribers will not receive different
+      // messages when re-reading, they will just see gaps. EXAMPLE:
+      //   (0) Topic 'topic1' is created with a single partition.
+      //   (1) Two subscriptions 'sub1' and 'sub2' are created on topic1. sub1
+      //       has 'DELIVER_IMMEDIATELY', sub2 has 'DELIVER_AFTER_STORED'.
+      //   (2) A stream is opened for sub1 but not sub2.
+      //   (3) A stream is opened for a publisher client using pub1.
+      //   (4) pub1 successfully publishes m0 at offset 0 and m0 is delivered to
+      //       sub1.
+      //   (5) pub1 publishes m1 at offset 1 and m1 is delivered to sub1 but the
+      //       write to storage fails (their stream then breaks).
+      //   (6) A stream is reopened for pub1.
+      //   (6) pub1 successfully publishes m2 at offset 2 and m2 is delivered to
+      //       sub1.
+      //   (some time elapses...)
+      //   (7) A stream is opened for sub2 and it receives m0 and m2 but not m1.
+      //   (8) sub1 seeks to offset 1 but only receives m2 and not m1.
+      DELIVER_IMMEDIATELY = 1;
+
+      // The server will not deliver a published message to subscribers until
+      // the message has been successfully written to storage. This will result
+      // in higher end-to-end latency, but consistent delivery.
+      DELIVER_AFTER_STORED = 2;
+    }
+
+    // The DeliveryRequirement for this subscription.
+    DeliveryRequirement delivery_requirement = 3;
+  }
+
+  // The name of the subscription.
+  // Structured like:
+  // projects/{project_number}/locations/{location}/subscriptions/{subscription_id}
+  string name = 1;
+
+  // The name of the topic this subscription is attached to.
+  // Structured like:
+  // projects/{project_number}/locations/{location}/topics/{topic_id}
+  string topic = 2 [(google.api.resource_reference) = {
+                      type: "pubsublite.googleapis.com/Topic"
+                    }];
+
+  // The settings for this subscription's message delivery.
+  DeliveryConfig delivery_config = 3;
+}
diff --git a/google/cloud/pubsublite/v1/cursor.proto b/google/cloud/pubsublite/v1/cursor.proto
new file mode 100644
index 000000000..ba47601ba
--- /dev/null
+++ b/google/cloud/pubsublite/v1/cursor.proto
@@ -0,0 +1,169 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.pubsublite.v1;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "google/cloud/pubsublite/v1/common.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/cloud/pubsublite/v1;pubsublite";
+option java_multiple_files = true;
+option java_outer_classname = "CursorProto";
+option java_package = "com.google.cloud.pubsublite.proto";
+
+// The service that a subscriber client application uses to manage committed
+// cursors while receiving messsages. A cursor represents a subscriber's
+// progress within a topic partition for a given subscription.
+service CursorService {
+  option (google.api.default_host) = "pubsublite.googleapis.com";
+  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";
+
+  // Establishes a stream with the server for managing committed cursors.
+  rpc StreamingCommitCursor(stream StreamingCommitCursorRequest) returns (stream StreamingCommitCursorResponse) {
+  }
+
+  // Updates the committed cursor.
+  rpc CommitCursor(CommitCursorRequest) returns (CommitCursorResponse) {
+  }
+
+  // Returns all committed cursor information for a subscription.
+  rpc ListPartitionCursors(ListPartitionCursorsRequest) returns (ListPartitionCursorsResponse) {
+    option (google.api.http) = {
+      get: "/v1/cursor/{parent=projects/*/locations/*/subscriptions/*}/cursors"
+    };
+    option (google.api.method_signature) = "parent";
+  }
+}
+
+// The first streaming request that must be sent on a newly-opened stream. The
+// client must wait for the response before sending subsequent requests on the
+// stream.
+message InitialCommitCursorRequest {
+  // The subscription for which to manage committed cursors.
+  string subscription = 1;
+
+  // The partition for which to manage committed cursors. Partitions are zero
+  // indexed, so `partition` must be in the range [0, topic.num_partitions).
+  int64 partition = 2;
+}
+
+// Response to an InitialCommitCursorRequest.
+message InitialCommitCursorResponse {
+
+}
+
+// Streaming request to update the committed cursor. Subsequent
+// SequencedCommitCursorRequests override outstanding ones.
+message SequencedCommitCursorRequest {
+  // The new value for the committed cursor.
+  Cursor cursor = 1;
+}
+
+// Response to a SequencedCommitCursorRequest.
+message SequencedCommitCursorResponse {
+  // The number of outstanding SequencedCommitCursorRequests acknowledged by
+  // this response. Note that SequencedCommitCursorRequests are acknowledged in
+  // the order that they are received.
+  int64 acknowledged_commits = 1;
+}
+
+// A request sent from the client to the server on a stream.
+message StreamingCommitCursorRequest {
+  oneof request {
+    // Initial request on the stream.
+    InitialCommitCursorRequest initial = 1;
+
+    // Request to commit a new cursor value.
+    SequencedCommitCursorRequest commit = 2;
+  }
+}
+
+// Response to a StreamingCommitCursorRequest.
+message StreamingCommitCursorResponse {
+  oneof request {
+    // Initial response on the stream.
+    InitialCommitCursorResponse initial = 1;
+
+    // Response to committing a new cursor value.
+    SequencedCommitCursorResponse commit = 2;
+  }
+}
+
+// Request for CommitCursor.
+message CommitCursorRequest {
+  // The subscription for which to update the cursor.
+  string subscription = 1;
+
+  // The partition for which to update the cursor. Partitions are zero indexed,
+  // so `partition` must be in the range [0, topic.num_partitions).
+  int64 partition = 2;
+
+  // The new value for the committed cursor.
+  Cursor cursor = 3;
+}
+
+// Response for CommitCursor.
+message CommitCursorResponse {
+
+}
+
+// Request for ListPartitionCursors.
+message ListPartitionCursorsRequest {
+  // Required. The subscription for which to retrieve cursors.
+  // Structured like
+  // `projects/{project_number}/locations/{location}/subscriptions/{subscription_id}`.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsublite.googleapis.com/Subscription"
+    }
+  ];
+
+  // The maximum number of cursors to return. The service may return fewer than
+  // this value.
+  // If unset or zero, all cursors for the parent will be returned.
+  int32 page_size = 2;
+
+  // A page token, received from a previous `ListPartitionCursors` call.
+  // Provide this to retrieve the subsequent page.
+  //
+  // When paginating, all other parameters provided to `ListPartitionCursors`
+  // must match the call that provided the page token.
+  string page_token = 3;
+}
+
+// A pair of a Cursor and the partition it is for.
+message PartitionCursor {
+  // The partition this is for.
+  int64 partition = 1;
+
+  // The value of the cursor.
+  Cursor cursor = 2;
+}
+
+// Response for ListPartitionCursors
+message ListPartitionCursorsResponse {
+  // The partition cursors from this request.
+  repeated PartitionCursor partition_cursors = 1;
+
+  // A token, which can be sent as `page_token` to retrieve the next page.
+  // If this field is omitted, there are no subsequent pages.
+  string next_page_token = 2;
+}
diff --git a/google/cloud/pubsublite/v1/publisher.proto b/google/cloud/pubsublite/v1/publisher.proto
new file mode 100644
index 000000000..3abd2f5c4
--- /dev/null
+++ b/google/cloud/pubsublite/v1/publisher.proto
@@ -0,0 +1,95 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.pubsublite.v1;
+
+import "google/cloud/pubsublite/v1/common.proto";
+import "google/api/client.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/cloud/pubsublite/v1;pubsublite";
+option java_multiple_files = true;
+option java_outer_classname = "PublisherProto";
+option java_package = "com.google.cloud.pubsublite.proto";
+
+// The service that a publisher client application uses to publish messages to
+// topics. Published messages are retained by the service for the duration of
+// the retention period configured for the respective topic, and are delivered
+// to subscriber clients upon request (via the `SubscriberService`).
+service PublisherService {
+  option (google.api.default_host) = "pubsublite.googleapis.com";
+  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";
+
+  // Establishes a stream with the server for publishing messages. Once the
+  // stream is initialized, the client publishes messages by sending publish
+  // requests on the stream. The server responds with a PublishResponse for each
+  // PublishRequest sent by the client, in the same order that the requests
+  // were sent. Note that multiple PublishRequests can be in flight
+  // simultaneously, but they will be processed by the server in the order that
+  // they are sent by the client on a given stream.
+  rpc Publish(stream PublishRequest) returns (stream PublishResponse) {
+  }
+}
+
+// The first request that must be sent on a newly-opened stream.
+message InitialPublishRequest {
+  // The topic to which messages will be written.
+  string topic = 1;
+
+  // The partition within the topic to which messages will be written.
+  // Partitions are zero indexed, so `partition` must be in the range [0,
+  // topic.num_partitions).
+  int64 partition = 2;
+}
+
+// Response to an InitialPublishRequest.
+message InitialPublishResponse {
+
+}
+
+// Request to publish messages to the topic.
+message MessagePublishRequest {
+  repeated PubSubMessage messages = 1;
+}
+
+// Response to a MessagePublishRequest.
+message MessagePublishResponse {
+  // The cursor of the first published message in the batch. The cursors for any
+  // remaining messages in the batch are guaranteed to be sequential.
+  Cursor start_cursor = 1;
+}
+
+// Request sent from the client to the server on a stream.
+message PublishRequest {
+  oneof request_type {
+    // Initial request on the stream.
+    InitialPublishRequest initial_request = 1;
+
+    // Request to publish messages.
+    MessagePublishRequest message_publish_request = 2;
+  }
+}
+
+// Response to a PublishRequest.
+message PublishResponse {
+  oneof response_type {
+    // Initial response on the stream.
+    InitialPublishResponse initial_response = 1;
+
+    // Response to publishing messages.
+    MessagePublishResponse message_response = 2;
+  }
+}
diff --git a/google/cloud/pubsublite/v1/pubsublite_v1.yaml b/google/cloud/pubsublite/v1/pubsublite_v1.yaml
new file mode 100644
index 000000000..e4d2835b1
--- /dev/null
+++ b/google/cloud/pubsublite/v1/pubsublite_v1.yaml
@@ -0,0 +1,29 @@
+type: google.api.Service
+config_version: 3
+name: pubsublite.googleapis.com
+title: Pub/Sub Lite API
+
+apis:
+- name: google.cloud.pubsublite.v1.AdminService
+- name: google.cloud.pubsublite.v1.CursorService
+- name: google.cloud.pubsublite.v1.PublisherService
+- name: google.cloud.pubsublite.v1.SubscriberService
+
+authentication:
+  rules:
+  - selector: 'google.cloud.pubsublite.v1.AdminService.*'
+    oauth:
+      canonical_scopes: |-
+        https://www.googleapis.com/auth/cloud-platform
+  - selector: 'google.cloud.pubsublite.v1.CursorService.*'
+    oauth:
+      canonical_scopes: |-
+        https://www.googleapis.com/auth/cloud-platform
+  - selector: google.cloud.pubsublite.v1.PublisherService.Publish
+    oauth:
+      canonical_scopes: |-
+        https://www.googleapis.com/auth/cloud-platform
+  - selector: google.cloud.pubsublite.v1.SubscriberService.Subscribe
+    oauth:
+      canonical_scopes: |-
+        https://www.googleapis.com/auth/cloud-platform
diff --git a/google/cloud/pubsublite/v1/subscriber.proto b/google/cloud/pubsublite/v1/subscriber.proto
new file mode 100644
index 000000000..c16b34b80
--- /dev/null
+++ b/google/cloud/pubsublite/v1/subscriber.proto
@@ -0,0 +1,140 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.pubsublite.v1;
+
+import "google/cloud/pubsublite/v1/common.proto";
+import "google/api/client.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/cloud/pubsublite/v1;pubsublite";
+option java_multiple_files = true;
+option java_outer_classname = "SubscriberProto";
+option java_package = "com.google.cloud.pubsublite.proto";
+
+// The service that a subscriber client application uses to receive messages
+// from subscriptions.
+service SubscriberService {
+  option (google.api.default_host) = "pubsublite.googleapis.com";
+  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";
+
+  // Establishes a stream with the server for receiving messages.
+  rpc Subscribe(stream SubscribeRequest) returns (stream SubscribeResponse) {
+  }
+}
+
+// The first request that must be sent on a newly-opened stream. The client must
+// wait for the response before sending subsequent requests on the stream.
+message InitialSubscribeRequest {
+  // The subscription from which to receive messages.
+  string subscription = 1;
+
+  // The partition from which to receive messages. Partitions are zero indexed,
+  // so `partition` must be in the range [0, topic.num_partitions).
+  int64 partition = 2;
+}
+
+// Response to an InitialSubscribeRequest.
+message InitialSubscribeResponse {
+  // The cursor from which the subscriber will start receiving messages once
+  // flow control tokens become available.
+  Cursor cursor = 1;
+}
+
+// Request to update the stream's delivery cursor based on the given target.
+// Resets the server available tokens to 0. SeekRequests may not be sent while
+// another SeekRequest is outstanding (i.e., has not received a SeekResponse) on
+// the same stream. SeekRequests past head result in stream breakage.
+message SeekRequest {
+  // A special target in the partition that takes no other parameters.
+  enum NamedTarget {
+    // Default value. This value is unused.
+    NAMED_TARGET_UNSPECIFIED = 0;
+
+    // A target corresponding to the most recently published message in the
+    // partition.
+    HEAD = 1;
+
+    // A target corresponding to the committed cursor for the given subscription
+    // and topic partition.
+    COMMITTED_CURSOR = 2;
+  }
+
+  // The target to seek to. Must be set.
+  oneof target {
+    // A named target.
+    NamedTarget named_target = 1;
+
+    // A target corresponding to the cursor, pointing to anywhere in the
+    // topic partition.
+    Cursor cursor = 2;
+  }
+}
+
+// Response to a SeekRequest.
+message SeekResponse {
+  // The new delivery cursor for the current stream.
+  Cursor cursor = 1;
+}
+
+// Request to grant tokens to the server, requesting delivery of messages when
+// they become available.
+message FlowControlRequest {
+  // The number of message tokens to grant. Must be greater than or equal to 0.
+  int64 allowed_messages = 1;
+
+  // The number of byte tokens to grant. Must be greater than or equal to 0.
+  int64 allowed_bytes = 2;
+}
+
+// A request sent from the client to the server on a stream.
+message SubscribeRequest {
+  oneof request {
+    // Initial request on the stream.
+    InitialSubscribeRequest initial = 1;
+
+    // Request to update the stream's delivery cursor.
+    SeekRequest seek = 2;
+
+    // Request to grant tokens to the server,
+    FlowControlRequest flow_control = 3;
+  }
+}
+
+// Response containing a list of messages. Upon delivering a MessageResponse to
+// the client, the server:
+// *  Updates the stream's delivery cursor to one greater than the cursor of the
+//    last message in the list.
+// *  Subtracts the total number of bytes and messages from the tokens available
+//    to the server.
+message MessageResponse {
+  // Messages from the topic partition.
+  repeated SequencedMessage messages = 1;
+}
+
+// Response to SubscribeRequest.
+message SubscribeResponse {
+  oneof response {
+    // Initial response on the stream.
+    InitialSubscribeResponse initial = 1;
+
+    // Response to a Seek operation.
+    SeekResponse seek = 2;
+
+    // Response containing messages from the topic partition.
+    MessageResponse messages = 3;
+  }
+}
diff --git a/google/cloud/recaptchaenterprise/v1/BUILD.bazel b/google/cloud/recaptchaenterprise/v1/BUILD.bazel
index 965399a66..8ed2c6b67 100644
--- a/google/cloud/recaptchaenterprise/v1/BUILD.bazel
+++ b/google/cloud/recaptchaenterprise/v1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "recaptchaenterprise_java_gapic",
     src = ":recaptchaenterprise_proto_with_info",
     gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1",
     service_yaml = "recaptchaenterprise_v1.yaml",
     test_deps = [
@@ -180,6 +181,7 @@ py_gapic_library(
     name = "recaptchaenterprise_py_gapic",
     src = ":recaptchaenterprise_proto_with_info",
     gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1",
     service_yaml = "recaptchaenterprise_v1.yaml",
     deps = [
@@ -224,6 +226,7 @@ php_gapic_library(
     name = "recaptchaenterprise_php_gapic",
     src = ":recaptchaenterprise_proto_with_info",
     gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1",
     service_yaml = "recaptchaenterprise_v1.yaml",
     deps = [
@@ -254,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "recaptchaenterprise_nodejs_gapic",
     src = ":recaptchaenterprise_proto_with_info",
-    gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1",
     service_yaml = "recaptchaenterprise_v1.yaml",
     deps = [],
diff --git a/google/cloud/recaptchaenterprise/v1beta1/BUILD.bazel b/google/cloud/recaptchaenterprise/v1beta1/BUILD.bazel
index 3586a8443..d84de0555 100644
--- a/google/cloud/recaptchaenterprise/v1beta1/BUILD.bazel
+++ b/google/cloud/recaptchaenterprise/v1beta1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "recaptchaenterprise_java_gapic",
     src = ":recaptchaenterprise_proto_with_info",
     gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1beta1",
     service_yaml = "recaptchaenterprise_v1beta1.yaml",
     test_deps = [
@@ -180,6 +181,7 @@ py_gapic_library(
     name = "recaptchaenterprise_py_gapic",
     src = ":recaptchaenterprise_proto_with_info",
     gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1beta1",
     service_yaml = "recaptchaenterprise_v1beta1.yaml",
     deps = [
@@ -224,6 +226,7 @@ php_gapic_library(
     name = "recaptchaenterprise_php_gapic",
     src = ":recaptchaenterprise_proto_with_info",
     gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1beta1",
     service_yaml = "recaptchaenterprise_v1beta1.yaml",
     deps = [
@@ -254,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "recaptchaenterprise_nodejs_gapic",
     src = ":recaptchaenterprise_proto_with_info",
-    gapic_yaml = "recaptchaenterprise_gapic.yaml",
+    grpc_service_config = "recaptchaenterprise_grpc_service_config.json",
     package = "google.cloud.recaptchaenterprise.v1beta1",
     service_yaml = "recaptchaenterprise_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/recommendationengine/v1beta1/BUILD.bazel b/google/cloud/recommendationengine/v1beta1/BUILD.bazel
index f60a1cb14..864530a1e 100644
--- a/google/cloud/recommendationengine/v1beta1/BUILD.bazel
+++ b/google/cloud/recommendationengine/v1beta1/BUILD.bazel
@@ -81,7 +81,6 @@ java_proto_library(
     name = "recommendationengine_java_proto",
     deps = [
         ":recommendationengine_proto",
-        "//google/api:httpbody_proto",
     ],
 )
 
@@ -95,6 +94,7 @@ java_gapic_library(
     name = "recommendationengine_java_gapic",
     src = ":recommendationengine_proto_with_info",
     gapic_yaml = "recommendationengine_gapic.yaml",
+    grpc_service_config = "recommendationengine_grpc_service_config.json",
     package = "google.cloud.recommendationengine.v1beta1",
     service_yaml = "recommendationengine_v1beta1.yaml",
     test_deps = [
@@ -102,7 +102,7 @@ java_gapic_library(
     ],
     deps = [
         ":recommendationengine_java_proto",
-        "//google/api:httpbody_proto",
+        "//google/api:api_java_proto",
     ],
 )
 
@@ -154,7 +154,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
 )
@@ -211,6 +210,7 @@ py_gapic_library(
     name = "recommendationengine_py_gapic",
     src = ":recommendationengine_proto_with_info",
     gapic_yaml = "recommendationengine_gapic.yaml",
+    grpc_service_config = "recommendationengine_grpc_service_config.json",
     package = "google.cloud.recommendationengine.v1beta1",
     service_yaml = "recommendationengine_v1beta1.yaml",
     deps = [
@@ -244,6 +244,7 @@ php_gapic_library(
     name = "recommendationengine_php_gapic",
     src = ":recommendationengine_proto_with_info",
     gapic_yaml = "recommendationengine_gapic.yaml",
+    grpc_service_config = "recommendationengine_grpc_service_config.json",
     package = "google.cloud.recommendationengine.v1beta1",
     service_yaml = "recommendationengine_v1beta1.yaml",
     deps = [
@@ -265,7 +266,7 @@ php_gapic_assembly_pkg(
 nodejs_gapic_library(
     name = "recommendationengine_nodejs_gapic",
     src = ":recommendationengine_proto_with_info",
-    gapic_yaml = "recommendationengine_gapic.yaml",
+    grpc_service_config = "recommendationengine_grpc_service_config.json",
     package = "google.cloud.recommendationengine.v1beta1",
     service_yaml = "recommendationengine_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/recommendationengine/v1beta1/recommendationengine_gapic.yaml b/google/cloud/recommendationengine/v1beta1/recommendationengine_gapic.yaml
index 385c7da70..41ec59636 100644
--- a/google/cloud/recommendationengine/v1beta1/recommendationengine_gapic.yaml
+++ b/google/cloud/recommendationengine/v1beta1/recommendationengine_gapic.yaml
@@ -21,8 +21,6 @@ interfaces:
 # The fully qualified name of the API interface.
 - name: google.cloud.recommendationengine.v1beta1.CatalogService
   methods:
-  - name: DeleteCatalogItem
-    retry_codes_name: idempotent
   - name: ImportCatalogItems
     long_running:
       initial_poll_delay_millis: 500
@@ -31,9 +29,6 @@ interfaces:
       total_poll_timeout_millis: 300000
 
 - name: google.cloud.recommendationengine.v1beta1.PredictionApiKeyRegistry
-  methods:
-  - name: DeletePredictionApiKeyRegistration
-    retry_codes_name: idempotent
 
 - name: google.cloud.recommendationengine.v1beta1.PredictionService
 
diff --git a/google/cloud/recommendationengine/v1beta1/recommendationengine_grpc_service_config.json b/google/cloud/recommendationengine/v1beta1/recommendationengine_grpc_service_config.json
index f3516f741..048b5afc0 100644
--- a/google/cloud/recommendationengine/v1beta1/recommendationengine_grpc_service_config.json
+++ b/google/cloud/recommendationengine/v1beta1/recommendationengine_grpc_service_config.json
@@ -3,63 +3,63 @@
     {
       "name": [
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.CatalogService",
+          "service": "google.cloud.recommendationengine.v1beta1.CatalogService",
           "method": "CreateCatalogItem"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.CatalogService",
+          "service": "google.cloud.recommendationengine.v1beta1.CatalogService",
           "method": "GetCatalogItem"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.CatalogService",
+          "service": "google.cloud.recommendationengine.v1beta1.CatalogService",
           "method": "ListCatalogItems"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.CatalogService",
+          "service": "google.cloud.recommendationengine.v1beta1.CatalogService",
           "method": "UpdateCatalogItem"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.CatalogService",
+          "service": "google.cloud.recommendationengine.v1beta1.CatalogService",
           "method": "DeleteCatalogItem"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.CatalogService",
+          "service": "google.cloud.recommendationengine.v1beta1.CatalogService",
           "method": "ImportCatalogItems"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.PredictionApiKeyRegistry",
+          "service": "google.cloud.recommendationengine.v1beta1.PredictionApiKeyRegistry",
           "method": "CreatePredictionApiKeyRegistration"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.PredictionApiKeyRegistry",
+          "service": "google.cloud.recommendationengine.v1beta1.PredictionApiKeyRegistry",
           "method": "ListPredictionApiKeyRegistrations"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.PredictionApiKeyRegistry",
+          "service": "google.cloud.recommendationengine.v1beta1.PredictionApiKeyRegistry",
           "method": "DeletePredictionApiKeyRegistration"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.PredictionService",
+          "service": "google.cloud.recommendationengine.v1beta1.PredictionService",
           "method": "Predict"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.UserEventService",
+          "service": "google.cloud.recommendationengine.v1beta1.UserEventService",
           "method": "WriteUserEvent"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.UserEventService",
+          "service": "google.cloud.recommendationengine.v1beta1.UserEventService",
           "method": "CollectUserEvent"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.UserEventService",
+          "service": "google.cloud.recommendationengine.v1beta1.UserEventService",
           "method": "ListUserEvents"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.UserEventService",
+          "service": "google.cloud.recommendationengine.v1beta1.UserEventService",
           "method": "PurgeUserEvents"
         },
         {
-          "service": "com.google.cloud.recommendationengine.v1beta1.UserEventService",
+          "service": "google.cloud.recommendationengine.v1beta1.UserEventService",
           "method": "ImportUserEvents"
         }
       ],
diff --git a/google/cloud/recommender/v1/BUILD.bazel b/google/cloud/recommender/v1/BUILD.bazel
index 0ac31fe6f..13d3ae31e 100644
--- a/google/cloud/recommender/v1/BUILD.bazel
+++ b/google/cloud/recommender/v1/BUILD.bazel
@@ -62,6 +62,7 @@ java_gapic_library(
     name = "recommender_java_gapic",
     src = ":recommender_proto_with_info",
     gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1",
     service_yaml = "recommender_v1.yaml",
     test_deps = [
@@ -185,6 +186,7 @@ py_gapic_library(
     name = "recommender_py_gapic",
     src = ":recommender_proto_with_info",
     gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1",
     service_yaml = "recommender_v1.yaml",
     deps = [
@@ -229,6 +231,7 @@ php_gapic_library(
     name = "recommender_php_gapic",
     src = ":recommender_proto_with_info",
     gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1",
     service_yaml = "recommender_v1.yaml",
     deps = [
@@ -259,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "recommender_nodejs_gapic",
     src = ":recommender_proto_with_info",
-    gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1",
     service_yaml = "recommender_v1.yaml",
     deps = [],
diff --git a/google/cloud/recommender/v1beta1/BUILD.bazel b/google/cloud/recommender/v1beta1/BUILD.bazel
index 73a2466e1..c0a96b138 100644
--- a/google/cloud/recommender/v1beta1/BUILD.bazel
+++ b/google/cloud/recommender/v1beta1/BUILD.bazel
@@ -63,6 +63,7 @@ java_gapic_library(
     name = "recommender_java_gapic",
     src = ":recommender_proto_with_info",
     gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1beta1",
     service_yaml = "recommender_v1beta1.yaml",
     test_deps = [
@@ -186,6 +187,7 @@ py_gapic_library(
     name = "recommender_py_gapic",
     src = ":recommender_proto_with_info",
     gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1beta1",
     service_yaml = "recommender_v1beta1.yaml",
     deps = [
@@ -230,6 +232,7 @@ php_gapic_library(
     name = "recommender_php_gapic",
     src = ":recommender_proto_with_info",
     gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1beta1",
     service_yaml = "recommender_v1beta1.yaml",
     deps = [
@@ -260,7 +263,7 @@ load(
 nodejs_gapic_library(
     name = "recommender_nodejs_gapic",
     src = ":recommender_proto_with_info",
-    gapic_yaml = "recommender_gapic.yaml",
+    grpc_service_config = "recommender_grpc_service_config.json",
     package = "google.cloud.recommender.v1beta1",
     service_yaml = "recommender_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/redis/v1/BUILD.bazel b/google/cloud/redis/v1/BUILD.bazel
index dec68f01e..1cdf72691 100644
--- a/google/cloud/redis/v1/BUILD.bazel
+++ b/google/cloud/redis/v1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "redis_java_gapic",
     src = ":redis_proto_with_info",
     gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1",
     service_yaml = "redis_v1.yaml",
     test_deps = [
@@ -122,7 +123,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -185,6 +185,7 @@ py_gapic_library(
     name = "redis_py_gapic",
     src = ":redis_proto_with_info",
     gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1",
     service_yaml = "redis_v1.yaml",
     deps = [
@@ -229,6 +230,7 @@ php_gapic_library(
     name = "redis_php_gapic",
     src = ":redis_proto_with_info",
     gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1",
     service_yaml = "redis_v1.yaml",
     deps = [
@@ -259,7 +261,7 @@ load(
 nodejs_gapic_library(
     name = "redis_nodejs_gapic",
     src = ":redis_proto_with_info",
-    gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1",
     service_yaml = "redis_v1.yaml",
     deps = [],
diff --git a/google/cloud/redis/v1/cloud_redis.proto b/google/cloud/redis/v1/cloud_redis.proto
index 1b4669451..b98e1290d 100644
--- a/google/cloud/redis/v1/cloud_redis.proto
+++ b/google/cloud/redis/v1/cloud_redis.proto
@@ -75,7 +75,7 @@ service CloudRedis {
   // Creates a Redis instance based on the specified tier and memory size.
   //
   // By default, the instance is accessible from the project's
-  // [default network](/compute/docs/networks-and-firewalls#networks).
+  // [default network](https://cloud.google.com/vpc/docs/vpc).
   //
   // The creation is executed asynchronously and callers may check the returned
   // operation to track its progress. Once the operation is completed the Redis
@@ -340,7 +340,7 @@ message Instance {
   int32 memory_size_gb = 18 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. The full name of the Google Compute Engine
-  // [network](/compute/docs/networks-and-firewalls#networks) to which the
+  // [network](https://cloud.google.com/vpc/docs/vpc) to which the
   // instance is connected. If left unspecified, the `default` network
   // will be used.
   string authorized_network = 20 [(google.api.field_behavior) = OPTIONAL];
diff --git a/google/cloud/redis/v1/redis_gapic.yaml b/google/cloud/redis/v1/redis_gapic.yaml
index f94350faa..19840eb74 100644
--- a/google/cloud/redis/v1/redis_gapic.yaml
+++ b/google/cloud/redis/v1/redis_gapic.yaml
@@ -21,30 +21,7 @@ language_settings:
 interfaces:
 # The fully qualified name of the API interface.
 - name: google.cloud.redis.v1.CloudRedis
-  retry_codes_def:
-  - name: idempotent
-    retry_codes:
-    - DEADLINE_EXCEEDED
-    - UNAVAILABLE
-  - name: non_idempotent
-    retry_codes: []
-  # Definition for retry/backoff parameters.
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 20000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 20000
-    total_timeout_millis: 600000
   methods:
-  - name: ListInstances
-    retry_codes_name: non_idempotent
-    retry_params_name: default
-  - name: GetInstance
-    retry_codes_name: non_idempotent
-    retry_params_name: default
   - name: CreateInstance
     sample_code_init_fields:
     - instance_id="test_instance"
diff --git a/google/cloud/redis/v1beta1/BUILD.bazel b/google/cloud/redis/v1beta1/BUILD.bazel
index 4e4aac709..9cd6d842e 100644
--- a/google/cloud/redis/v1beta1/BUILD.bazel
+++ b/google/cloud/redis/v1beta1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "redis_java_gapic",
     src = ":redis_proto_with_info",
     gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1beta1",
     service_yaml = "redis_v1beta1.yaml",
     test_deps = [
@@ -122,7 +123,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
     ],
 )
@@ -186,6 +186,7 @@ py_gapic_library(
     name = "redis_py_gapic",
     src = ":redis_proto_with_info",
     gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1beta1",
     service_yaml = "redis_v1beta1.yaml",
     deps = [
@@ -230,6 +231,7 @@ php_gapic_library(
     name = "redis_php_gapic",
     src = ":redis_proto_with_info",
     gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1beta1",
     service_yaml = "redis_v1beta1.yaml",
     deps = [
@@ -260,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "redis_nodejs_gapic",
     src = ":redis_proto_with_info",
-    gapic_yaml = "redis_gapic.yaml",
+    grpc_service_config = "redis_grpc_service_config.json",
     package = "google.cloud.redis.v1beta1",
     service_yaml = "redis_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/redis/v1beta1/cloud_redis.proto b/google/cloud/redis/v1beta1/cloud_redis.proto
index 47d9a6fef..3eb99d8fe 100644
--- a/google/cloud/redis/v1beta1/cloud_redis.proto
+++ b/google/cloud/redis/v1beta1/cloud_redis.proto
@@ -75,7 +75,7 @@ service CloudRedis {
   // Creates a Redis instance based on the specified tier and memory size.
   //
   // By default, the instance is accessible from the project's
-  // [default network](/compute/docs/networks-and-firewalls#networks).
+  // [default network](https://cloud.google.com/vpc/docs/vpc).
   //
   // The creation is executed asynchronously and callers may check the returned
   // operation to track its progress. Once the operation is completed the Redis
@@ -354,7 +354,7 @@ message Instance {
   int32 memory_size_gb = 18 [(google.api.field_behavior) = REQUIRED];
 
   // Optional. The full name of the Google Compute Engine
-  // [network](/compute/docs/networks-and-firewalls#networks) to which the
+  // [network](https://cloud.google.com/vpc/docs/vpc) to which the
   // instance is connected. If left unspecified, the `default` network
   // will be used.
   string authorized_network = 20 [(google.api.field_behavior) = OPTIONAL];
diff --git a/google/cloud/redis/v1beta1/redis_gapic.yaml b/google/cloud/redis/v1beta1/redis_gapic.yaml
index a6844b243..fddfed254 100644
--- a/google/cloud/redis/v1beta1/redis_gapic.yaml
+++ b/google/cloud/redis/v1beta1/redis_gapic.yaml
@@ -20,30 +20,7 @@ language_settings:
 interfaces:
 # The fully qualified name of the API interface.
 - name: google.cloud.redis.v1beta1.CloudRedis
-  retry_codes_def:
-  - name: idempotent
-    retry_codes:
-    - DEADLINE_EXCEEDED
-    - UNAVAILABLE
-  - name: non_idempotent
-    retry_codes: []
-  # Definition for retry/backoff parameters.
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 20000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 20000
-    total_timeout_millis: 600000
   methods:
-  - name: ListInstances
-    retry_codes_name: non_idempotent
-    retry_params_name: default
-  - name: GetInstance
-    retry_codes_name: non_idempotent
-    retry_params_name: default
   - name: CreateInstance
     sample_code_init_fields:
     - instance_id="test_instance"
diff --git a/google/cloud/scheduler/v1/BUILD.bazel b/google/cloud/scheduler/v1/BUILD.bazel
index 7c1d2ccfa..626cdff92 100644
--- a/google/cloud/scheduler/v1/BUILD.bazel
+++ b/google/cloud/scheduler/v1/BUILD.bazel
@@ -64,6 +64,7 @@ java_gapic_library(
     name = "scheduler_java_gapic",
     src = ":scheduler_proto_with_info",
     gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1",
     service_yaml = "cloudscheduler_v1.yaml",
     test_deps = [
@@ -187,6 +188,7 @@ py_gapic_library(
     name = "scheduler_py_gapic",
     src = ":scheduler_proto_with_info",
     gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1",
     service_yaml = "cloudscheduler_v1.yaml",
     deps = [
@@ -231,6 +233,7 @@ php_gapic_library(
     name = "scheduler_php_gapic",
     src = ":scheduler_proto_with_info",
     gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1",
     service_yaml = "cloudscheduler_v1.yaml",
     deps = [
@@ -261,7 +264,7 @@ load(
 nodejs_gapic_library(
     name = "scheduler_nodejs_gapic",
     src = ":scheduler_proto_with_info",
-    gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1",
     service_yaml = "cloudscheduler_v1.yaml",
     deps = [],
diff --git a/google/cloud/scheduler/v1/cloudscheduler_gapic.yaml b/google/cloud/scheduler/v1/cloudscheduler_gapic.yaml
index be8c0d404..800e2e69c 100644
--- a/google/cloud/scheduler/v1/cloudscheduler_gapic.yaml
+++ b/google/cloud/scheduler/v1/cloudscheduler_gapic.yaml
@@ -22,6 +22,3 @@ language_settings:
     domain_layer_location: google-cloud
 interfaces:
 - name: google.cloud.scheduler.v1.CloudScheduler
-  methods:
-  - name: DeleteJob
-    retry_codes_name: idempotent
diff --git a/google/cloud/scheduler/v1beta1/BUILD.bazel b/google/cloud/scheduler/v1beta1/BUILD.bazel
index 617077d96..da4c99418 100644
--- a/google/cloud/scheduler/v1beta1/BUILD.bazel
+++ b/google/cloud/scheduler/v1beta1/BUILD.bazel
@@ -64,6 +64,7 @@ java_gapic_library(
     name = "scheduler_java_gapic",
     src = ":scheduler_proto_with_info",
     gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1beta1",
     service_yaml = "cloudscheduler_v1beta1.yaml",
     test_deps = [
@@ -187,6 +188,7 @@ py_gapic_library(
     name = "scheduler_py_gapic",
     src = ":scheduler_proto_with_info",
     gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1beta1",
     service_yaml = "cloudscheduler_v1beta1.yaml",
     deps = [
@@ -231,6 +233,7 @@ php_gapic_library(
     name = "scheduler_php_gapic",
     src = ":scheduler_proto_with_info",
     gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1beta1",
     service_yaml = "cloudscheduler_v1beta1.yaml",
     deps = [
@@ -261,7 +264,7 @@ load(
 nodejs_gapic_library(
     name = "scheduler_nodejs_gapic",
     src = ":scheduler_proto_with_info",
-    gapic_yaml = "cloudscheduler_gapic.yaml",
+    grpc_service_config = "cloudscheduler_grpc_service_config.json",
     package = "google.cloud.scheduler.v1beta1",
     service_yaml = "cloudscheduler_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/scheduler/v1beta1/cloudscheduler_gapic.yaml b/google/cloud/scheduler/v1beta1/cloudscheduler_gapic.yaml
index c2d196bb6..47353c693 100644
--- a/google/cloud/scheduler/v1beta1/cloudscheduler_gapic.yaml
+++ b/google/cloud/scheduler/v1beta1/cloudscheduler_gapic.yaml
@@ -19,10 +19,3 @@ language_settings:
     domain_layer_location: google-cloud
 interfaces:
 - name: google.cloud.scheduler.v1beta1.CloudScheduler
-  methods:
-  - name: DeleteJob
-    retry_codes_name: idempotent
-  - name: PauseJob
-    retry_codes_name: idempotent
-  - name: ResumeJob
-    retry_codes_name: idempotent
diff --git a/google/cloud/secretmanager/v1/BUILD.bazel b/google/cloud/secretmanager/v1/BUILD.bazel
index 9fbe04c97..63f8b82a1 100644
--- a/google/cloud/secretmanager/v1/BUILD.bazel
+++ b/google/cloud/secretmanager/v1/BUILD.bazel
@@ -63,6 +63,7 @@ java_gapic_library(
     name = "secretmanager_java_gapic",
     src = ":secretmanager_proto_with_info",
     gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secretmanager.v1",
     service_yaml = "secretmanager_v1.yaml",
     test_deps = [
@@ -189,6 +190,7 @@ py_gapic_library(
     name = "secretmanager_py_gapic",
     src = ":secretmanager_proto_with_info",
     gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secretmanager.v1",
     service_yaml = "secretmanager_v1.yaml",
     deps = [
@@ -233,6 +235,7 @@ php_gapic_library(
     name = "secretmanager_php_gapic",
     src = ":secretmanager_proto_with_info",
     gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secretmanager.v1",
     service_yaml = "secretmanager_v1.yaml",
     deps = [
@@ -263,7 +266,7 @@ load(
 nodejs_gapic_library(
     name = "secretmanager_nodejs_gapic",
     src = ":secretmanager_proto_with_info",
-    gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secretmanager.v1",
     service_yaml = "secretmanager_v1.yaml",
     deps = [],
diff --git a/google/cloud/secrets/v1beta1/BUILD.bazel b/google/cloud/secrets/v1beta1/BUILD.bazel
index 01128a1d3..004c5fe39 100644
--- a/google/cloud/secrets/v1beta1/BUILD.bazel
+++ b/google/cloud/secrets/v1beta1/BUILD.bazel
@@ -61,6 +61,7 @@ java_gapic_library(
     name = "secretmanager_java_gapic",
     src = ":secretmanager_proto_with_info",
     gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secrets.v1beta1",
     service_yaml = "//google/cloud/secrets/v1beta1:secretmanager_v1beta1.yaml",
     test_deps = [
@@ -187,6 +188,7 @@ py_gapic_library(
     name = "secretmanager_py_gapic",
     src = ":secretmanager_proto_with_info",
     gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secrets.v1beta1",
     service_yaml = "//google/cloud/secrets/v1beta1:secretmanager_v1beta1.yaml",
     deps = [
@@ -231,6 +233,7 @@ php_gapic_library(
     name = "secretmanager_php_gapic",
     src = ":secretmanager_proto_with_info",
     gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secrets.v1beta1",
     service_yaml = "//google/cloud/secrets/v1beta1:secretmanager_v1beta1.yaml",
     deps = [
@@ -261,7 +264,7 @@ load(
 nodejs_gapic_library(
     name = "secretmanager_nodejs_gapic",
     src = ":secretmanager_proto_with_info",
-    gapic_yaml = "secretmanager_gapic.yaml",
+    grpc_service_config = "secretmanager_grpc_service_config.json",
     package = "google.cloud.secrets.v1beta1",
     service_yaml = "//google/cloud/secrets/v1beta1:secretmanager_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/securitycenter/settings/v1beta1/BUILD.bazel b/google/cloud/securitycenter/settings/v1beta1/BUILD.bazel
index 08abb81c3..a7922a936 100644
--- a/google/cloud/securitycenter/settings/v1beta1/BUILD.bazel
+++ b/google/cloud/securitycenter/settings/v1beta1/BUILD.bazel
@@ -65,6 +65,7 @@ java_gapic_library(
     name = "settings_java_gapic",
     src = ":settings_proto_with_info",
     gapic_yaml = "securitycenter_settings_gapic.yaml",
+    grpc_service_config = "securitycenter_settings_grpc_service_config.json",
     package = "google.cloud.securitycenter.settings.v1beta1",
     service_yaml = "securitycenter_settings.yaml",
     test_deps = [
@@ -185,6 +186,7 @@ py_gapic_library(
     name = "settings_py_gapic",
     src = ":settings_proto_with_info",
     gapic_yaml = "securitycenter_settings_gapic.yaml",
+    grpc_service_config = "securitycenter_settings_grpc_service_config.json",
     package = "google.cloud.securitycenter.settings.v1beta1",
     service_yaml = "securitycenter_settings.yaml",
     deps = [
@@ -229,6 +231,7 @@ php_gapic_library(
     name = "settings_php_gapic",
     src = ":settings_proto_with_info",
     gapic_yaml = "securitycenter_settings_gapic.yaml",
+    grpc_service_config = "securitycenter_settings_grpc_service_config.json",
     package = "google.cloud.securitycenter.settings.v1beta1",
     service_yaml = "securitycenter_settings.yaml",
     deps = [
@@ -259,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "settings_nodejs_gapic",
     src = ":settings_proto_with_info",
-    gapic_yaml = "securitycenter_settings_gapic.yaml",
+    grpc_service_config = "securitycenter_settings_grpc_service_config.json",
     package = "google.cloud.securitycenter.settings.v1beta1",
     service_yaml = "securitycenter_settings.yaml",
     deps = [],
diff --git a/google/cloud/securitycenter/v1/BUILD.bazel b/google/cloud/securitycenter/v1/BUILD.bazel
index 4b1154c97..cfed87616 100644
--- a/google/cloud/securitycenter/v1/BUILD.bazel
+++ b/google/cloud/securitycenter/v1/BUILD.bazel
@@ -17,6 +17,7 @@ proto_library(
         "notification_config.proto",
         "notification_message.proto",
         "organization_settings.proto",
+        "resource.proto",
         "run_asset_discovery_response.proto",
         "security_marks.proto",
         "securitycenter_service.proto",
@@ -136,10 +137,9 @@ go_gapic_library(
     deps = [
         ":securitycenter_go_proto",
         "//google/iam/v1:iam_go_proto",
-        "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
-        "@com_google_cloud_go//longrunning:go_default_library",
         "@com_google_cloud_go//longrunning/autogen:go_default_library",
+        "@com_google_cloud_go//longrunning:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
@@ -283,7 +283,7 @@ load(
 nodejs_gapic_library(
     name = "securitycenter_nodejs_gapic",
     src = ":securitycenter_proto_with_info",
-    gapic_yaml = "securitycenter_gapic.yaml",
+    grpc_service_config = "securitycenter_grpc_service_config.json",
     package = "google.cloud.securitycenter.v1",
     service_yaml = "securitycenter_v1.yaml",
     deps = [],
diff --git a/google/cloud/securitycenter/v1/asset.proto b/google/cloud/securitycenter/v1/asset.proto
index b079e5c5d..eb07c0493 100644
--- a/google/cloud/securitycenter/v1/asset.proto
+++ b/google/cloud/securitycenter/v1/asset.proto
@@ -29,30 +29,31 @@ option java_package = "com.google.cloud.securitycenter.v1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1";
 
-// Cloud Security Command Center's (Cloud SCC) representation of a Google Cloud
-// Platform (GCP) resource.
+// Security Command Center representation of a Google Cloud
+// resource.
 //
-// The Asset is a Cloud SCC resource that captures information about a single
-// GCP resource. All modifications to an Asset are only within the context of
-// Cloud SCC and don't affect the referenced GCP resource.
+// The Asset is a Security Command Center resource that captures information
+// about a single Google Cloud resource. All modifications to an Asset are only
+// within the context of Security Command Center and don't affect the referenced
+// Google Cloud resource.
 message Asset {
   option (google.api.resource) = {
     type: "securitycenter.googleapis.com/Asset"
     pattern: "organizations/{organization}/assets/{asset}"
   };
 
-  // Cloud SCC managed properties. These properties are managed by Cloud SCC and
-  // cannot be modified by the user.
+  // Security Command Center managed properties. These properties are managed by
+  // Security Command Center and cannot be modified by the user.
   message SecurityCenterProperties {
-    // The full resource name of the GCP resource this asset
+    // The full resource name of the Google Cloud resource this asset
     // represents. This field is immutable after create time. See:
     // https://cloud.google.com/apis/design/resource_names#full_resource_name
     string resource_name = 1;
 
-    // The type of the GCP resource. Examples include: APPLICATION,
+    // The type of the Google Cloud resource. Examples include: APPLICATION,
     // PROJECT, and ORGANIZATION. This is a case insensitive field defined by
-    // Cloud SCC and/or the producer of the resource and is immutable
-    // after create time.
+    // Security Command Center and/or the producer of the resource and is
+    // immutable after create time.
     string resource_type = 2;
 
     // The full resource name of the immediate parent of the resource. See:
@@ -76,9 +77,10 @@ message Asset {
     string resource_project_display_name = 8;
   }
 
-  // IAM Policy information associated with the GCP resource described by the
-  // Cloud SCC asset. This information is managed and defined by the GCP
-  // resource and cannot be modified by the user.
+  // Cloud IAM Policy information associated with the Google Cloud resource
+  // described by the Security Command Center asset. This information is managed
+  // and defined by the Google Cloud resource and cannot be modified by the
+  // user.
   message IamPolicy {
     // The JSON representation of the Policy associated with the asset.
     // See https://cloud.google.com/iam/reference/rest/v1/Policy for format
@@ -92,27 +94,28 @@ message Asset {
   // "organizations/{organization_id}/assets/{asset_id}".
   string name = 1;
 
-  // Cloud SCC managed properties. These properties are managed by
-  // Cloud SCC and cannot be modified by the user.
+  // Security Command Center managed properties. These properties are managed by
+  // Security Command Center and cannot be modified by the user.
   SecurityCenterProperties security_center_properties = 2;
 
   // Resource managed properties. These properties are managed and defined by
-  // the GCP resource and cannot be modified by the user.
+  // the Google Cloud resource and cannot be modified by the user.
   map resource_properties = 7;
 
   // User specified security marks. These marks are entirely managed by the user
   // and come from the SecurityMarks resource that belongs to the asset.
   SecurityMarks security_marks = 8;
 
-  // The time at which the asset was created in Cloud SCC.
+  // The time at which the asset was created in Security Command Center.
   google.protobuf.Timestamp create_time = 9;
 
-  // The time at which the asset was last updated, added, or deleted in Cloud
-  // SCC.
+  // The time at which the asset was last updated, added, or deleted in Security
+  // Command Center.
   google.protobuf.Timestamp update_time = 10;
 
-  // IAM Policy information associated with the GCP resource described by the
-  // Cloud SCC asset. This information is managed and defined by the GCP
-  // resource and cannot be modified by the user.
+  // Cloud IAM Policy information associated with the Google Cloud resource
+  // described by the Security Command Center asset. This information is managed
+  // and defined by the Google Cloud resource and cannot be modified by the
+  // user.
   IamPolicy iam_policy = 11;
 }
diff --git a/google/cloud/securitycenter/v1/finding.proto b/google/cloud/securitycenter/v1/finding.proto
index 9a3261c4c..4ccdc495c 100644
--- a/google/cloud/securitycenter/v1/finding.proto
+++ b/google/cloud/securitycenter/v1/finding.proto
@@ -30,11 +30,11 @@ option java_package = "com.google.cloud.securitycenter.v1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1";
 
-// Cloud Security Command Center (Cloud SCC) finding.
+// Security Command Center finding.
 //
 // A finding is a record of assessment data like security, risk, health, or
-// privacy, that is ingested into Cloud SCC for presentation, notification,
-// analysis, policy testing, and enforcement. For example, a
+// privacy, that is ingested into Security Command Center for presentation,
+// notification, analysis, policy testing, and enforcement. For example, a
 // cross-site scripting (XSS) vulnerability in an App Engine application is a
 // finding.
 message Finding {
@@ -69,12 +69,12 @@ message Finding {
   // "organizations/{organization_id}/sources/{source_id}"
   string parent = 2;
 
-  // For findings on Google Cloud Platform (GCP) resources, the full resource
-  // name of the GCP resource this finding is for. See:
+  // For findings on Google Cloud resources, the full resource
+  // name of the Google Cloud resource this finding is for. See:
   // https://cloud.google.com/apis/design/resource_names#full_resource_name
-  // When the finding is for a non-GCP resource, the resourceName can be a
-  // customer or partner defined string.
-  // This field is immutable after creation time.
+  // When the finding is for a non-Google Cloud resource, the resourceName can
+  // be a customer or partner defined string. This field is immutable after
+  // creation time.
   string resource_name = 3;
 
   // The state of the finding.
@@ -85,9 +85,9 @@ message Finding {
   // Example: "XSS_FLASH_INJECTION"
   string category = 5;
 
-  // The URI that, if available, points to a web page outside of Cloud SCC
-  // where additional information about the finding can be found. This field is
-  // guaranteed to be either empty or a well formed URL.
+  // The URI that, if available, points to a web page outside of Security
+  // Command Center where additional information about the finding can be found.
+  // This field is guaranteed to be either empty or a well formed URL.
   string external_uri = 6;
 
   // Source specific properties. These properties are managed by the source
@@ -106,6 +106,6 @@ message Finding {
   // the firewall became open. The accuracy is determined by the detector.
   google.protobuf.Timestamp event_time = 9;
 
-  // The time at which the finding was created in Cloud SCC.
+  // The time at which the finding was created in Security Command Center.
   google.protobuf.Timestamp create_time = 10;
 }
diff --git a/google/cloud/securitycenter/v1/notification_message.proto b/google/cloud/securitycenter/v1/notification_message.proto
index b9dfb171b..08b6b7c88 100644
--- a/google/cloud/securitycenter/v1/notification_message.proto
+++ b/google/cloud/securitycenter/v1/notification_message.proto
@@ -18,6 +18,7 @@ package google.cloud.securitycenter.v1;
 
 import "google/api/annotations.proto";
 import "google/cloud/securitycenter/v1/finding.proto";
+import "google/cloud/securitycenter/v1/resource.proto";
 
 option csharp_namespace = "Google.Cloud.SecurityCenter.V1";
 option go_package = "google.golang.org/genproto/googleapis/cloud/securitycenter/v1;securitycenter";
@@ -38,4 +39,7 @@ message NotificationMessage {
     // populated.
     Finding finding = 2;
   }
+
+  // The Cloud resource tied to this notification's Finding.
+  Resource resource = 3;
 }
diff --git a/google/cloud/securitycenter/v1/organization_settings.proto b/google/cloud/securitycenter/v1/organization_settings.proto
index d9d9aed79..66b659bc5 100644
--- a/google/cloud/securitycenter/v1/organization_settings.proto
+++ b/google/cloud/securitycenter/v1/organization_settings.proto
@@ -26,8 +26,8 @@ option java_package = "com.google.cloud.securitycenter.v1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1";
 
-// User specified settings that are attached to the Cloud Security Command
-// Center (Cloud SCC) organization.
+// User specified settings that are attached to the Security Command
+// Center organization.
 message OrganizationSettings {
   option (google.api.resource) = {
     type: "securitycenter.googleapis.com/OrganizationSettings"
diff --git a/google/cloud/securitycenter/v1/resource.proto b/google/cloud/securitycenter/v1/resource.proto
new file mode 100644
index 000000000..855e69737
--- /dev/null
+++ b/google/cloud/securitycenter/v1/resource.proto
@@ -0,0 +1,46 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.securitycenter.v1;
+
+import "google/api/annotations.proto";
+
+option csharp_namespace = "Google.Cloud.SecurityCenter.V1";
+option go_package = "google.golang.org/genproto/googleapis/cloud/securitycenter/v1;securitycenter";
+option java_multiple_files = true;
+option java_outer_classname = "ResourceProto";
+option java_package = "com.google.cloud.securitycenter.v1";
+option php_namespace = "Google\\Cloud\\SecurityCenter\\V1";
+option ruby_package = "Google::Cloud::SecurityCenter::V1";
+
+// Information related to the Google Cloud resource.
+message Resource {
+  // The full resource name of the resource. See:
+  // https://cloud.google.com/apis/design/resource_names#full_resource_name
+  string name = 1;
+
+  // The full resource name of project that the resource belongs to.
+  string project = 2;
+
+  // The human readable name of project that the resource belongs to.
+  string project_display_name = 3;
+
+  // The full resource name of resource's parent.
+  string parent = 4;
+
+  // The human readable name of resource's parent.
+  string parent_display_name = 5;
+}
diff --git a/google/cloud/securitycenter/v1/security_marks.proto b/google/cloud/securitycenter/v1/security_marks.proto
index 229aff32d..47a4a150b 100644
--- a/google/cloud/securitycenter/v1/security_marks.proto
+++ b/google/cloud/securitycenter/v1/security_marks.proto
@@ -26,9 +26,9 @@ option java_package = "com.google.cloud.securitycenter.v1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1";
 
-// User specified security marks that are attached to the parent Cloud Security
-// Command Center (Cloud SCC) resource. Security marks are scoped within a Cloud
-// SCC organization -- they can be modified and viewed by all users who have
+// User specified security marks that are attached to the parent Security
+// Command Center resource. Security marks are scoped within a Security Command
+// Center organization -- they can be modified and viewed by all users who have
 // proper permissions on the organization.
 message SecurityMarks {
   option (google.api.resource) = {
diff --git a/google/cloud/securitycenter/v1/securitycenter_service.proto b/google/cloud/securitycenter/v1/securitycenter_service.proto
index bb9a82849..b660d4674 100644
--- a/google/cloud/securitycenter/v1/securitycenter_service.proto
+++ b/google/cloud/securitycenter/v1/securitycenter_service.proto
@@ -240,8 +240,8 @@ service SecurityCenter {
     option (google.api.method_signature) = "finding";
   }
 
-  //
-  // Updates a notification config.
+  // Updates a notification config. The following update
+  // fields are allowed: description, pubsub_topic, streaming_config.filter
   rpc UpdateNotificationConfig(UpdateNotificationConfigRequest)
       returns (NotificationConfig) {
     option (google.api.http) = {
@@ -438,15 +438,15 @@ message GroupAssetsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "update_time = \"2019-06-10T16:07:18-07:00\""
-  //     "update_time = 1560208038000"
+  //     `update_time = "2019-06-10T16:07:18-07:00"`
+  //     `update_time = 1560208038000`
   //
   // * create_time: `=`, `>`, `<`, `>=`, `<=`
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "create_time = \"2019-06-10T16:07:18-07:00\""
-  //     "create_time = 1560208038000"
+  //     `create_time = "2019-06-10T16:07:18-07:00"`
+  //     `create_time = 1560208038000`
   //
   // * iam_policy.policy_blob: `=`, `:`
   // * resource_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
@@ -461,6 +461,12 @@ message GroupAssetsRequest {
   // * security_center_properties.resource_owners: `=`, `:`
   //
   // For example, `resource_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing:`resource_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-resource_properties.my_property : ""`
   string filter = 2;
 
   // Required. Expression that defines what assets fields to use for grouping.
@@ -595,13 +601,19 @@ message GroupFindingsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "event_time = \"2019-06-10T16:07:18-07:00\""
-  //     "event_time = 1560208038000"
+  //     `event_time = "2019-06-10T16:07:18-07:00"`
+  //     `event_time = 1560208038000`
   //
   // * security_marks.marks: `=`, `:`
   // * source_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
   //
   // For example, `source_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing: `source_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-source_properties.my_property : ""`
   string filter = 2;
 
   // Required. Expression that defines what assets fields to use for grouping
@@ -803,15 +815,15 @@ message ListAssetsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "update_time = \"2019-06-10T16:07:18-07:00\""
-  //     "update_time = 1560208038000"
+  //     `update_time = "2019-06-10T16:07:18-07:00"`
+  //     `update_time = 1560208038000`
   //
   // * create_time: `=`, `>`, `<`, `>=`, `<=`
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "create_time = \"2019-06-10T16:07:18-07:00\""
-  //     "create_time = 1560208038000"
+  //     `create_time = "2019-06-10T16:07:18-07:00"`
+  //     `create_time = 1560208038000`
   //
   // * iam_policy.policy_blob: `=`, `:`
   // * resource_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
@@ -826,6 +838,12 @@ message ListAssetsRequest {
   // * security_center_properties.resource_owners: `=`, `:`
   //
   // For example, `resource_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing: `resource_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-resource_properties.my_property : ""`
   string filter = 2;
 
   // Expression that defines what fields and order to use for sorting. The
@@ -992,13 +1010,19 @@ message ListFindingsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "event_time = \"2019-06-10T16:07:18-07:00\""
-  //     "event_time = 1560208038000"
+  //     `event_time = "2019-06-10T16:07:18-07:00"`
+  //     `event_time = 1560208038000`
   //
   // security_marks.marks: `=`, `:`
   // source_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
   //
   // For example, `source_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing: `source_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-source_properties.my_property : ""`
   string filter = 2;
 
   // Expression that defines what fields and order to use for sorting. The
@@ -1078,7 +1102,7 @@ message ListFindingsRequest {
 message ListFindingsResponse {
   // Result containing the Finding and its StateChange.
   message ListFindingsResult {
-    // Information related to the Google Cloud Platform (GCP) resource that is
+    // Information related to the Google Cloud resource that is
     // associated with this finding.
     message Resource {
       // The full resource name of the resource. See:
diff --git a/google/cloud/securitycenter/v1/securitycenter_v1.yaml b/google/cloud/securitycenter/v1/securitycenter_v1.yaml
index 52db2f613..662ae2b68 100644
--- a/google/cloud/securitycenter/v1/securitycenter_v1.yaml
+++ b/google/cloud/securitycenter/v1/securitycenter_v1.yaml
@@ -1,19 +1,20 @@
 type: google.api.Service
 config_version: 3
 name: securitycenter.googleapis.com
-title: Cloud Security Command Center API
+title: Security Command Center API
 
 apis:
 - name: google.cloud.securitycenter.v1.SecurityCenter
 
 types:
 - name: google.cloud.securitycenter.v1.NotificationMessage
+- name: google.cloud.securitycenter.v1.Resource
 - name: google.cloud.securitycenter.v1.RunAssetDiscoveryResponse
 
 documentation:
   summary: |-
-    Cloud Security Command Center API provides access to temporal views of
-    assets and findings within an organization.
+    Security Command Center API provides access to temporal views of assets and
+    findings within an organization.
 
 backend:
   rules:
diff --git a/google/cloud/securitycenter/v1/source.proto b/google/cloud/securitycenter/v1/source.proto
index 6fca821b8..e7b1a1835 100644
--- a/google/cloud/securitycenter/v1/source.proto
+++ b/google/cloud/securitycenter/v1/source.proto
@@ -26,7 +26,7 @@ option java_package = "com.google.cloud.securitycenter.v1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1";
 
-// Cloud Security Command Center's (Cloud SCC) finding source. A finding source
+// Security Command Center finding source. A finding source
 // is an entity or a mechanism that can produce a finding. A source is like a
 // container of findings that come from the same scanner, logger, monitor, and
 // other tools.
diff --git a/google/cloud/securitycenter/v1beta1/BUILD.bazel b/google/cloud/securitycenter/v1beta1/BUILD.bazel
index 2891e7af6..fee195a9e 100644
--- a/google/cloud/securitycenter/v1beta1/BUILD.bazel
+++ b/google/cloud/securitycenter/v1beta1/BUILD.bazel
@@ -137,7 +137,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
@@ -281,7 +280,7 @@ load(
 nodejs_gapic_library(
     name = "securitycenter_nodejs_gapic",
     src = ":securitycenter_proto_with_info",
-    gapic_yaml = "securitycenter_gapic.yaml",
+    grpc_service_config = "securitycenter_grpc_service_config.json",
     package = "google.cloud.securitycenter.v1beta1",
     service_yaml = "securitycenter_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/securitycenter/v1p1beta1/BUILD.bazel b/google/cloud/securitycenter/v1p1beta1/BUILD.bazel
index 4bfe84008..3c65c6ac8 100644
--- a/google/cloud/securitycenter/v1p1beta1/BUILD.bazel
+++ b/google/cloud/securitycenter/v1p1beta1/BUILD.bazel
@@ -17,6 +17,7 @@ proto_library(
         "notification_config.proto",
         "notification_message.proto",
         "organization_settings.proto",
+        "resource.proto",
         "run_asset_discovery_response.proto",
         "security_marks.proto",
         "securitycenter_service.proto",
@@ -136,10 +137,9 @@ go_gapic_library(
     deps = [
         ":securitycenter_go_proto",
         "//google/iam/v1:iam_go_proto",
-        "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
-        "@com_google_cloud_go//longrunning:go_default_library",
         "@com_google_cloud_go//longrunning/autogen:go_default_library",
+        "@com_google_cloud_go//longrunning:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
         "@io_bazel_rules_go//proto/wkt:struct_go_proto",
     ],
@@ -283,7 +283,7 @@ load(
 nodejs_gapic_library(
     name = "securitycenter_nodejs_gapic",
     src = ":securitycenter_proto_with_info",
-    gapic_yaml = "securitycenter_gapic.yaml",
+    grpc_service_config = "securitycenter_grpc_service_config.json",
     package = "google.cloud.securitycenter.v1p1beta1",
     service_yaml = "securitycenter_v1p1beta1.yaml",
     deps = [],
diff --git a/google/cloud/securitycenter/v1p1beta1/asset.proto b/google/cloud/securitycenter/v1p1beta1/asset.proto
index aaa18bcba..bfcae3688 100644
--- a/google/cloud/securitycenter/v1p1beta1/asset.proto
+++ b/google/cloud/securitycenter/v1p1beta1/asset.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -30,30 +29,31 @@ option java_package = "com.google.cloud.securitycenter.v1p1beta1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
 
-// Cloud Security Command Center's (Cloud SCC) representation of a Google Cloud
-// Platform (GCP) resource.
+// Security Command Center representation of a Google Cloud
+// resource.
 //
-// The Asset is a Cloud SCC resource that captures information about a single
-// GCP resource. All modifications to an Asset are only within the context of
-// Cloud SCC and don't affect the referenced GCP resource.
+// The Asset is a Security Command Center resource that captures information
+// about a single Google Cloud resource. All modifications to an Asset are only
+// within the context of Security Command Center and don't affect the referenced
+// Google Cloud resource.
 message Asset {
   option (google.api.resource) = {
     type: "securitycenter.googleapis.com/Asset"
     pattern: "organizations/{organization}/assets/{asset}"
   };
 
-  // Cloud SCC managed properties. These properties are managed by Cloud SCC and
-  // cannot be modified by the user.
+  // Security Command Center managed properties. These properties are managed by
+  // Security Command Center and cannot be modified by the user.
   message SecurityCenterProperties {
-    // The full resource name of the GCP resource this asset
+    // The full resource name of the Google Cloud resource this asset
     // represents. This field is immutable after create time. See:
     // https://cloud.google.com/apis/design/resource_names#full_resource_name
     string resource_name = 1;
 
-    // The type of the GCP resource. Examples include: APPLICATION,
+    // The type of the Google Cloud resource. Examples include: APPLICATION,
     // PROJECT, and ORGANIZATION. This is a case insensitive field defined by
-    // Cloud SCC and/or the producer of the resource and is immutable
-    // after create time.
+    // Security Command Center and/or the producer of the resource and is
+    // immutable after create time.
     string resource_type = 2;
 
     // The full resource name of the immediate parent of the resource. See:
@@ -77,12 +77,13 @@ message Asset {
     string resource_project_display_name = 8;
   }
 
-  // IAM Policy information associated with the GCP resource described by the
-  // Cloud SCC asset. This information is managed and defined by the GCP
-  // resource and cannot be modified by the user.
+  // Cloud IAM Policy information associated with the Google Cloud resource
+  // described by the Security Command Center asset. This information is managed
+  // and defined by the Google Cloud resource and cannot be modified by the
+  // user.
   message IamPolicy {
     // The JSON representation of the Policy associated with the asset.
-    // See https://cloud.google.com/iam/reference/rest/v1/Policy for
+    // See https://cloud.google.com/iam/docs/reference/rest/v1/Policy for
     // format details.
     string policy_blob = 1;
   }
@@ -93,27 +94,28 @@ message Asset {
   // "organizations/{organization_id}/assets/{asset_id}".
   string name = 1;
 
-  // Cloud SCC managed properties. These properties are managed by
-  // Cloud SCC and cannot be modified by the user.
+  // Security Command Center managed properties. These properties are managed by
+  // Security Command Center and cannot be modified by the user.
   SecurityCenterProperties security_center_properties = 2;
 
   // Resource managed properties. These properties are managed and defined by
-  // the GCP resource and cannot be modified by the user.
+  // the Google Cloud resource and cannot be modified by the user.
   map resource_properties = 7;
 
   // User specified security marks. These marks are entirely managed by the user
   // and come from the SecurityMarks resource that belongs to the asset.
   SecurityMarks security_marks = 8;
 
-  // The time at which the asset was created in Cloud SCC.
+  // The time at which the asset was created in Security Command Center.
   google.protobuf.Timestamp create_time = 9;
 
   // The time at which the asset was last updated, added, or deleted in Cloud
   // SCC.
   google.protobuf.Timestamp update_time = 10;
 
-  // IAM Policy information associated with the GCP resource described by the
-  // Cloud SCC asset. This information is managed and defined by the GCP
-  // resource and cannot be modified by the user.
+  // Cloud IAM Policy information associated with the Google Cloud resource
+  // described by the Security Command Center asset. This information is managed
+  // and defined by the Google Cloud resource and cannot be modified by the
+  // user.
   IamPolicy iam_policy = 11;
 }
diff --git a/google/cloud/securitycenter/v1p1beta1/finding.proto b/google/cloud/securitycenter/v1p1beta1/finding.proto
index 6428027df..21b655362 100644
--- a/google/cloud/securitycenter/v1p1beta1/finding.proto
+++ b/google/cloud/securitycenter/v1p1beta1/finding.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -31,12 +30,12 @@ option java_package = "com.google.cloud.securitycenter.v1p1beta1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
 
-// Cloud Security Command Center (Cloud SCC) finding.
+// Security Command Center finding.
 //
 // A finding is a record of assessment data (security, risk, health or privacy)
-// ingested into Cloud SCC for presentation, notification, analysis,
-// policy testing, and enforcement. For example, an XSS vulnerability in an
-// App Engine application is a finding.
+// ingested into Security Command Center for presentation, notification,
+// analysis, policy testing, and enforcement. For example, an XSS vulnerability
+// in an App Engine application is a finding.
 message Finding {
   option (google.api.resource) = {
     type: "securitycenter.googleapis.com/Finding"
@@ -69,12 +68,12 @@ message Finding {
   // "organizations/{organization_id}/sources/{source_id}"
   string parent = 2;
 
-  // For findings on Google Cloud Platform (GCP) resources, the full resource
-  // name of the GCP resource this finding is for. See:
+  // For findings on Google Cloud resources, the full resource
+  // name of the Google Cloud resource this finding is for. See:
   // https://cloud.google.com/apis/design/resource_names#full_resource_name
-  // When the finding is for a non-GCP resource, the resourceName can be a
-  // customer or partner defined string.
-  // This field is immutable after creation time.
+  // When the finding is for a non-Google Cloud resource, the resourceName can
+  // be a customer or partner defined string. This field is immutable after
+  // creation time.
   string resource_name = 3;
 
   // The state of the finding.
@@ -85,9 +84,9 @@ message Finding {
   // Example: "XSS_FLASH_INJECTION"
   string category = 5;
 
-  // The URI that, if available, points to a web page outside of Cloud SCC
-  // where additional information about the finding can be found. This field is
-  // guaranteed to be either empty or a well formed URL.
+  // The URI that, if available, points to a web page outside of Security
+  // Command Center where additional information about the finding can be found.
+  // This field is guaranteed to be either empty or a well formed URL.
   string external_uri = 6;
 
   // Source specific properties. These properties are managed by the source
@@ -106,6 +105,6 @@ message Finding {
   // the firewall became open. The accuracy is determined by the detector.
   google.protobuf.Timestamp event_time = 9;
 
-  // The time at which the finding was created in Cloud SCC.
+  // The time at which the finding was created in Security Command Center.
   google.protobuf.Timestamp create_time = 10;
 }
diff --git a/google/cloud/securitycenter/v1p1beta1/notification_config.proto b/google/cloud/securitycenter/v1p1beta1/notification_config.proto
index 7cbb87b24..6f9e59669 100644
--- a/google/cloud/securitycenter/v1p1beta1/notification_config.proto
+++ b/google/cloud/securitycenter/v1p1beta1/notification_config.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -27,19 +26,16 @@ option java_multiple_files = true;
 option java_package = "com.google.cloud.securitycenter.v1p1beta1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
-
-// The Pub/Sub Topic resource definition is in google/cloud/pubsub/v1/,
-// but we do not import that proto directly; therefore, we redefine the
-// pattern here.
 option (google.api.resource_definition) = {
   type: "pubsub.googleapis.com/Topic"
   pattern: "projects/{project}/topics/{topic}"
 };
 
-// Cloud Security Command Center (Cloud SCC) notification configs.
+// Security Command Center notification configs.
 //
-// A notification config is a Cloud SCC resource that contains the configuration
-// to send notifications for create/update events of findings, assets and etc.
+// A notification config is a Security Command Center resource that contains the
+// configuration to send notifications for create/update events of findings,
+// assets and etc.
 message NotificationConfig {
   option (google.api.resource) = {
     type: "securitycenter.googleapis.com/NotificationConfig"
@@ -94,14 +90,14 @@ message NotificationConfig {
   // The type of events the config is for, e.g. FINDING.
   EventType event_type = 3;
 
-  // The PubSub topic to send notifications to. Its format is
+  // The Pub/Sub topic to send notifications to. Its format is
   // "projects/[project_id]/topics/[topic]".
   string pubsub_topic = 4 [
     (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
   ];
 
   // Output only. The service account that needs "pubsub.topics.publish"
-  // permission to publish to the PubSub topic.
+  // permission to publish to the Pub/Sub topic.
   string service_account = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // The config for triggering notifications.
diff --git a/google/cloud/securitycenter/v1p1beta1/notification_message.proto b/google/cloud/securitycenter/v1p1beta1/notification_message.proto
index 3abbcef32..fd3c23b63 100644
--- a/google/cloud/securitycenter/v1p1beta1/notification_message.proto
+++ b/google/cloud/securitycenter/v1p1beta1/notification_message.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -20,6 +19,7 @@ package google.cloud.securitycenter.v1p1beta1;
 import "google/api/annotations.proto";
 import "google/cloud/securitycenter/v1p1beta1/asset.proto";
 import "google/cloud/securitycenter/v1p1beta1/finding.proto";
+import "google/cloud/securitycenter/v1p1beta1/resource.proto";
 
 option csharp_namespace = "Google.Cloud.SecurityCenter.V1P1Beta1";
 option go_package = "google.golang.org/genproto/googleapis/cloud/securitycenter/v1p1beta1;securitycenter";
@@ -28,7 +28,7 @@ option java_package = "com.google.cloud.securitycenter.v1p1beta1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
 
-// Cloud SCC's Notification
+// Security Command Center's Notification
 message NotificationMessage {
   // Name of the notification config that generated current notification.
   string notification_config_name = 1;
@@ -39,4 +39,7 @@ message NotificationMessage {
     // populated.
     Finding finding = 2;
   }
+
+  // The Cloud resource tied to the notification.
+  Resource resource = 3;
 }
diff --git a/google/cloud/securitycenter/v1p1beta1/organization_settings.proto b/google/cloud/securitycenter/v1p1beta1/organization_settings.proto
index 9c38b87ba..1be72dd7b 100644
--- a/google/cloud/securitycenter/v1p1beta1/organization_settings.proto
+++ b/google/cloud/securitycenter/v1p1beta1/organization_settings.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -27,8 +26,8 @@ option java_package = "com.google.cloud.securitycenter.v1p1beta1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
 
-// User specified settings that are attached to the Cloud Security Command
-// Center (Cloud SCC) organization.
+// User specified settings that are attached to the Security Command
+// Center organization.
 message OrganizationSettings {
   option (google.api.resource) = {
     type: "securitycenter.googleapis.com/OrganizationSettings"
diff --git a/google/cloud/securitycenter/v1p1beta1/resource.proto b/google/cloud/securitycenter/v1p1beta1/resource.proto
new file mode 100644
index 000000000..6b8570993
--- /dev/null
+++ b/google/cloud/securitycenter/v1p1beta1/resource.proto
@@ -0,0 +1,46 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.securitycenter.v1p1beta1;
+
+import "google/api/annotations.proto";
+
+option csharp_namespace = "Google.Cloud.SecurityCenter.V1P1Beta1";
+option go_package = "google.golang.org/genproto/googleapis/cloud/securitycenter/v1p1beta1;securitycenter";
+option java_multiple_files = true;
+option java_outer_classname = "ResourceProto";
+option java_package = "com.google.cloud.securitycenter.v1p1beta1";
+option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
+option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
+
+// Information related to the Google Cloud resource.
+message Resource {
+  // The full resource name of the resource. See:
+  // https://cloud.google.com/apis/design/resource_names#full_resource_name
+  string name = 1;
+
+  // The full resource name of project that the resource belongs to.
+  string project = 2;
+
+  // The human readable name of project that the resource belongs to.
+  string project_display_name = 3;
+
+  // The full resource name of resource's parent.
+  string parent = 4;
+
+  // The human readable name of resource's parent.
+  string parent_display_name = 5;
+}
diff --git a/google/cloud/securitycenter/v1p1beta1/run_asset_discovery_response.proto b/google/cloud/securitycenter/v1p1beta1/run_asset_discovery_response.proto
index b8b9ea489..720ffc4fa 100644
--- a/google/cloud/securitycenter/v1p1beta1/run_asset_discovery_response.proto
+++ b/google/cloud/securitycenter/v1p1beta1/run_asset_discovery_response.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/cloud/securitycenter/v1p1beta1/security_marks.proto b/google/cloud/securitycenter/v1p1beta1/security_marks.proto
index ac54bc19a..11a1dd85a 100644
--- a/google/cloud/securitycenter/v1p1beta1/security_marks.proto
+++ b/google/cloud/securitycenter/v1p1beta1/security_marks.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -27,9 +26,9 @@ option java_package = "com.google.cloud.securitycenter.v1p1beta1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
 
-// User specified security marks that are attached to the parent Cloud Security
-// Command Center (Cloud SCC) resource. Security marks are scoped within a Cloud
-// SCC organization -- they can be modified and viewed by all users who have
+// User specified security marks that are attached to the parent Security
+// Command Center resource. Security marks are scoped within a Security Command
+// Center organization -- they can be modified and viewed by all users who have
 // proper permissions on the organization.
 message SecurityMarks {
   option (google.api.resource) = {
diff --git a/google/cloud/securitycenter/v1p1beta1/securitycenter_grpc_service_config.json b/google/cloud/securitycenter/v1p1beta1/securitycenter_grpc_service_config.json
index 1e1d6a1b4..f3b89d225 100755
--- a/google/cloud/securitycenter/v1p1beta1/securitycenter_grpc_service_config.json
+++ b/google/cloud/securitycenter/v1p1beta1/securitycenter_grpc_service_config.json
@@ -51,7 +51,7 @@
           "method": "UpdateSecurityMarks"
         }
       ],
-      "timeout": "60s"
+      "timeout": "600s"
     },
     {
       "name": [
@@ -100,9 +100,8 @@
           "method": "TestIamPermissions"
         }
       ],
-      "timeout": "60s",
+      "timeout": "600s",
       "retryPolicy": {
-        "maxAttempts": 5,
         "initialBackoff": "0.100s",
         "maxBackoff": "60s",
         "backoffMultiplier": 1.3,
diff --git a/google/cloud/securitycenter/v1p1beta1/securitycenter_service.proto b/google/cloud/securitycenter/v1p1beta1/securitycenter_service.proto
index dcd9af683..c4264a6a2 100644
--- a/google/cloud/securitycenter/v1p1beta1/securitycenter_service.proto
+++ b/google/cloud/securitycenter/v1p1beta1/securitycenter_service.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -236,7 +235,6 @@ service SecurityCenter {
     option (google.api.method_signature) = "resource,permissions";
   }
 
-  //
   // Creates or updates a finding. The corresponding source must exist for a
   // finding creation to succeed.
   rpc UpdateFinding(UpdateFindingRequest) returns (Finding) {
@@ -248,7 +246,8 @@ service SecurityCenter {
     option (google.api.method_signature) = "finding,update_mask";
   }
 
-  // Updates a notification config.
+  // Updates a notification config. The following update
+  // fields are allowed: description, pubsub_topic, streaming_config.filter
   rpc UpdateNotificationConfig(UpdateNotificationConfigRequest)
       returns (NotificationConfig) {
     option (google.api.http) = {
@@ -447,15 +446,15 @@ message GroupAssetsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "update_time = \"2019-06-10T16:07:18-07:00\""
-  //     "update_time = 1560208038000"
+  //     `update_time = "2019-06-10T16:07:18-07:00"`
+  //     `update_time = 1560208038000`
   //
   // * create_time: `=`, `>`, `<`, `>=`, `<=`
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "create_time = \"2019-06-10T16:07:18-07:00\""
-  //     "create_time = 1560208038000"
+  //     `create_time = "2019-06-10T16:07:18-07:00"`
+  //     `create_time = 1560208038000`
   //
   // * iam_policy.policy_blob: `=`, `:`
   // * resource_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
@@ -470,6 +469,12 @@ message GroupAssetsRequest {
   // * security_center_properties.resource_owners: `=`, `:`
   //
   // For example, `resource_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing: `resource_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-resource_properties.my_property : ""`
   string filter = 2;
 
   // Required. Expression that defines what assets fields to use for grouping.
@@ -527,11 +532,6 @@ message GroupAssetsRequest {
   // NOW.
   google.protobuf.Timestamp read_time = 5;
 
-  // Filter that specifies what fields to further filter on *after* the query
-  // filter has been executed. Currently only `state_change` is supported and
-  // requires compare_duration to be specified.
-  string having = 6;
-
   // The value returned by the last `GroupAssetsResponse`; indicates
   // that this is a continuation of a prior `GroupAssets` call, and that the
   // system should return the next page of data.
@@ -609,13 +609,19 @@ message GroupFindingsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "event_time = \"2019-06-10T16:07:18-07:00\""
-  //     "event_time = 1560208038000"
+  //     `event_time = "2019-06-10T16:07:18-07:00"`
+  //     `event_time = 1560208038000`
   //
   // * security_marks.marks: `=`, `:`
   // * source_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
   //
   // For example, `source_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing: `source_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-source_properties.my_property : ""`
   string filter = 2;
 
   // Required. Expression that defines what assets fields to use for grouping
@@ -653,12 +659,18 @@ message GroupFindingsRequest {
   //
   // Possible "state_change" values when compare_duration is specified:
   //
-  // * "CHANGED":   indicates that the finding was present at the start of
-  //                  compare_duration, but changed its state at read_time.
-  // * "UNCHANGED": indicates that the finding was present at the start of
-  //                  compare_duration and did not change state at read_time.
-  // * "ADDED":     indicates that the finding was not present at the start
-  //                  of compare_duration, but was present at read_time.
+  // * "CHANGED":   indicates that the finding was present and matched the given
+  //                  filter at the start of compare_duration, but changed its
+  //                  state at read_time.
+  // * "UNCHANGED": indicates that the finding was present and matched the given
+  //                  filter at the start of compare_duration and did not change
+  //                  state at read_time.
+  // * "ADDED":     indicates that the finding did not match the given filter or
+  //                  was not present at the start of compare_duration, but was
+  //                  present at read_time.
+  // * "REMOVED":   indicates that the finding was present and matched the
+  //                  filter at the start of compare_duration, but did not match
+  //                  the filter at read_time.
   //
   // If compare_duration is not specified, then the only possible state_change
   // is "UNUSED",  which will be the state_change set for all findings present
@@ -668,11 +680,6 @@ message GroupFindingsRequest {
   // `group_by`.
   google.protobuf.Duration compare_duration = 5;
 
-  // Filter that specifies what fields to further filter on *after* the query
-  // filter has been executed. Currently only `finding.state` and `state_change`
-  // are supported and requires compare_duration to be specified.
-  string having = 6;
-
   // The value returned by the last `GroupFindingsResponse`; indicates
   // that this is a continuation of a prior `GroupFindings` call, and
   // that the system should return the next page of data.
@@ -816,15 +823,15 @@ message ListAssetsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "update_time = \"2019-06-10T16:07:18-07:00\""
-  //     "update_time = 1560208038000"
+  //     `update_time = "2019-06-10T16:07:18-07:00"`
+  //     `update_time = 1560208038000`
   //
   // * create_time: `=`, `>`, `<`, `>=`, `<=`
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "create_time = \"2019-06-10T16:07:18-07:00\""
-  //     "create_time = 1560208038000"
+  //     `create_time = "2019-06-10T16:07:18-07:00"`
+  //     `create_time = 1560208038000`
   //
   // * iam_policy.policy_blob: `=`, `:`
   // * resource_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
@@ -839,6 +846,12 @@ message ListAssetsRequest {
   // * security_center_properties.resource_owners: `=`, `:`
   //
   // For example, `resource_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing: `resource_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-resource_properties.my_property : ""`
   string filter = 2;
 
   // Expression that defines what fields and order to use for sorting. The
@@ -896,11 +909,6 @@ message ListAssetsRequest {
   // read_time.
   google.protobuf.Duration compare_duration = 5;
 
-  // Filter that specifies what fields to further filter on *after* the query
-  // filter has been executed. Currently only `state_change` is supported and
-  // requires compare_duration to be specified.
-  string having = 6;
-
   // Optional.
   // A field mask to specify the ListAssetsResult fields to be listed in the
   // response.
@@ -1012,13 +1020,19 @@ message ListFindingsRequest {
   //
   //   Usage: This should be milliseconds since epoch or an RFC3339 string.
   //   Examples:
-  //     "event_time = \"2019-06-10T16:07:18-07:00\""
-  //     "event_time = 1560208038000"
+  //     `event_time = "2019-06-10T16:07:18-07:00"`
+  //     `event_time = 1560208038000`
   //
   // security_marks.marks: `=`, `:`
   // source_properties: `=`, `:`, `>`, `<`, `>=`, `<=`
   //
   // For example, `source_properties.size = 100` is a valid filter string.
+  //
+  // Use a partial match on the empty string to filter based on a property
+  // existing: `source_properties.my_property : ""`
+  //
+  // Use a negated partial match on the empty string to filter based on a
+  // property not existing: `-source_properties.my_property : ""`
   string filter = 2;
 
   // Expression that defines what fields and order to use for sorting. The
@@ -1061,23 +1075,24 @@ message ListFindingsRequest {
   //
   // Possible "state_change" values when compare_duration is specified:
   //
-  // * "CHANGED":   indicates that the finding was present at the start of
-  //                  compare_duration, but changed its state at read_time.
-  // * "UNCHANGED": indicates that the finding was present at the start of
-  //                  compare_duration and did not change state at read_time.
-  // * "ADDED":     indicates that the finding was not present at the start
-  //                  of compare_duration, but was present at read_time.
+  // * "CHANGED":   indicates that the finding was present and matched the given
+  //                  filter at the start of compare_duration, but changed its
+  //                  state at read_time.
+  // * "UNCHANGED": indicates that the finding was present and matched the given
+  //                  filter at the start of compare_duration and did not change
+  //                  state at read_time.
+  // * "ADDED":     indicates that the finding did not match the given filter or
+  //                  was not present at the start of compare_duration, but was
+  //                  present at read_time.
+  // * "REMOVED":   indicates that the finding was present and matched the
+  //                  filter at the start of compare_duration, but did not match
+  //                  the filter at read_time.
   //
   // If compare_duration is not specified, then the only possible state_change
   // is "UNUSED", which will be the state_change set for all findings present at
   // read_time.
   google.protobuf.Duration compare_duration = 5;
 
-  // Filter that specifies what fields to further filter on *after* the query
-  // filter has been executed. Currently only `finding.state` and `state_change`
-  // are supported and requires compare_duration to be specified.
-  string having = 6;
-
   // Optional.
   // A field mask to specify the Finding fields to be listed in the response.
   // An empty field mask will list all fields.
@@ -1098,7 +1113,7 @@ message ListFindingsRequest {
 message ListFindingsResponse {
   // Result containing the Finding and its StateChange.
   message ListFindingsResult {
-    // Information related to the Google Cloud Platform (GCP) resource that is
+    // Information related to the Google Cloud resource that is
     // associated with this finding.
     message Resource {
       // The full resource name of the resource. See:
diff --git a/google/cloud/securitycenter/v1p1beta1/securitycenter_v1p1beta1.yaml b/google/cloud/securitycenter/v1p1beta1/securitycenter_v1p1beta1.yaml
index 3c7319584..cfc61ada6 100644
--- a/google/cloud/securitycenter/v1p1beta1/securitycenter_v1p1beta1.yaml
+++ b/google/cloud/securitycenter/v1p1beta1/securitycenter_v1p1beta1.yaml
@@ -1,19 +1,20 @@
 type: google.api.Service
 config_version: 3
 name: securitycenter.googleapis.com
-title: Cloud Security Command Center API
+title: Security Command Center API
 
 apis:
 - name: google.cloud.securitycenter.v1p1beta1.SecurityCenter
 
 types:
 - name: google.cloud.securitycenter.v1p1beta1.NotificationMessage
+- name: google.cloud.securitycenter.v1p1beta1.Resource
 - name: google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse
 
 documentation:
   summary: |-
-    Cloud Security Command Center API provides access to temporal views of
-    assets and findings within an organization.
+    Security Command Center API provides access to temporal views of assets and
+    findings within an organization.
 
 backend:
   rules:
diff --git a/google/cloud/securitycenter/v1p1beta1/source.proto b/google/cloud/securitycenter/v1p1beta1/source.proto
index d591a05cc..0e940df62 100644
--- a/google/cloud/securitycenter/v1p1beta1/source.proto
+++ b/google/cloud/securitycenter/v1p1beta1/source.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -27,7 +26,7 @@ option java_package = "com.google.cloud.securitycenter.v1p1beta1";
 option php_namespace = "Google\\Cloud\\SecurityCenter\\V1p1beta1";
 option ruby_package = "Google::Cloud::SecurityCenter::V1p1beta1";
 
-// Cloud Security Command Center's (Cloud SCC) finding source. A finding source
+// Security Command Center finding source. A finding source
 // is an entity or a mechanism that can produce a finding. A source is like a
 // container of findings that come from the same scanner, logger, monitor, etc.
 message Source {
@@ -51,7 +50,7 @@ message Source {
 
   // The description of the source (max of 1024 characters).
   // Example:
-  // "Cloud Security Scanner is a web security scanner for common
+  // "Web Security Scanner is a web security scanner for common
   // vulnerabilities in App Engine applications. It can automatically
   // scan and detect four common vulnerabilities, including cross-site-scripting
   // (XSS), Flash injection, mixed content (HTTP in HTTPS), and
diff --git a/google/cloud/servicedirectory/v1beta1/BUILD.bazel b/google/cloud/servicedirectory/v1beta1/BUILD.bazel
index 13efb63ed..04b10cfdf 100644
--- a/google/cloud/servicedirectory/v1beta1/BUILD.bazel
+++ b/google/cloud/servicedirectory/v1beta1/BUILD.bazel
@@ -265,7 +265,7 @@ load(
 nodejs_gapic_library(
     name = "servicedirectory_nodejs_gapic",
     src = ":servicedirectory_proto_with_info",
-    gapic_yaml = "servicedirectory_gapic.yaml",
+    grpc_service_config = "servicedirectory_grpc_service_config.json",
     package = "google.cloud.servicedirectory.v1beta1",
     service_yaml = "servicedirectory_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/speech/v1/BUILD.bazel b/google/cloud/speech/v1/BUILD.bazel
index 691de9b37..081e6e4a1 100644
--- a/google/cloud/speech/v1/BUILD.bazel
+++ b/google/cloud/speech/v1/BUILD.bazel
@@ -61,6 +61,7 @@ java_gapic_library(
     name = "speech_java_gapic",
     src = ":speech_proto_with_info",
     gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1",
     service_yaml = "speech_v1.yaml",
     test_deps = [
@@ -124,7 +125,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
@@ -190,6 +190,7 @@ py_gapic_library(
     name = "speech_py_gapic",
     src = ":speech_proto_with_info",
     gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1",
     service_yaml = "speech_v1.yaml",
     deps = [
@@ -234,6 +235,7 @@ php_gapic_library(
     name = "speech_php_gapic",
     src = ":speech_proto_with_info",
     gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1",
     service_yaml = "speech_v1.yaml",
     deps = [
@@ -264,7 +266,7 @@ load(
 nodejs_gapic_library(
     name = "speech_nodejs_gapic",
     src = ":speech_proto_with_info",
-    gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1",
     service_yaml = "speech_v1.yaml",
     deps = [],
diff --git a/google/cloud/speech/v1/speech_gapic.yaml b/google/cloud/speech/v1/speech_gapic.yaml
index 24fdf272e..91e8f45a2 100644
--- a/google/cloud/speech/v1/speech_gapic.yaml
+++ b/google/cloud/speech/v1/speech_gapic.yaml
@@ -27,18 +27,8 @@ interfaces:
     - config.sample_rate_hertz=44100
     - config.encoding=FLAC
     - audio.uri="gs://cloud-samples-data/speech/brooklyn_bridge.flac"
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 1000000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 1000000
-    total_timeout_millis: 5000000
   methods:
   - name: Recognize
-    retry_codes_name: idempotent
     sample_code_init_fields:
     - config.encoding=FLAC
     - config.sample_rate_hertz=44100
@@ -50,5 +40,3 @@ interfaces:
     - config.sample_rate_hertz=44100
     - config.language_code="en-US"
     - audio.uri=gs://bucket_name/file_name.flac
-  - name: StreamingRecognize
-    retry_codes_name: idempotent
diff --git a/google/cloud/speech/v1p1beta1/BUILD.bazel b/google/cloud/speech/v1p1beta1/BUILD.bazel
index 14fd48bb4..b1e2ec6b3 100644
--- a/google/cloud/speech/v1p1beta1/BUILD.bazel
+++ b/google/cloud/speech/v1p1beta1/BUILD.bazel
@@ -63,6 +63,7 @@ java_gapic_library(
     name = "speech_java_gapic",
     src = ":speech_proto_with_info",
     gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1p1beta1",
     service_yaml = "speech_v1p1beta1.yaml",
     test_deps = [
@@ -126,7 +127,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
@@ -193,6 +193,7 @@ py_gapic_library(
     name = "speech_py_gapic",
     src = ":speech_proto_with_info",
     gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1p1beta1",
     service_yaml = "speech_v1p1beta1.yaml",
     deps = [
@@ -237,6 +238,7 @@ php_gapic_library(
     name = "speech_php_gapic",
     src = ":speech_proto_with_info",
     gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1p1beta1",
     service_yaml = "speech_v1p1beta1.yaml",
     deps = [
@@ -267,7 +269,7 @@ load(
 nodejs_gapic_library(
     name = "speech_nodejs_gapic",
     src = ":speech_proto_with_info",
-    gapic_yaml = "speech_gapic.yaml",
+    grpc_service_config = "speech_grpc_service_config.json",
     package = "google.cloud.speech.v1p1beta1",
     service_yaml = "speech_v1p1beta1.yaml",
     deps = [],
diff --git a/google/cloud/speech/v1p1beta1/speech_gapic.yaml b/google/cloud/speech/v1p1beta1/speech_gapic.yaml
index f77b1a3fe..1d8a2e220 100644
--- a/google/cloud/speech/v1p1beta1/speech_gapic.yaml
+++ b/google/cloud/speech/v1p1beta1/speech_gapic.yaml
@@ -25,18 +25,8 @@ interfaces:
     - config.sample_rate_hertz=44100
     - config.encoding=FLAC
     - audio.uri="gs://cloud-samples-data/speech/brooklyn_bridge.flac"
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 1000000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 1000000
-    total_timeout_millis: 5000000
   methods:
   - name: Recognize
-    retry_codes_name: idempotent
     sample_code_init_fields:
     - config.encoding=FLAC
     - config.sample_rate_hertz=44100
@@ -48,5 +38,3 @@ interfaces:
     - config.sample_rate_hertz=44100
     - config.language_code="en-US"
     - audio.uri=gs://bucket_name/file_name.flac
-  - name: StreamingRecognize
-    retry_codes_name: idempotent
diff --git a/google/cloud/talent/v4beta1/BUILD.bazel b/google/cloud/talent/v4beta1/BUILD.bazel
index 9cf7d3dc8..caf88318c 100644
--- a/google/cloud/talent/v4beta1/BUILD.bazel
+++ b/google/cloud/talent/v4beta1/BUILD.bazel
@@ -160,7 +160,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:any_go_proto",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
@@ -309,7 +308,7 @@ load(
 nodejs_gapic_library(
     name = "talent_nodejs_gapic",
     src = ":talent_proto_with_info",
-    gapic_yaml = "talent_gapic.yaml",
+    grpc_service_config = "talent_grpc_service_config.json",
     package = "google.cloud.talent.v4beta1",
     service_yaml = "//google/cloud/talent:talent_v4beta1.yaml",
     deps = [],
diff --git a/google/cloud/talent/v4beta1/filters.proto b/google/cloud/talent/v4beta1/filters.proto
index be457b430..a8cebd7e1 100644
--- a/google/cloud/talent/v4beta1/filters.proto
+++ b/google/cloud/talent/v4beta1/filters.proto
@@ -446,7 +446,7 @@ message LocationFilter {
   // or territory. If this field is not set, application behavior is biased
   // toward the United States by default.
   //
-  // See https://cldr.unicode.org/ and
+  // See
   // https://www.unicode.org/cldr/charts/30/supplemental/territory_information.html
   // for details. Example: "CH" for Switzerland.
   // Note that this filter is not applicable for Profile Search related queries.
diff --git a/google/cloud/tasks/v2/BUILD.bazel b/google/cloud/tasks/v2/BUILD.bazel
index c91328995..430589bfd 100644
--- a/google/cloud/tasks/v2/BUILD.bazel
+++ b/google/cloud/tasks/v2/BUILD.bazel
@@ -67,6 +67,7 @@ java_gapic_library(
     name = "tasks_java_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2",
     service_yaml = "cloudtasks_v2.yaml",
     test_deps = [
@@ -196,6 +197,7 @@ py_gapic_library(
     name = "tasks_py_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2",
     service_yaml = "cloudtasks_v2.yaml",
     deps = [
@@ -240,6 +242,7 @@ php_gapic_library(
     name = "tasks_php_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2",
     service_yaml = "cloudtasks_v2.yaml",
     deps = [
@@ -270,7 +273,7 @@ load(
 nodejs_gapic_library(
     name = "tasks_nodejs_gapic",
     src = ":tasks_proto_with_info",
-    gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2",
     service_yaml = "cloudtasks_v2.yaml",
     deps = [],
diff --git a/google/cloud/tasks/v2/cloudtasks_gapic.yaml b/google/cloud/tasks/v2/cloudtasks_gapic.yaml
index ad8a4bd85..e26465c16 100644
--- a/google/cloud/tasks/v2/cloudtasks_gapic.yaml
+++ b/google/cloud/tasks/v2/cloudtasks_gapic.yaml
@@ -21,46 +21,3 @@ language_settings:
     release_level: GA
   nodejs:
     package_name: tasks.v2
-interfaces:
-- name: google.cloud.tasks.v2.CloudTasks
-  methods:
-  - name: ListQueues
-    timeout_millis: 10000
-  - name: GetQueue
-    timeout_millis: 10000
-  - name: CreateQueue
-    timeout_millis: 10000
-  - name: UpdateQueue
-    timeout_millis: 10000
-  - name: DeleteQueue
-    retry_codes_name: idempotent
-    retry_params_name: default
-    timeout_millis: 10000
-  - name: PurgeQueue
-    timeout_millis: 10000
-  - name: PauseQueue
-    timeout_millis: 10000
-  - name: ResumeQueue
-    timeout_millis: 10000
-  - name: GetIamPolicy
-    retry_codes_name: idempotent
-    retry_params_name: default
-    timeout_millis: 10000
-  - name: SetIamPolicy
-    timeout_millis: 10000
-  - name: TestIamPermissions
-    retry_codes_name: idempotent
-    retry_params_name: default
-    timeout_millis: 10000
-  - name: ListTasks
-    timeout_millis: 10000
-  - name: GetTask
-    timeout_millis: 10000
-  - name: CreateTask
-    timeout_millis: 10000
-  - name: DeleteTask
-    retry_codes_name: idempotent
-    retry_params_name: default
-    timeout_millis: 10000
-  - name: RunTask
-    timeout_millis: 10000
diff --git a/google/cloud/tasks/v2beta2/BUILD.bazel b/google/cloud/tasks/v2beta2/BUILD.bazel
index d430b1219..16210c2cb 100644
--- a/google/cloud/tasks/v2beta2/BUILD.bazel
+++ b/google/cloud/tasks/v2beta2/BUILD.bazel
@@ -67,6 +67,7 @@ java_gapic_library(
     name = "tasks_java_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta2",
     service_yaml = "cloudtasks_v2beta2.yaml",
     test_deps = [
@@ -197,6 +198,7 @@ py_gapic_library(
     name = "tasks_py_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta2",
     service_yaml = "cloudtasks_v2beta2.yaml",
     deps = [
@@ -241,6 +243,7 @@ php_gapic_library(
     name = "tasks_php_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta2",
     service_yaml = "cloudtasks_v2beta2.yaml",
     deps = [
@@ -271,7 +274,7 @@ load(
 nodejs_gapic_library(
     name = "tasks_nodejs_gapic",
     src = ":tasks_proto_with_info",
-    gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta2",
     service_yaml = "cloudtasks_v2beta2.yaml",
     deps = [],
diff --git a/google/cloud/tasks/v2beta2/cloudtasks_gapic.yaml b/google/cloud/tasks/v2beta2/cloudtasks_gapic.yaml
index 956f2d082..b41b92ac8 100644
--- a/google/cloud/tasks/v2beta2/cloudtasks_gapic.yaml
+++ b/google/cloud/tasks/v2beta2/cloudtasks_gapic.yaml
@@ -16,51 +16,3 @@ language_settings:
     package_name: Google\Cloud\Tasks\V2beta2
   nodejs:
     package_name: tasks.v2beta2
-interfaces:
-- name: google.cloud.tasks.v2beta2.CloudTasks
-  methods:
-  - name: ListQueues
-    timeout_millis: 10000
-  - name: GetQueue
-    timeout_millis: 10000
-  - name: CreateQueue
-    timeout_millis: 10000
-  - name: UpdateQueue
-    timeout_millis: 10000
-  - name: DeleteQueue
-    retry_codes_name: idempotent
-    retry_params_name: default
-    timeout_millis: 10000
-  - name: PurgeQueue
-    timeout_millis: 10000
-  - name: PauseQueue
-    timeout_millis: 10000
-  - name: ResumeQueue
-    timeout_millis: 10000
-  - name: GetIamPolicy
-    retry_codes_name: idempotent
-    timeout_millis: 10000
-  - name: SetIamPolicy
-    timeout_millis: 10000
-  - name: TestIamPermissions
-    retry_codes_name: idempotent
-    timeout_millis: 10000
-  - name: ListTasks
-    timeout_millis: 10000
-  - name: GetTask
-    timeout_millis: 10000
-  - name: CreateTask
-    timeout_millis: 10000
-  - name: DeleteTask
-    retry_codes_name: idempotent
-    timeout_millis: 10000
-  - name: LeaseTasks
-    timeout_millis: 10000
-  - name: AcknowledgeTask
-    timeout_millis: 10000
-  - name: RenewLease
-    timeout_millis: 10000
-  - name: CancelLease
-    timeout_millis: 10000
-  - name: RunTask
-    timeout_millis: 10000
diff --git a/google/cloud/tasks/v2beta3/BUILD.bazel b/google/cloud/tasks/v2beta3/BUILD.bazel
index b3477f4a0..804119782 100644
--- a/google/cloud/tasks/v2beta3/BUILD.bazel
+++ b/google/cloud/tasks/v2beta3/BUILD.bazel
@@ -67,6 +67,7 @@ java_gapic_library(
     name = "tasks_java_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta3",
     service_yaml = "cloudtasks_v2beta3.yaml",
     test_deps = [
@@ -197,6 +198,7 @@ py_gapic_library(
     name = "tasks_py_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta3",
     service_yaml = "cloudtasks_v2beta3.yaml",
     deps = [
@@ -241,6 +243,7 @@ php_gapic_library(
     name = "tasks_php_gapic",
     src = ":tasks_proto_with_info",
     gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta3",
     service_yaml = "cloudtasks_v2beta3.yaml",
     deps = [
@@ -271,7 +274,7 @@ load(
 nodejs_gapic_library(
     name = "tasks_nodejs_gapic",
     src = ":tasks_proto_with_info",
-    gapic_yaml = "cloudtasks_gapic.yaml",
+    grpc_service_config = "cloudtasks_grpc_service_config.json",
     package = "google.cloud.tasks.v2beta3",
     service_yaml = "cloudtasks_v2beta3.yaml",
     deps = [],
diff --git a/google/cloud/tasks/v2beta3/cloudtasks_gapic.yaml b/google/cloud/tasks/v2beta3/cloudtasks_gapic.yaml
index 1e91efb26..a0bbcf7b3 100644
--- a/google/cloud/tasks/v2beta3/cloudtasks_gapic.yaml
+++ b/google/cloud/tasks/v2beta3/cloudtasks_gapic.yaml
@@ -16,43 +16,3 @@ language_settings:
     package_name: Google\Cloud\Tasks\V2beta3
   nodejs:
     package_name: tasks.v2beta3
-interfaces:
-- name: google.cloud.tasks.v2beta3.CloudTasks
-  methods:
-  - name: ListQueues
-    timeout_millis: 10000
-  - name: GetQueue
-    timeout_millis: 10000
-  - name: CreateQueue
-    timeout_millis: 10000
-  - name: UpdateQueue
-    timeout_millis: 10000
-  - name: DeleteQueue
-    retry_codes_name: idempotent
-    retry_params_name: default
-    timeout_millis: 10000
-  - name: PurgeQueue
-    timeout_millis: 10000
-  - name: PauseQueue
-    timeout_millis: 10000
-  - name: ResumeQueue
-    timeout_millis: 10000
-  - name: GetIamPolicy
-    retry_codes_name: idempotent
-    timeout_millis: 10000
-  - name: SetIamPolicy
-    timeout_millis: 10000
-  - name: TestIamPermissions
-    retry_codes_name: idempotent
-    timeout_millis: 10000
-  - name: ListTasks
-    timeout_millis: 10000
-  - name: GetTask
-    timeout_millis: 10000
-  - name: CreateTask
-    timeout_millis: 10000
-  - name: DeleteTask
-    retry_codes_name: idempotent
-    timeout_millis: 10000
-  - name: RunTask
-    timeout_millis: 10000
diff --git a/google/cloud/texttospeech/v1/BUILD.bazel b/google/cloud/texttospeech/v1/BUILD.bazel
index c5d7bcd8b..bb86053da 100644
--- a/google/cloud/texttospeech/v1/BUILD.bazel
+++ b/google/cloud/texttospeech/v1/BUILD.bazel
@@ -246,7 +246,7 @@ load(
 nodejs_gapic_library(
     name = "texttospeech_nodejs_gapic",
     src = ":texttospeech_proto_with_info",
-    gapic_yaml = "texttospeech_gapic.yaml",
+    grpc_service_config = "texttospeech_grpc_service_config.json",
     package = "google.cloud.texttospeech.v1",
     service_yaml = "texttospeech_v1.yaml",
     deps = [],
diff --git a/google/cloud/texttospeech/v1/cloud_tts.proto b/google/cloud/texttospeech/v1/cloud_tts.proto
index 6134ef640..208964f80 100644
--- a/google/cloud/texttospeech/v1/cloud_tts.proto
+++ b/google/cloud/texttospeech/v1/cloud_tts.proto
@@ -155,7 +155,7 @@ message SynthesisInput {
     // The SSML document to be synthesized. The SSML document must be valid
     // and well-formed. Otherwise the RPC will fail and return
     // [google.rpc.Code.INVALID_ARGUMENT][]. For more information, see
-    // [SSML](/speech/text-to-speech/docs/ssml).
+    // [SSML](https://cloud.google.com/text-to-speech/docs/ssml).
     string ssml = 2;
   }
 }
diff --git a/google/cloud/texttospeech/v1beta1/BUILD.bazel b/google/cloud/texttospeech/v1beta1/BUILD.bazel
index d3408680e..99fe648be 100644
--- a/google/cloud/texttospeech/v1beta1/BUILD.bazel
+++ b/google/cloud/texttospeech/v1beta1/BUILD.bazel
@@ -246,7 +246,7 @@ load(
 nodejs_gapic_library(
     name = "texttospeech_nodejs_gapic",
     src = ":texttospeech_proto_with_info",
-    gapic_yaml = "texttospeech_gapic.yaml",
+    grpc_service_config = "texttospeech_grpc_service_config.json",
     package = "google.cloud.texttospeech.v1beta1",
     service_yaml = "texttospeech_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/texttospeech/v1beta1/cloud_tts.proto b/google/cloud/texttospeech/v1beta1/cloud_tts.proto
index f8189b3fa..f50a7fbd0 100644
--- a/google/cloud/texttospeech/v1beta1/cloud_tts.proto
+++ b/google/cloud/texttospeech/v1beta1/cloud_tts.proto
@@ -155,7 +155,7 @@ message SynthesisInput {
     // The SSML document to be synthesized. The SSML document must be valid
     // and well-formed. Otherwise the RPC will fail and return
     // [google.rpc.Code.INVALID_ARGUMENT][]. For more information, see
-    // [SSML](/speech/text-to-speech/docs/ssml).
+    // [SSML](https://cloud.google.com/text-to-speech/docs/ssml).
     string ssml = 2;
   }
 }
diff --git a/google/cloud/translate/v3/BUILD.bazel b/google/cloud/translate/v3/BUILD.bazel
index 1599dcb2f..0ac1e14a9 100644
--- a/google/cloud/translate/v3/BUILD.bazel
+++ b/google/cloud/translate/v3/BUILD.bazel
@@ -121,7 +121,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -257,7 +256,7 @@ load(
 nodejs_gapic_library(
     name = "translation_nodejs_gapic",
     src = ":translation_proto_with_info",
-    gapic_yaml = "translate_gapic.yaml",
+    grpc_service_config = "translate_grpc_service_config.json",
     package = "google.cloud.translation.v3",
     service_yaml = "translate_v3.yaml",
     deps = [],
diff --git a/google/cloud/translate/v3beta1/BUILD.bazel b/google/cloud/translate/v3beta1/BUILD.bazel
index 0de75e280..ba8b2c4b3 100644
--- a/google/cloud/translate/v3beta1/BUILD.bazel
+++ b/google/cloud/translate/v3beta1/BUILD.bazel
@@ -121,7 +121,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -257,7 +256,7 @@ load(
 nodejs_gapic_library(
     name = "translation_nodejs_gapic",
     src = ":translation_proto_with_info",
-    gapic_yaml = "translate_gapic.yaml",
+    grpc_service_config = "translate_grpc_service_config.json",
     package = "google.cloud.translation.v3beta1",
     service_yaml = "translate_v3beta1.yaml",
     deps = [],
diff --git a/google/cloud/videointelligence/v1/BUILD.bazel b/google/cloud/videointelligence/v1/BUILD.bazel
index 06c231fe6..6ac707b7d 100644
--- a/google/cloud/videointelligence/v1/BUILD.bazel
+++ b/google/cloud/videointelligence/v1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "videointelligence_java_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1",
     service_yaml = "videointelligence_v1.yaml",
     test_deps = [
@@ -123,7 +124,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -187,6 +187,7 @@ py_gapic_library(
     name = "videointelligence_py_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1",
     service_yaml = "videointelligence_v1.yaml",
     deps = [
@@ -262,7 +263,7 @@ load(
 nodejs_gapic_library(
     name = "videointelligence_nodejs_gapic",
     src = ":videointelligence_proto_with_info",
-    gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1",
     service_yaml = "videointelligence_v1.yaml",
     deps = [],
diff --git a/google/cloud/videointelligence/v1/videointelligence_gapic.yaml b/google/cloud/videointelligence/v1/videointelligence_gapic.yaml
index 31dbde17d..fcc408f8a 100644
--- a/google/cloud/videointelligence/v1/videointelligence_gapic.yaml
+++ b/google/cloud/videointelligence/v1/videointelligence_gapic.yaml
@@ -24,18 +24,8 @@ interfaces:
     init_fields:
     - input_uri=gs://cloud-samples-data/video/cat.mp4
     - features[0]=LABEL_DETECTION
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 1000
-    retry_delay_multiplier: 2.5
-    max_retry_delay_millis: 120000
-    initial_rpc_timeout_millis: 120000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 120000
-    total_timeout_millis: 600000
   methods:
   - name: AnnotateVideo
-    retry_codes_name: idempotent
     long_running:
       initial_poll_delay_millis: 20000
       poll_delay_multiplier: 1.5
diff --git a/google/cloud/videointelligence/v1beta2/BUILD.bazel b/google/cloud/videointelligence/v1beta2/BUILD.bazel
index c8edfddc8..34c3c8916 100644
--- a/google/cloud/videointelligence/v1beta2/BUILD.bazel
+++ b/google/cloud/videointelligence/v1beta2/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "videointelligence_java_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1beta2",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1beta2.yaml",
     test_deps = [
@@ -123,7 +124,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -187,6 +187,7 @@ py_gapic_library(
     name = "videointelligence_py_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1beta2",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1beta2.yaml",
     deps = [
@@ -261,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "videointelligence_nodejs_gapic",
     src = ":videointelligence_proto_with_info",
-    gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1beta2",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1beta2.yaml",
     deps = [],
diff --git a/google/cloud/videointelligence/v1beta2/videointelligence_gapic.yaml b/google/cloud/videointelligence/v1beta2/videointelligence_gapic.yaml
index 2e7300596..8d437510a 100644
--- a/google/cloud/videointelligence/v1beta2/videointelligence_gapic.yaml
+++ b/google/cloud/videointelligence/v1beta2/videointelligence_gapic.yaml
@@ -19,15 +19,6 @@ language_settings:
     domain_layer_location: google-cloud
 interfaces:
 - name: google.cloud.videointelligence.v1beta2.VideoIntelligenceService
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 1000
-    retry_delay_multiplier: 2.5
-    max_retry_delay_millis: 120000
-    initial_rpc_timeout_millis: 120000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 120000
-    total_timeout_millis: 600000
   methods:
   - name: AnnotateVideo
     long_running:
@@ -35,8 +26,6 @@ interfaces:
       poll_delay_multiplier: 1.5
       max_poll_delay_millis: 45000
       total_poll_timeout_millis: 86400000
-    retry_codes_name: idempotent
-    retry_params_name: default
     sample_code_init_fields:
     - input_uri=gs://cloud-samples-data/video/cat.mp4
     - features[0]=LABEL_DETECTION
diff --git a/google/cloud/videointelligence/v1p1beta1/BUILD.bazel b/google/cloud/videointelligence/v1p1beta1/BUILD.bazel
index 171db7c3d..73db03d69 100644
--- a/google/cloud/videointelligence/v1p1beta1/BUILD.bazel
+++ b/google/cloud/videointelligence/v1p1beta1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "videointelligence_java_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p1beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p1beta1.yaml",
     test_deps = [
@@ -123,7 +124,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -187,6 +187,7 @@ py_gapic_library(
     name = "videointelligence_py_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p1beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p1beta1.yaml",
     deps = [
@@ -231,6 +232,7 @@ php_gapic_library(
     name = "videointelligence_php_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p1beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p1beta1.yaml",
     deps = [
@@ -261,7 +263,7 @@ load(
 nodejs_gapic_library(
     name = "videointelligence_nodejs_gapic",
     src = ":videointelligence_proto_with_info",
-    gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p1beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p1beta1.yaml",
     deps = [],
diff --git a/google/cloud/videointelligence/v1p1beta1/videointelligence_gapic.yaml b/google/cloud/videointelligence/v1p1beta1/videointelligence_gapic.yaml
index fd08cb97c..551558af5 100644
--- a/google/cloud/videointelligence/v1p1beta1/videointelligence_gapic.yaml
+++ b/google/cloud/videointelligence/v1p1beta1/videointelligence_gapic.yaml
@@ -24,15 +24,6 @@ interfaces:
     init_fields:
     - input_uri=gs://cloud-samples-data/video/cat.mp4
     - features[0]=LABEL_DETECTION
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 1000
-    retry_delay_multiplier: 2.5
-    max_retry_delay_millis: 120000
-    initial_rpc_timeout_millis: 120000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 120000
-    total_timeout_millis: 600000
   methods:
   - name: AnnotateVideo
     long_running:
diff --git a/google/cloud/videointelligence/v1p2beta1/BUILD.bazel b/google/cloud/videointelligence/v1p2beta1/BUILD.bazel
index cba21e1f1..4bc9aea0e 100644
--- a/google/cloud/videointelligence/v1p2beta1/BUILD.bazel
+++ b/google/cloud/videointelligence/v1p2beta1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "videointelligence_java_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p2beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p2beta1.yaml",
     test_deps = [
@@ -123,7 +124,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -187,6 +187,7 @@ py_gapic_library(
     name = "videointelligence_py_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p2beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p2beta1.yaml",
     deps = [
@@ -231,6 +232,7 @@ php_gapic_library(
     name = "videointelligence_php_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p2beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p2beta1.yaml",
     deps = [
@@ -261,7 +263,7 @@ load(
 nodejs_gapic_library(
     name = "videointelligence_nodejs_gapic",
     src = ":videointelligence_proto_with_info",
-    gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p2beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p2beta1.yaml",
     deps = [],
diff --git a/google/cloud/videointelligence/v1p2beta1/videointelligence_gapic.yaml b/google/cloud/videointelligence/v1p2beta1/videointelligence_gapic.yaml
index 5e040d7b8..dad911f08 100644
--- a/google/cloud/videointelligence/v1p2beta1/videointelligence_gapic.yaml
+++ b/google/cloud/videointelligence/v1p2beta1/videointelligence_gapic.yaml
@@ -24,15 +24,6 @@ interfaces:
     init_fields:
     - input_uri=gs://cloud-samples-data/video/cat.mp4
     - features[0]=LABEL_DETECTION
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 1000
-    retry_delay_multiplier: 2.5
-    max_retry_delay_millis: 120000
-    initial_rpc_timeout_millis: 120000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 120000
-    total_timeout_millis: 600000
   methods:
   - name: AnnotateVideo
     long_running:
@@ -40,8 +31,6 @@ interfaces:
       poll_delay_multiplier: 1.5
       max_poll_delay_millis: 45000
       total_poll_timeout_millis: 86400000
-    retry_codes_name: idempotent
-    retry_params_name: default
     sample_code_init_fields:
     - input_uri=gs://cloud-samples-data/video/cat.mp4
     - features[0]=LABEL_DETECTION
diff --git a/google/cloud/videointelligence/v1p3beta1/BUILD.bazel b/google/cloud/videointelligence/v1p3beta1/BUILD.bazel
index 4adfac734..8eddc6792 100644
--- a/google/cloud/videointelligence/v1p3beta1/BUILD.bazel
+++ b/google/cloud/videointelligence/v1p3beta1/BUILD.bazel
@@ -60,6 +60,7 @@ java_gapic_library(
     name = "videointelligence_java_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p3beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p3beta1.yaml",
     test_deps = [
@@ -124,7 +125,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -188,6 +188,7 @@ py_gapic_library(
     name = "videointelligence_py_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p3beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p3beta1.yaml",
     deps = [
@@ -232,6 +233,7 @@ php_gapic_library(
     name = "videointelligence_php_gapic",
     src = ":videointelligence_proto_with_info",
     gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p3beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p3beta1.yaml",
     deps = [
@@ -262,7 +264,7 @@ load(
 nodejs_gapic_library(
     name = "videointelligence_nodejs_gapic",
     src = ":videointelligence_proto_with_info",
-    gapic_yaml = "videointelligence_gapic.yaml",
+    grpc_service_config = "videointelligence_grpc_service_config.json",
     package = "google.cloud.videointelligence.v1p3beta1",
     service_yaml = "//google/cloud/videointelligence:videointelligence_v1p3beta1.yaml",
     deps = [],
diff --git a/google/cloud/videointelligence/v1p3beta1/videointelligence_gapic.yaml b/google/cloud/videointelligence/v1p3beta1/videointelligence_gapic.yaml
index 64ced22ca..d95e7f94a 100644
--- a/google/cloud/videointelligence/v1p3beta1/videointelligence_gapic.yaml
+++ b/google/cloud/videointelligence/v1p3beta1/videointelligence_gapic.yaml
@@ -24,15 +24,6 @@ interfaces:
     init_fields:
     - input_uri=gs://cloud-samples-data/video/cat.mp4
     - features[0]=LABEL_DETECTION
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 1000
-    retry_delay_multiplier: 2.5
-    max_retry_delay_millis: 120000
-    initial_rpc_timeout_millis: 120000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 120000
-    total_timeout_millis: 600000
   methods:
   - name: AnnotateVideo
     long_running:
@@ -40,8 +31,6 @@ interfaces:
       poll_delay_multiplier: 1.5
       max_poll_delay_millis: 45000
       total_poll_timeout_millis: 86400000
-    retry_codes_name: idempotent
-    retry_params_name: default
     sample_code_init_fields:
     - input_uri=gs://cloud-samples-data/video/cat.mp4
     - features[0]=LABEL_DETECTION
@@ -191,21 +180,3 @@ interfaces:
               - print: ["\n\tStart Time Offset : %s.%s", logo_recognition_annotation_segment_start_time_offset.seconds, logo_recognition_annotation_segment_start_time_offset.nanos]
               - define: logo_recognition_annotation_segment_end_time_offset=logo_recognition_annotation_segment.end_time_offset
               - print: ["\tEnd Time Offset : %s.%s", logo_recognition_annotation_segment_end_time_offset.seconds, logo_recognition_annotation_segment_end_time_offset.nanos]
-# TODO: This config is currently broken:
-#     https://github.com/googleapis/gapic-generator/issues/1057
-#     https://github.com/googleapis/gapic-generator/issues/1149
-- name: google.cloud.videointelligence.v1p3beta1.StreamingVideoIntelligenceService
-  # Definition for retry/backoff parameters.
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 10800000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 10800000
-    total_timeout_millis: 10800000
-  methods:
-  - name: StreamingAnnotateVideo
-    retry_codes_name: idempotent
-    retry_params_name: default
diff --git a/google/cloud/vision/v1/BUILD.bazel b/google/cloud/vision/v1/BUILD.bazel
index 5aedae4e1..79a66e997 100644
--- a/google/cloud/vision/v1/BUILD.bazel
+++ b/google/cloud/vision/v1/BUILD.bazel
@@ -135,7 +135,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -276,7 +275,7 @@ load(
 nodejs_gapic_library(
     name = "vision_nodejs_gapic",
     src = ":vision_proto_with_info",
-    gapic_yaml = "vision_gapic.yaml",
+    grpc_service_config = "vision_grpc_service_config.json",
     package = "google.cloud.vision.v1",
     service_yaml = "vision_v1.yaml",
     deps = [],
diff --git a/google/cloud/vision/v1p1beta1/BUILD.bazel b/google/cloud/vision/v1p1beta1/BUILD.bazel
index 13f33e046..625729680 100644
--- a/google/cloud/vision/v1p1beta1/BUILD.bazel
+++ b/google/cloud/vision/v1p1beta1/BUILD.bazel
@@ -258,7 +258,7 @@ load(
 nodejs_gapic_library(
     name = "vision_nodejs_gapic",
     src = ":vision_proto_with_info",
-    gapic_yaml = "vision_gapic.yaml",
+    grpc_service_config = "vision_grpc_service_config.json",
     package = "google.cloud.vision.v1p1beta1",
     service_yaml = "//google/cloud/vision:vision_v1p1beta1.yaml",
     deps = [],
diff --git a/google/cloud/vision/v1p2beta1/BUILD.bazel b/google/cloud/vision/v1p2beta1/BUILD.bazel
index 27419a3cb..0314eea93 100644
--- a/google/cloud/vision/v1p2beta1/BUILD.bazel
+++ b/google/cloud/vision/v1p2beta1/BUILD.bazel
@@ -129,7 +129,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -267,7 +266,7 @@ load(
 nodejs_gapic_library(
     name = "vision_nodejs_gapic",
     src = ":vision_proto_with_info",
-    gapic_yaml = "vision_gapic.yaml",
+    grpc_service_config = "vision_grpc_service_config.json",
     package = "google.cloud.vision.v1p2beta1",
     service_yaml = "//google/cloud/vision:vision_v1p2beta1.yaml",
     deps = [],
diff --git a/google/cloud/vision/v1p3beta1/BUILD.bazel b/google/cloud/vision/v1p3beta1/BUILD.bazel
index 15d74217d..37612232b 100644
--- a/google/cloud/vision/v1p3beta1/BUILD.bazel
+++ b/google/cloud/vision/v1p3beta1/BUILD.bazel
@@ -135,7 +135,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -276,7 +275,7 @@ load(
 nodejs_gapic_library(
     name = "vision_nodejs_gapic",
     src = ":vision_proto_with_info",
-    gapic_yaml = "vision_gapic.yaml",
+    grpc_service_config = "vision_grpc_service_config.json",
     package = "google.cloud.vision.v1p3beta1",
     service_yaml = "//google/cloud/vision:vision_v1p3beta1.yaml",
     deps = [],
diff --git a/google/cloud/vision/v1p4beta1/BUILD.bazel b/google/cloud/vision/v1p4beta1/BUILD.bazel
index b454a941f..cdc98defc 100644
--- a/google/cloud/vision/v1p4beta1/BUILD.bazel
+++ b/google/cloud/vision/v1p4beta1/BUILD.bazel
@@ -136,7 +136,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -277,7 +276,7 @@ load(
 nodejs_gapic_library(
     name = "vision_nodejs_gapic",
     src = ":vision_proto_with_info",
-    gapic_yaml = "vision_gapic.yaml",
+    grpc_service_config = "vision_grpc_service_config.json",
     package = "google.cloud.vision.v1p4beta1",
     service_yaml = "//google/cloud/vision:vision_v1p4beta1.yaml",
     deps = [],
diff --git a/google/cloud/webrisk/v1/BUILD.bazel b/google/cloud/webrisk/v1/BUILD.bazel
index ea879bbae..1555e73a1 100644
--- a/google/cloud/webrisk/v1/BUILD.bazel
+++ b/google/cloud/webrisk/v1/BUILD.bazel
@@ -250,7 +250,7 @@ load(
 nodejs_gapic_library(
     name = "webrisk_nodejs_gapic",
     src = ":webrisk_proto_with_info",
-    gapic_yaml = "webrisk_gapic.yaml",
+    grpc_service_config = "webrisk_grpc_service_config.json",
     package = "google.cloud.webrisk.v1",
     service_yaml = "webrisk_v1.yaml",
     deps = [],
diff --git a/google/cloud/webrisk/v1beta1/BUILD.bazel b/google/cloud/webrisk/v1beta1/BUILD.bazel
index a42686c83..80a833cd1 100644
--- a/google/cloud/webrisk/v1beta1/BUILD.bazel
+++ b/google/cloud/webrisk/v1beta1/BUILD.bazel
@@ -248,7 +248,7 @@ load(
 nodejs_gapic_library(
     name = "webrisk_nodejs_gapic",
     src = ":webrisk_proto_with_info",
-    gapic_yaml = "webrisk_gapic.yaml",
+    grpc_service_config = "webrisk_grpc_service_config.json",
     package = "google.cloud.webrisk.v1beta1",
     service_yaml = "webrisk_v1beta1.yaml",
     deps = [],
diff --git a/google/cloud/websecurityscanner/v1/BUILD.bazel b/google/cloud/websecurityscanner/v1/BUILD.bazel
index 292f3d473..86895f944 100644
--- a/google/cloud/websecurityscanner/v1/BUILD.bazel
+++ b/google/cloud/websecurityscanner/v1/BUILD.bazel
@@ -263,7 +263,7 @@ load(
 nodejs_gapic_library(
     name = "websecurityscanner_nodejs_gapic",
     src = ":websecurityscanner_proto_with_info",
-    gapic_yaml = "websecurityscanner_gapic.yaml",
+    grpc_service_config = "websecurityscanner_grpc_service_config.json",
     package = "google.cloud.websecurityscanner.v1",
     service_yaml = "websecurityscanner_v1.yaml",
     deps = [],
diff --git a/google/cloud/websecurityscanner/v1alpha/BUILD.bazel b/google/cloud/websecurityscanner/v1alpha/BUILD.bazel
index d94c332d1..247900917 100644
--- a/google/cloud/websecurityscanner/v1alpha/BUILD.bazel
+++ b/google/cloud/websecurityscanner/v1alpha/BUILD.bazel
@@ -260,7 +260,7 @@ load(
 nodejs_gapic_library(
     name = "websecurityscanner_nodejs_gapic",
     src = ":websecurityscanner_proto_with_info",
-    gapic_yaml = "websecurityscanner_gapic.yaml",
+    grpc_service_config = "websecurityscanner_grpc_service_config.json",
     package = "google.cloud.websecurityscanner.v1alpha",
     service_yaml = "websecurityscanner_v1alpha.yaml",
     deps = [],
diff --git a/google/cloud/websecurityscanner/v1beta/BUILD.bazel b/google/cloud/websecurityscanner/v1beta/BUILD.bazel
index 1bbf53867..eb44bcab7 100644
--- a/google/cloud/websecurityscanner/v1beta/BUILD.bazel
+++ b/google/cloud/websecurityscanner/v1beta/BUILD.bazel
@@ -263,7 +263,7 @@ load(
 nodejs_gapic_library(
     name = "websecurityscanner_nodejs_gapic",
     src = ":websecurityscanner_proto_with_info",
-    gapic_yaml = "websecurityscanner_gapic.yaml",
+    grpc_service_config = "websecurityscanner_grpc_service_config.json",
     package = "google.cloud.websecurityscanner.v1beta",
     service_yaml = "websecurityscanner_v1beta.yaml",
     deps = [],
diff --git a/google/container/v1/BUILD.bazel b/google/container/v1/BUILD.bazel
index 9d0e279d9..10e5eaeec 100644
--- a/google/container/v1/BUILD.bazel
+++ b/google/container/v1/BUILD.bazel
@@ -250,7 +250,7 @@ load(
 nodejs_gapic_library(
     name = "container_nodejs_gapic",
     src = ":container_proto_with_info",
-    gapic_yaml = "container_gapic.yaml",
+    grpc_service_config = "container_grpc_service_config.json",
     package = "google.container.v1",
     service_yaml = "container_v1.yaml",
     deps = [],
diff --git a/google/container/v1/cluster_service.proto b/google/container/v1/cluster_service.proto
index 3a798ca12..6363fc949 100644
--- a/google/container/v1/cluster_service.proto
+++ b/google/container/v1/cluster_service.proto
@@ -989,7 +989,7 @@ message Cluster {
   string description = 2;
 
   // The number of nodes to create in this cluster. You must ensure that your
-  // Compute Engine resource quota
+  // Compute Engine [resource quota](https://cloud.google.com/compute/quotas)
   // is sufficient for this number of instances. You must also have available
   // firewall and routes quota.
   // For requests, this field should only be used in lieu of a
@@ -2087,7 +2087,7 @@ message NodePool {
   NodeConfig config = 2;
 
   // The initial node count for the pool. You must ensure that your
-  // Compute Engine resource quota
+  // Compute Engine [resource quota](https://cloud.google.com/compute/quotas)
   // is sufficient for this number of instances. You must also have available
   // firewall and routes quota.
   int32 initial_node_count = 3;
diff --git a/google/container/v1beta1/BUILD.bazel b/google/container/v1beta1/BUILD.bazel
index 113720e78..0e14b6d18 100644
--- a/google/container/v1beta1/BUILD.bazel
+++ b/google/container/v1beta1/BUILD.bazel
@@ -250,7 +250,7 @@ load(
 nodejs_gapic_library(
     name = "container_nodejs_gapic",
     src = ":container_proto_with_info",
-    gapic_yaml = "container_gapic.yaml",
+    grpc_service_config = "container_grpc_service_config.json",
     package = "google.container.v1beta1",
     service_yaml = "container_v1beta1.yaml",
     deps = [],
diff --git a/google/container/v1beta1/cluster_service.proto b/google/container/v1beta1/cluster_service.proto
index 711ea2a9b..f43de9df0 100644
--- a/google/container/v1beta1/cluster_service.proto
+++ b/google/container/v1beta1/cluster_service.proto
@@ -1026,7 +1026,7 @@ message Cluster {
   string description = 2;
 
   // The number of nodes to create in this cluster. You must ensure that your
-  // Compute Engine resource quota
+  // Compute Engine [resource quota](https://cloud.google.com/compute/quotas)
   // is sufficient for this number of instances. You must also have available
   // firewall and routes quota.
   // For requests, this field should only be used in lieu of a
@@ -2376,7 +2376,7 @@ message NodePool {
   NodeConfig config = 2;
 
   // The initial node count for the pool. You must ensure that your
-  // Compute Engine resource quota
+  // Compute Engine [resource quota](https://cloud.google.com/compute/quotas)
   // is sufficient for this number of instances. You must also have available
   // firewall and routes quota.
   int32 initial_node_count = 3;
diff --git a/google/datastore/admin/v1/BUILD.bazel b/google/datastore/admin/v1/BUILD.bazel
index 9f001d168..112c15308 100644
--- a/google/datastore/admin/v1/BUILD.bazel
+++ b/google/datastore/admin/v1/BUILD.bazel
@@ -121,7 +121,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -256,7 +255,7 @@ load(
 nodejs_gapic_library(
     name = "admin_nodejs_gapic",
     src = ":admin_proto_with_info",
-    gapic_yaml = "datastore_admin_gapic.yaml",
+    grpc_service_config = "datastore_admin_grpc_service_config.json",
     package = "google.datastore.admin.v1",
     service_yaml = "datastore_admin_v1.yaml",
     deps = [],
diff --git a/google/datastore/admin/v1/datastore_admin.proto b/google/datastore/admin/v1/datastore_admin.proto
index 849b1453d..c0f470766 100644
--- a/google/datastore/admin/v1/datastore_admin.proto
+++ b/google/datastore/admin/v1/datastore_admin.proto
@@ -28,6 +28,7 @@ option go_package = "google.golang.org/genproto/googleapis/datastore/admin/v1;ad
 option java_multiple_files = true;
 option java_outer_classname = "DatastoreAdminProto";
 option java_package = "com.google.datastore.admin.v1";
+option ruby_package = "Google::Cloud::Datastore::Admin::V1";
 
 // Google Cloud Datastore Admin API
 //
diff --git a/google/datastore/admin/v1/index.proto b/google/datastore/admin/v1/index.proto
index 8907ae0b1..96c2278b3 100644
--- a/google/datastore/admin/v1/index.proto
+++ b/google/datastore/admin/v1/index.proto
@@ -24,6 +24,7 @@ option go_package = "google.golang.org/genproto/googleapis/datastore/admin/v1;ad
 option java_multiple_files = true;
 option java_outer_classname = "IndexProto";
 option java_package = "com.google.datastore.admin.v1";
+option ruby_package = "Google::Cloud::Datastore::Admin::V1";
 
 // A minimal index definition.
 message Index {
diff --git a/google/datastore/admin/v1beta1/datastore_admin.proto b/google/datastore/admin/v1beta1/datastore_admin.proto
index b18591f2f..67753dcec 100644
--- a/google/datastore/admin/v1beta1/datastore_admin.proto
+++ b/google/datastore/admin/v1beta1/datastore_admin.proto
@@ -25,6 +25,7 @@ option go_package = "google.golang.org/genproto/googleapis/datastore/admin/v1bet
 option java_multiple_files = true;
 option java_outer_classname = "DatastoreAdminProto";
 option java_package = "com.google.datastore.admin.v1beta1";
+option ruby_package = "Google::Cloud::Datastore::Admin::V1beta1";
 
 // Google Cloud Datastore Admin API
 //
diff --git a/google/datastore/v1/BUILD.bazel b/google/datastore/v1/BUILD.bazel
index e7a5111c9..503509092 100644
--- a/google/datastore/v1/BUILD.bazel
+++ b/google/datastore/v1/BUILD.bazel
@@ -257,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "datastore_nodejs_gapic",
     src = ":datastore_proto_with_info",
-    gapic_yaml = "datastore_gapic.yaml",
+    grpc_service_config = "datastore_grpc_service_config.json",
     package = "google.datastore.v1",
     service_yaml = "datastore_v1.yaml",
     deps = [],
diff --git a/google/datastore/v1/datastore.proto b/google/datastore/v1/datastore.proto
index 0df65c447..ad016194a 100644
--- a/google/datastore/v1/datastore.proto
+++ b/google/datastore/v1/datastore.proto
@@ -28,6 +28,7 @@ option java_multiple_files = true;
 option java_outer_classname = "DatastoreProto";
 option java_package = "com.google.datastore.v1";
 option php_namespace = "Google\\Cloud\\Datastore\\V1";
+option ruby_package = "Google::Cloud::Datastore::V1";
 
 // Each RPC normalizes the partition IDs of the keys in its input entities,
 // and always returns entities with keys with normalized partition IDs.
diff --git a/google/datastore/v1/entity.proto b/google/datastore/v1/entity.proto
index dc3a60120..61286cd7a 100644
--- a/google/datastore/v1/entity.proto
+++ b/google/datastore/v1/entity.proto
@@ -27,6 +27,7 @@ option java_multiple_files = true;
 option java_outer_classname = "EntityProto";
 option java_package = "com.google.datastore.v1";
 option php_namespace = "Google\\Cloud\\Datastore\\V1";
+option ruby_package = "Google::Cloud::Datastore::V1";
 
 // A partition ID identifies a grouping of entities. The grouping is always
 // by project and namespace, however the namespace ID may be empty.
diff --git a/google/datastore/v1/query.proto b/google/datastore/v1/query.proto
index ef9f1c658..4cb3ef99b 100644
--- a/google/datastore/v1/query.proto
+++ b/google/datastore/v1/query.proto
@@ -27,6 +27,7 @@ option java_multiple_files = true;
 option java_outer_classname = "QueryProto";
 option java_package = "com.google.datastore.v1";
 option php_namespace = "Google\\Cloud\\Datastore\\V1";
+option ruby_package = "Google::Cloud::Datastore::V1";
 
 // The result of fetching an entity from Datastore.
 message EntityResult {
diff --git a/google/datastore/v1beta3/datastore.proto b/google/datastore/v1beta3/datastore.proto
index 54a0273a5..1dadfda56 100644
--- a/google/datastore/v1beta3/datastore.proto
+++ b/google/datastore/v1beta3/datastore.proto
@@ -26,6 +26,7 @@ option java_multiple_files = true;
 option java_outer_classname = "DatastoreProto";
 option java_package = "com.google.datastore.v1beta3";
 option php_namespace = "Google\\Cloud\\Datastore\\V1beta3";
+option ruby_package = "Google::Cloud::Datastore::V1beta3";
 
 // Each RPC normalizes the partition IDs of the keys in its input entities,
 // and always returns entities with keys with normalized partition IDs.
diff --git a/google/datastore/v1beta3/entity.proto b/google/datastore/v1beta3/entity.proto
index 070036e3f..5d2fca2fc 100644
--- a/google/datastore/v1beta3/entity.proto
+++ b/google/datastore/v1beta3/entity.proto
@@ -27,6 +27,7 @@ option java_multiple_files = true;
 option java_outer_classname = "EntityProto";
 option java_package = "com.google.datastore.v1beta3";
 option php_namespace = "Google\\Cloud\\Datastore\\V1beta3";
+option ruby_package = "Google::Cloud::Datastore::V1beta3";
 
 // A partition ID identifies a grouping of entities. The grouping is always
 // by project and namespace, however the namespace ID may be empty.
diff --git a/google/datastore/v1beta3/query.proto b/google/datastore/v1beta3/query.proto
index c6aaea336..4a7c5b6d4 100644
--- a/google/datastore/v1beta3/query.proto
+++ b/google/datastore/v1beta3/query.proto
@@ -27,6 +27,7 @@ option java_multiple_files = true;
 option java_outer_classname = "QueryProto";
 option java_package = "com.google.datastore.v1beta3";
 option php_namespace = "Google\\Cloud\\Datastore\\V1beta3";
+option ruby_package = "Google::Cloud::Datastore::V1beta3";
 
 // The result of fetching an entity from Datastore.
 message EntityResult {
diff --git a/google/devtools/build/v1/BUILD.bazel b/google/devtools/build/v1/BUILD.bazel
index b2b2c88be..b027d0ed8 100644
--- a/google/devtools/build/v1/BUILD.bazel
+++ b/google/devtools/build/v1/BUILD.bazel
@@ -259,7 +259,7 @@ load(
 nodejs_gapic_library(
     name = "build_nodejs_gapic",
     src = ":build_proto_with_info",
-    gapic_yaml = "buildeventservice_gapic.yaml",
+    grpc_service_config = "buildeventservice_grpc_service_config.json",
     package = "google.devtools.build.v1",
     service_yaml = "buildeventservice_v1.yaml",
     deps = [],
diff --git a/google/devtools/cloudbuild/v1/BUILD.bazel b/google/devtools/cloudbuild/v1/BUILD.bazel
index 789f14f84..a9bf8330f 100644
--- a/google/devtools/cloudbuild/v1/BUILD.bazel
+++ b/google/devtools/cloudbuild/v1/BUILD.bazel
@@ -122,7 +122,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
         "@io_bazel_rules_go//proto/wkt:duration_go_proto",
     ],
 )
@@ -261,7 +260,7 @@ load(
 nodejs_gapic_library(
     name = "cloudbuild_nodejs_gapic",
     src = ":cloudbuild_proto_with_info",
-    gapic_yaml = "cloudbuild_gapic.yaml",
+    grpc_service_config = "cloudbuild_grpc_service_config.json",
     package = "google.devtools.cloudbuild.v1",
     service_yaml = "cloudbuild_v1.yaml",
     deps = [],
diff --git a/google/devtools/clouddebugger/v2/BUILD.bazel b/google/devtools/clouddebugger/v2/BUILD.bazel
index 7be200131..205d19c61 100644
--- a/google/devtools/clouddebugger/v2/BUILD.bazel
+++ b/google/devtools/clouddebugger/v2/BUILD.bazel
@@ -266,7 +266,7 @@ load(
 nodejs_gapic_library(
     name = "clouddebugger_nodejs_gapic",
     src = ":clouddebugger_proto_with_info",
-    gapic_yaml = "clouddebugger_gapic.yaml",
+    grpc_service_config = "clouddebugger_grpc_service_config.json",
     package = "google.devtools.clouddebugger.v2",
     service_yaml = "clouddebugger_v2.yaml",
     deps = [],
diff --git a/google/devtools/clouddebugger/v2/controller.proto b/google/devtools/clouddebugger/v2/controller.proto
index 8cb5fd0c6..ba620653f 100644
--- a/google/devtools/clouddebugger/v2/controller.proto
+++ b/google/devtools/clouddebugger/v2/controller.proto
@@ -29,6 +29,7 @@ option java_multiple_files = true;
 option java_outer_classname = "ControllerProto";
 option java_package = "com.google.devtools.clouddebugger.v2";
 option php_namespace = "Google\\Cloud\\Debugger\\V2";
+option ruby_package = "Google::Cloud::Debugger::V2";
 
 // The Controller service provides the API for orchestrating a collection of
 // debugger agents to perform debugging tasks. These agents are each attached
diff --git a/google/devtools/clouddebugger/v2/data.proto b/google/devtools/clouddebugger/v2/data.proto
index 863385717..a9008b172 100644
--- a/google/devtools/clouddebugger/v2/data.proto
+++ b/google/devtools/clouddebugger/v2/data.proto
@@ -29,6 +29,7 @@ option java_multiple_files = true;
 option java_outer_classname = "DataProto";
 option java_package = "com.google.devtools.clouddebugger.v2";
 option php_namespace = "Google\\Cloud\\Debugger\\V2";
+option ruby_package = "Google::Cloud::Debugger::V2";
 
 // Represents a message with parameters.
 message FormatMessage {
diff --git a/google/devtools/clouddebugger/v2/debugger.proto b/google/devtools/clouddebugger/v2/debugger.proto
index 546570e73..af5848f6e 100644
--- a/google/devtools/clouddebugger/v2/debugger.proto
+++ b/google/devtools/clouddebugger/v2/debugger.proto
@@ -29,6 +29,7 @@ option java_multiple_files = true;
 option java_outer_classname = "DebuggerProto";
 option java_package = "com.google.devtools.clouddebugger.v2";
 option php_namespace = "Google\\Cloud\\Debugger\\V2";
+option ruby_package = "Google::Cloud::Debugger::V2";
 
 // The Debugger service provides the API that allows users to collect run-time
 // information from a running application, without stopping or slowing it down
diff --git a/google/devtools/clouderrorreporting/v1beta1/BUILD.bazel b/google/devtools/clouderrorreporting/v1beta1/BUILD.bazel
index d78bcd0f3..2ec1e8324 100644
--- a/google/devtools/clouderrorreporting/v1beta1/BUILD.bazel
+++ b/google/devtools/clouderrorreporting/v1beta1/BUILD.bazel
@@ -258,7 +258,7 @@ load(
 nodejs_gapic_library(
     name = "clouderrorreporting_nodejs_gapic",
     src = ":clouderrorreporting_proto_with_info",
-    gapic_yaml = "errorreporting_gapic.yaml",
+    grpc_service_config = "errorreporting_grpc_service_config.json",
     package = "google.devtools.clouderrorreporting.v1beta1",
     service_yaml = "clouderrorreporting_v1beta1.yaml",
     deps = [],
diff --git a/google/devtools/clouderrorreporting/v1beta1/common.proto b/google/devtools/clouderrorreporting/v1beta1/common.proto
index 5a4f02523..7a1d20037 100644
--- a/google/devtools/clouderrorreporting/v1beta1/common.proto
+++ b/google/devtools/clouderrorreporting/v1beta1/common.proto
@@ -27,6 +27,7 @@ option java_multiple_files = true;
 option java_outer_classname = "CommonProto";
 option java_package = "com.google.devtools.clouderrorreporting.v1beta1";
 option php_namespace = "Google\\Cloud\\ErrorReporting\\V1beta1";
+option ruby_package = "Google::Cloud::ErrorReporting::V1beta1";
 
 // Description of a group of similar error events.
 message ErrorGroup {
@@ -50,7 +51,7 @@ message ErrorGroup {
 // Information related to tracking the progress on resolving the error.
 message TrackingIssue {
   // A URL pointing to a related entry in an issue tracking system.
-  // Example: https://github.com/user/project/issues/4
+  // Example: `https://github.com/user/project/issues/4`
   string url = 1;
 }
 
diff --git a/google/devtools/clouderrorreporting/v1beta1/error_group_service.proto b/google/devtools/clouderrorreporting/v1beta1/error_group_service.proto
index ab14ab316..18182729e 100644
--- a/google/devtools/clouderrorreporting/v1beta1/error_group_service.proto
+++ b/google/devtools/clouderrorreporting/v1beta1/error_group_service.proto
@@ -30,6 +30,7 @@ option java_multiple_files = true;
 option java_outer_classname = "ErrorGroupServiceProto";
 option java_package = "com.google.devtools.clouderrorreporting.v1beta1";
 option php_namespace = "Google\\Cloud\\ErrorReporting\\V1beta1";
+option ruby_package = "Google::Cloud::ErrorReporting::V1beta1";
 
 // Service for retrieving and updating individual error groups.
 service ErrorGroupService {
@@ -57,14 +58,12 @@ service ErrorGroupService {
 
 // A request to return an individual group.
 message GetGroupRequest {
-  // Required. The group resource name. Written as
-  // projects/projectID/groups/group_name.
-  // Call
-  // 
-  // groupStats.list to return a list of groups belonging to
-  // this project.
+  // The group resource name. Written as
+  // `projects/{projectID}/groups/{group_name}`. Call
+  // [`groupStats.list`](https://cloud.google.com/error-reporting/reference/rest/v1beta1/projects.groupStats/list)
+  // to return a list of groups belonging to this project.
   //
-  // Example: projects/my-project-123/groups/my-group
+  // Example: `projects/my-project-123/groups/my-group`
   string group_name = 1 [
     (google.api.field_behavior) = REQUIRED,
     (google.api.resource_reference) = {
diff --git a/google/devtools/clouderrorreporting/v1beta1/error_stats_service.proto b/google/devtools/clouderrorreporting/v1beta1/error_stats_service.proto
index 8f4c909e2..0773f488d 100644
--- a/google/devtools/clouderrorreporting/v1beta1/error_stats_service.proto
+++ b/google/devtools/clouderrorreporting/v1beta1/error_stats_service.proto
@@ -32,6 +32,7 @@ option java_multiple_files = true;
 option java_outer_classname = "ErrorStatsServiceProto";
 option java_package = "com.google.devtools.clouderrorreporting.v1beta1";
 option php_namespace = "Google\\Cloud\\ErrorReporting\\V1beta1";
+option ruby_package = "Google::Cloud::ErrorReporting::V1beta1";
 
 // An API for retrieving and managing error statistics as well as data for
 // individual events.
diff --git a/google/devtools/clouderrorreporting/v1beta1/report_errors_service.proto b/google/devtools/clouderrorreporting/v1beta1/report_errors_service.proto
index fe80fcef0..f46f546d8 100644
--- a/google/devtools/clouderrorreporting/v1beta1/report_errors_service.proto
+++ b/google/devtools/clouderrorreporting/v1beta1/report_errors_service.proto
@@ -31,6 +31,7 @@ option java_multiple_files = true;
 option java_outer_classname = "ReportErrorsServiceProto";
 option java_package = "com.google.devtools.clouderrorreporting.v1beta1";
 option php_namespace = "Google\\Cloud\\ErrorReporting\\V1beta1";
+option ruby_package = "Google::Cloud::ErrorReporting::V1beta1";
 
 // An API for reporting error events.
 service ReportErrorsService {
diff --git a/google/devtools/cloudtrace/v1/BUILD.bazel b/google/devtools/cloudtrace/v1/BUILD.bazel
index fd43a7575..13cb57843 100644
--- a/google/devtools/cloudtrace/v1/BUILD.bazel
+++ b/google/devtools/cloudtrace/v1/BUILD.bazel
@@ -252,7 +252,7 @@ load(
 nodejs_gapic_library(
     name = "cloudtrace_nodejs_gapic",
     src = ":cloudtrace_proto_with_info",
-    gapic_yaml = "cloudtrace_gapic.yaml",
+    grpc_service_config = "cloudtrace_grpc_service_config.json",
     package = "google.devtools.cloudtrace.v1",
     service_yaml = "cloudtrace_v1.yaml",
     deps = [],
diff --git a/google/devtools/cloudtrace/v1/trace.proto b/google/devtools/cloudtrace/v1/trace.proto
index 00cc14db3..f5f14129c 100644
--- a/google/devtools/cloudtrace/v1/trace.proto
+++ b/google/devtools/cloudtrace/v1/trace.proto
@@ -29,6 +29,7 @@ option java_multiple_files = true;
 option java_outer_classname = "TraceProto";
 option java_package = "com.google.devtools.cloudtrace.v1";
 option php_namespace = "Google\\Cloud\\Trace\\V1";
+option ruby_package = "Google::Cloud::Trace::V1";
 
 // This file describes an API for collecting and viewing traces and spans
 // within a trace.  A Trace is a collection of spans corresponding to a single
diff --git a/google/devtools/cloudtrace/v2/BUILD.bazel b/google/devtools/cloudtrace/v2/BUILD.bazel
index 0006efaf1..ce4be7388 100644
--- a/google/devtools/cloudtrace/v2/BUILD.bazel
+++ b/google/devtools/cloudtrace/v2/BUILD.bazel
@@ -258,7 +258,7 @@ load(
 nodejs_gapic_library(
     name = "cloudtrace_nodejs_gapic",
     src = ":cloudtrace_proto_with_info",
-    gapic_yaml = "cloudtrace_gapic.yaml",
+    grpc_service_config = "cloudtrace_grpc_service_config.json",
     package = "google.devtools.cloudtrace.v2",
     service_yaml = "cloudtrace_v2.yaml",
     deps = [],
diff --git a/google/devtools/cloudtrace/v2/trace.proto b/google/devtools/cloudtrace/v2/trace.proto
index f5e628329..e7079b038 100644
--- a/google/devtools/cloudtrace/v2/trace.proto
+++ b/google/devtools/cloudtrace/v2/trace.proto
@@ -29,6 +29,7 @@ option java_multiple_files = true;
 option java_outer_classname = "TraceProto";
 option java_package = "com.google.devtools.cloudtrace.v2";
 option php_namespace = "Google\\Cloud\\Trace\\V2";
+option ruby_package = "Google::Cloud::Trace::V2";
 
 // A span represents a single operation within a trace. Spans can be
 // nested to form a trace tree. Often, a trace contains a root span
diff --git a/google/devtools/cloudtrace/v2/tracing.proto b/google/devtools/cloudtrace/v2/tracing.proto
index 966a81791..886f98317 100644
--- a/google/devtools/cloudtrace/v2/tracing.proto
+++ b/google/devtools/cloudtrace/v2/tracing.proto
@@ -31,6 +31,7 @@ option java_multiple_files = true;
 option java_outer_classname = "TracingProto";
 option java_package = "com.google.devtools.cloudtrace.v2";
 option php_namespace = "Google\\Cloud\\Trace\\V2";
+option ruby_package = "Google::Cloud::Trace::V2";
 
 // This file describes an API for collecting and viewing traces and spans
 // within a trace.  A Trace is a collection of spans corresponding to a single
diff --git a/google/devtools/containeranalysis/v1/BUILD.bazel b/google/devtools/containeranalysis/v1/BUILD.bazel
index ee1615f37..3f4b1210e 100644
--- a/google/devtools/containeranalysis/v1/BUILD.bazel
+++ b/google/devtools/containeranalysis/v1/BUILD.bazel
@@ -257,7 +257,7 @@ load(
 nodejs_gapic_library(
     name = "containeranalysis_nodejs_gapic",
     src = ":containeranalysis_proto_with_info",
-    gapic_yaml = "containeranalysis_gapic.yaml",
+    grpc_service_config = "containeranalysis_grpc_service_config.json",
     package = "google.devtools.containeranalysis.v1",
     service_yaml = "containeranalysis_v1.yaml",
     deps = [],
diff --git a/google/devtools/remoteworkers/v1test2/BUILD.bazel b/google/devtools/remoteworkers/v1test2/BUILD.bazel
index 91497a257..3bd386d19 100644
--- a/google/devtools/remoteworkers/v1test2/BUILD.bazel
+++ b/google/devtools/remoteworkers/v1test2/BUILD.bazel
@@ -14,7 +14,6 @@ proto_library(
     srcs = [
         "bots.proto",
         "command.proto",
-        "tasks.proto",
         "worker.proto",
     ],
     deps = [
@@ -79,7 +78,6 @@ java_gapic_test(
     name = "remoteworkers_java_gapic_test_suite",
     test_classes = [
         "com.google.cloud.devtools.remoteworkers.v1test2.BotsClientTest",
-        "com.google.cloud.devtools.remoteworkers.v1test2.TasksClientTest",
     ],
     runtime_deps = [":remoteworkers_java_gapic_test"],
 )
@@ -264,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "remoteworkers_nodejs_gapic",
     src = ":remoteworkers_proto_with_info",
-    gapic_yaml = "remoteworkers_gapic.yaml",
+    grpc_service_config = "remoteworkers_grpc_service_config.json",
     package = "google.devtools.remoteworkers.v1test2",
     service_yaml = "remoteworkers.yaml",
     deps = [],
diff --git a/google/devtools/remoteworkers/v1test2/remote_workers.yaml b/google/devtools/remoteworkers/v1test2/remote_workers.yaml
index 3c8494ef9..5d0554a87 100644
--- a/google/devtools/remoteworkers/v1test2/remote_workers.yaml
+++ b/google/devtools/remoteworkers/v1test2/remote_workers.yaml
@@ -5,7 +5,6 @@ title: Remote Workers API
 
 apis:
 - name: google.devtools.remoteworkers.v1test2.Bots
-- name: google.devtools.remoteworkers.v1test2.Tasks
 
 types:
 - name: google.devtools.remoteworkers.v1test2.AdminTemp
diff --git a/google/devtools/remoteworkers/v1test2/remoteworkers.yaml b/google/devtools/remoteworkers/v1test2/remoteworkers.yaml
index ea05361d9..600e2f82a 100644
--- a/google/devtools/remoteworkers/v1test2/remoteworkers.yaml
+++ b/google/devtools/remoteworkers/v1test2/remoteworkers.yaml
@@ -5,7 +5,6 @@ title: Remote Workers API
 
 apis:
 - name: google.devtools.remoteworkers.v1test2.Bots
-- name: google.devtools.remoteworkers.v1test2.Tasks
 
 types:
 - name: google.devtools.remoteworkers.v1test2.AdminTemp
diff --git a/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.legacy.yaml b/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.legacy.yaml
index 07a21813e..0fc65c9e5 100644
--- a/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.legacy.yaml
+++ b/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.legacy.yaml
@@ -135,137 +135,3 @@ interfaces:
       name: bot_session
     timeout_millis: 60000
   # The fully qualified name of the API interface.
-- name: google.devtools.remoteworkers.v1test2.Tasks
-  # A list of resource collection configurations.
-  # Consists of a name_pattern and an entity_name.
-  # The name_pattern is a pattern to describe the names of the resources of this
-  # collection, using the platform's conventions for URI patterns. A generator
-  # may use this to generate methods to compose and decompose such names. The
-  # pattern should use named placeholders as in `shelves/{shelf}/books/{book}`;
-  # those will be taken as hints for the parameter names of the generated
-  # methods. If empty, no name methods are generated.
-  # The entity_name is the name to be used as a basis for generated methods and
-  # classes.
-  collections:
-  - name_pattern: "{unknown_path=**}/tasks/{task}"
-    entity_name: task
-  - name_pattern: "{unknown_path=**}/tasks/{task}/result"
-    entity_name: task_2
-  # Definition for retryable codes.
-  retry_codes_def:
-  - name: idempotent
-    retry_codes:
-    - UNAVAILABLE
-    - DEADLINE_EXCEEDED
-  - name: non_idempotent
-    retry_codes: []
-  # Definition for retry/backoff parameters.
-  retry_params_def:
-  - name: default
-    initial_retry_delay_millis: 100
-    retry_delay_multiplier: 1.3
-    max_retry_delay_millis: 60000
-    initial_rpc_timeout_millis: 20000
-    rpc_timeout_multiplier: 1
-    max_rpc_timeout_millis: 20000
-    total_timeout_millis: 600000
-  # A list of method configurations.
-  # Common properties:
-  #
-  #   name - The simple name of the method.
-  #
-  #   flattening - Specifies the configuration for parameter flattening.
-  #   Describes the parameter groups for which a generator should produce method
-  #   overloads which allow a client to directly pass request message fields as
-  #   method parameters. This information may or may not be used, depending on
-  #   the target language.
-  #   Consists of groups, which each represent a list of parameters to be
-  #   flattened. Each parameter listed must be a field of the request message.
-  #
-  #   required_fields - Fields that are always required for a request to be
-  #   valid.
-  #
-  #   resource_name_treatment - An enum that specifies how to treat the resource
-  #   name formats defined in the field_name_patterns and
-  #   response_field_name_patterns fields.
-  #   UNSET: default value
-  #   NONE: the collection configs will not be used by the generated code.
-  #   VALIDATE: string fields will be validated by the client against the
-  #   specified resource name formats.
-  #   STATIC_TYPES: the client will use generated types for resource names.
-  #
-  #   page_streaming - Specifies the configuration for paging.
-  #   Describes information for generating a method which transforms a paging
-  #   list RPC into a stream of resources.
-  #   Consists of a request and a response.
-  #   The request specifies request information of the list method. It defines
-  #   which fields match the paging pattern in the request. The request consists
-  #   of a page_size_field and a token_field. The page_size_field is the name of
-  #   the optional field specifying the maximum number of elements to be
-  #   returned in the response. The token_field is the name of the field in the
-  #   request containing the page token.
-  #   The response specifies response information of the list method. It defines
-  #   which fields match the paging pattern in the response. The response
-  #   consists of a token_field and a resources_field. The token_field is the
-  #   name of the field in the response containing the next page token. The
-  #   resources_field is the name of the field in the response containing the
-  #   list of resources belonging to the page.
-  #
-  #   retry_codes_name - Specifies the configuration for retryable codes. The
-  #   name must be defined in interfaces.retry_codes_def.
-  #
-  #   retry_params_name - Specifies the configuration for retry/backoff
-  #   parameters. The name must be defined in interfaces.retry_params_def.
-  #
-  #   field_name_patterns - Maps the field name of the request type to
-  #   entity_name of interfaces.collections.
-  #   Specifies the string pattern that the field must follow.
-  #
-  #   timeout_millis - Specifies the default timeout for a non-retrying call. If
-  #   the call is retrying, refer to retry_params_name instead.
-  methods:
-  - name: GetTask
-    flattening:
-      groups:
-      - parameters:
-        - name
-    required_fields:
-    - name
-    retry_codes_name: idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: task
-    timeout_millis: 60000
-  - name: UpdateTaskResult
-    flattening:
-      groups:
-      - parameters:
-        - name
-        - result
-        - update_mask
-        - source
-    required_fields:
-    - name
-    - result
-    - update_mask
-    - source
-    retry_codes_name: non_idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: task_2
-    timeout_millis: 60000
-  - name: AddTaskLog
-    # params.
-    flattening:
-      groups:
-      - parameters:
-        - name
-        - log_id
-    required_fields:
-    - name
-    - log_id
-    retry_codes_name: non_idempotent
-    retry_params_name: default
-    field_name_patterns:
-      name: task
-    timeout_millis: 60000
diff --git a/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.yaml b/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.yaml
index 171d05a3d..e911f7551 100644
--- a/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.yaml
+++ b/google/devtools/remoteworkers/v1test2/remoteworkers_gapic.yaml
@@ -20,5 +20,3 @@ language_settings:
 interfaces:
   # The fully qualified name of the API interface.
 - name: google.devtools.remoteworkers.v1test2.Bots
-
-- name: google.devtools.remoteworkers.v1test2.Tasks
diff --git a/google/devtools/remoteworkers/v1test2/remoteworkers_grpc_service_config.json b/google/devtools/remoteworkers/v1test2/remoteworkers_grpc_service_config.json
index 351621275..35fdb59e7 100755
--- a/google/devtools/remoteworkers/v1test2/remoteworkers_grpc_service_config.json
+++ b/google/devtools/remoteworkers/v1test2/remoteworkers_grpc_service_config.json
@@ -16,37 +16,6 @@
         }
       ],
       "timeout": "600s"
-    },
-    {
-      "name": [
-        {
-          "service": "google.devtools.remoteworkers.v1test2.Tasks",
-          "method": "GetTask"
-        }
-      ],
-      "timeout": "600s",
-      "retryPolicy": {
-        "initialBackoff": "0.100s",
-        "maxBackoff": "60s",
-        "backoffMultiplier": 1.3,
-        "retryableStatusCodes": [
-          "UNAVAILABLE",
-          "DEADLINE_EXCEEDED"
-        ]
-      }
-    },
-    {
-      "name": [
-        {
-          "service": "google.devtools.remoteworkers.v1test2.Tasks",
-          "method": "UpdateTaskResult"
-        },
-        {
-          "service": "google.devtools.remoteworkers.v1test2.Tasks",
-          "method": "AddTaskLog"
-        }
-      ],
-      "timeout": "600s"
     }
   ]
 }
diff --git a/google/devtools/remoteworkers/v1test2/tasks.proto b/google/devtools/remoteworkers/v1test2/tasks.proto
deleted file mode 100644
index f2e85fd6c..000000000
--- a/google/devtools/remoteworkers/v1test2/tasks.proto
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2019 Google LLC.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-syntax = "proto3";
-
-package google.devtools.remoteworkers.v1test2;
-
-import "google/api/annotations.proto";
-import "google/api/client.proto";
-import "google/api/field_behavior.proto";
-import "google/api/resource.proto";
-import "google/protobuf/any.proto";
-import "google/protobuf/field_mask.proto";
-import "google/rpc/status.proto";
-
-option csharp_namespace = "Google.DevTools.RemoteWorkers.V1Test2";
-option go_package = "google.golang.org/genproto/googleapis/devtools/remoteworkers/v1test2;remoteworkers";
-option java_multiple_files = true;
-option java_outer_classname = "RemoteWorkersTasks";
-option java_package = "com.google.devtools.remoteworkers.v1test2";
-option objc_class_prefix = "RW";
-
-// DEPRECATED. GetTask should be replaced by Lease.payload, UpdateTaskResult by
-// Lease.result and logs should be precreated prior to sending to the bot (eg,
-// via CommandTask.expected_outputs.stdout_destination).
-service Tasks {
-  option (google.api.default_host) = "remoteworkers.googleapis.com";
-
-  // DEPRECATED - use Lease.payload instead.
-  // GetTask reads the current state of the task. Tasks must be created through
-  // some other interface, and should be immutable once created and exposed to
-  // the bots.
-  rpc GetTask(GetTaskRequest) returns (Task) {
-    option (google.api.http) = {
-      get: "/v1test2/{name=**/tasks/*}"
-    };
-    option (google.api.method_signature) = "name";
-  }
-
-  // DEPRECATED - use Lease.result instead.
-  // UpdateTaskResult updates the result.
-  rpc UpdateTaskResult(UpdateTaskResultRequest) returns (TaskResult) {
-    option (google.api.http) = {
-      patch: "/v1test2/{name=**/tasks/*/result}"
-      body: "result"
-    };
-    option (google.api.method_signature) = "name,result,update_mask,source";
-  }
-
-  // DEPRECATED - precreate logs prior to sending to bot.
-  // AddTaskLog creates a new streaming log. The log is streamed and marked as
-  // completed through other interfaces (i.e., ByteStream). This can be called
-  // by the bot if it wants to create a new log; the server can also predefine
-  // logs that do not need to be created (e.g. `stdout`).
-  rpc AddTaskLog(AddTaskLogRequest) returns (AddTaskLogResponse) {
-    option (google.api.http) = {
-      post: "/v1test2/{name=**/tasks/*}:addLog"
-      body: "*"
-    };
-    option (google.api.method_signature) = "name,log_id";
-  }
-}
-
-// DEPRECATED - use Lease.payload instead.
-// A Task represents a unit of work. Its result and logs are defined as
-// subresources.
-//
-// If all the `Any` fields are populated, this can be a very large message, and
-// clients may not want the entire message returned on every call to every
-// method. Such clients should request partial responses
-// (https://cloud.google.com/apis/design/design_patterns#partial_response) and
-// servers should implement partial responses in order to reduce unnecessry
-// overhead.
-message Task {
-  option (google.api.resource) = {
-    type: "remoteworkers.googleapis.com/Task"
-    pattern: "{unknown_path=**}/tasks/{task}"
-  };
-
-  // The name of this task. Output only.
-  string name = 1;
-
-  // The actual task to perform. For example, this could be CommandTask to run a
-  // command line.
-  google.protobuf.Any description = 2;
-
-  // Handles to logs. The key is a human-readable name like `stdout`, and the
-  // handle is a resource name that can be passed to ByteStream or other
-  // accessors.
-  //
-  // An implementation may define some logs by default (like `stdout`), and may
-  // allow clients to add new logs via AddTaskLog.
-  map logs = 3;
-}
-
-// DEPRECATED - use Lease.assignment_result instead.
-// The result and metadata of the task.
-message TaskResult {
-  option (google.api.resource) = {
-    type: "remoteworkers.googleapis.com/TaskResult"
-    pattern: "{unknown_path=**}/tasks/{task}/result"
-  };
-
-  string name = 1;
-
-  // The result may be updated several times; the client must only set
-  // `complete` to true to indicate that no further updates are allowed.
-  // If this is not true, the `status` field must not be examined since its zero
-  // value is equivalent to `OK`.
-  //
-  // Once a task is completed, it must not be updated with further results,
-  // though the implementation may choose to continue to receive logs.
-  bool complete = 2;
-
-  // The final status of the task itself. For example, if task.description
-  // included a timeout which was violated, status.code may be
-  // DEADLINE_EXCEEDED. This field can only be read if `complete` is true.
-  google.rpc.Status status = 3;
-
-  // Any non-log output, such as output files and exit codes. See
-  // CommandResult as an example.
-  google.protobuf.Any output = 4;
-
-  // Any information about how the command was executed, eg runtime. See
-  // CommandOverhead as an example.
-  google.protobuf.Any meta = 5;
-}
-
-// Request message for `GetTask`.
-message GetTaskRequest {
-  // Required. The task name.
-  string name = 1 [
-    (google.api.field_behavior) = REQUIRED,
-    (google.api.resource_reference) = {
-      type: "remoteworkers.googleapis.com/Task"
-    }
-  ];
-}
-
-// Request message for `UpdateTaskResult`.
-message UpdateTaskResultRequest {
-  // Required. The task result name; must match `result.name`.
-  string name = 1 [
-    (google.api.field_behavior) = REQUIRED,
-    (google.api.resource_reference) = {
-      type: "remoteworkers.googleapis.com/TaskResult"
-    }
-  ];
-
-  // Required. The result being updated.
-  TaskResult result = 2 [(google.api.field_behavior) = REQUIRED];
-
-  // Required. The fields within `result` that are specified.
-  google.protobuf.FieldMask update_mask = 3 [(google.api.field_behavior) = REQUIRED];
-
-  // Required. If this is being updated by a bot from BotManager, the source should be
-  // bot.session_id. That way, if two bots accidentally get the same name, we'll
-  // know to reject updates from the older one.
-  string source = 4 [(google.api.field_behavior) = REQUIRED];
-}
-
-// Request message for `AddTaskLog`.
-message AddTaskLogRequest {
-  // Required. The name of the task that will own the new log.
-  string name = 1 [
-    (google.api.field_behavior) = REQUIRED,
-    (google.api.resource_reference) = {
-      type: "remoteworkers.googleapis.com/Task"
-    }
-  ];
-
-  // Required. The human-readable name of the log, like `stdout` or a relative file path.
-  string log_id = 2 [(google.api.field_behavior) = REQUIRED];
-}
-
-// Response message for `AddTaskLog`.
-message AddTaskLogResponse {
-  // The handle for the new log, as would be returned in Task.logs.
-  string handle = 1;
-}
diff --git a/google/example/library/v1/BUILD.bazel b/google/example/library/v1/BUILD.bazel
index d3bdfe61f..45b7a2382 100644
--- a/google/example/library/v1/BUILD.bazel
+++ b/google/example/library/v1/BUILD.bazel
@@ -250,7 +250,7 @@ load(
 nodejs_gapic_library(
     name = "library_nodejs_gapic",
     src = ":library_proto_with_info",
-    gapic_yaml = "library_example_gapic.yaml",
+    grpc_service_config = None,
     package = "google.example.library.v1",
     service_yaml = "//google/example/library:library_example_v1.yaml",
     deps = [],
diff --git a/google/firestore/admin/v1/BUILD.bazel b/google/firestore/admin/v1/BUILD.bazel
index 46291191f..48a2cb4d3 100644
--- a/google/firestore/admin/v1/BUILD.bazel
+++ b/google/firestore/admin/v1/BUILD.bazel
@@ -129,7 +129,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -268,7 +267,7 @@ load(
 nodejs_gapic_library(
     name = "admin_nodejs_gapic",
     src = ":admin_proto_with_info",
-    gapic_yaml = "firestore_gapic.yaml",
+    grpc_service_config = "firestore_admin_grpc_service_config.json",
     package = "google.firestore.admin.v1",
     service_yaml = "//google/firestore/admin:firestore_admin_v1.yaml",
     deps = [],
diff --git a/google/firestore/admin/v1/field.proto b/google/firestore/admin/v1/field.proto
index 48430d87c..1b9b99cf3 100644
--- a/google/firestore/admin/v1/field.proto
+++ b/google/firestore/admin/v1/field.proto
@@ -28,6 +28,7 @@ option java_outer_classname = "FieldProto";
 option java_package = "com.google.firestore.admin.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
+option ruby_package = "Google::Cloud::Firestore::Admin::V1";
 
 // Represents a single field in the database.
 //
diff --git a/google/firestore/admin/v1/firestore_admin.proto b/google/firestore/admin/v1/firestore_admin.proto
index 75dd2d311..c3eb58f9c 100644
--- a/google/firestore/admin/v1/firestore_admin.proto
+++ b/google/firestore/admin/v1/firestore_admin.proto
@@ -34,6 +34,7 @@ option java_outer_classname = "FirestoreAdminProto";
 option java_package = "com.google.firestore.admin.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
+option ruby_package = "Google::Cloud::Firestore::Admin::V1";
 option (google.api.resource_definition) = {
   type: "firestore.googleapis.com/Database"
   pattern: "projects/{project}/databases/{database}"
diff --git a/google/firestore/admin/v1/index.proto b/google/firestore/admin/v1/index.proto
index 4b9c6e35b..e27686be4 100644
--- a/google/firestore/admin/v1/index.proto
+++ b/google/firestore/admin/v1/index.proto
@@ -27,6 +27,7 @@ option java_outer_classname = "IndexProto";
 option java_package = "com.google.firestore.admin.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
+option ruby_package = "Google::Cloud::Firestore::Admin::V1";
 
 // Cloud Firestore indexes enable simple and complex queries against
 // documents in a database.
diff --git a/google/firestore/admin/v1/location.proto b/google/firestore/admin/v1/location.proto
index d9dc6f9b9..e435c6f0d 100644
--- a/google/firestore/admin/v1/location.proto
+++ b/google/firestore/admin/v1/location.proto
@@ -27,6 +27,7 @@ option java_outer_classname = "LocationProto";
 option java_package = "com.google.firestore.admin.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
+option ruby_package = "Google::Cloud::Firestore::Admin::V1";
 
 // The metadata message for [google.cloud.location.Location.metadata][google.cloud.location.Location.metadata].
 message LocationMetadata {
diff --git a/google/firestore/admin/v1/operation.proto b/google/firestore/admin/v1/operation.proto
index 08194fe09..dcdc6ee65 100644
--- a/google/firestore/admin/v1/operation.proto
+++ b/google/firestore/admin/v1/operation.proto
@@ -28,6 +28,7 @@ option java_outer_classname = "OperationProto";
 option java_package = "com.google.firestore.admin.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\Admin\\V1";
+option ruby_package = "Google::Cloud::Firestore::Admin::V1";
 
 // Metadata for [google.longrunning.Operation][google.longrunning.Operation] results from
 // [FirestoreAdmin.CreateIndex][google.firestore.admin.v1.FirestoreAdmin.CreateIndex].
diff --git a/google/firestore/v1/BUILD.bazel b/google/firestore/v1/BUILD.bazel
index 185854651..75c14143e 100644
--- a/google/firestore/v1/BUILD.bazel
+++ b/google/firestore/v1/BUILD.bazel
@@ -264,7 +264,7 @@ load(
 nodejs_gapic_library(
     name = "firestore_nodejs_gapic",
     src = ":firestore_proto_with_info",
-    gapic_yaml = "firestore_gapic.yaml",
+    grpc_service_config = "firestore_grpc_service_config.json",
     package = "google.firestore.v1",
     service_yaml = "//google/firestore:firestore_v1.yaml",
     deps = [],
diff --git a/google/firestore/v1/common.proto b/google/firestore/v1/common.proto
index b6de070a5..4367f168d 100644
--- a/google/firestore/v1/common.proto
+++ b/google/firestore/v1/common.proto
@@ -26,6 +26,7 @@ option java_outer_classname = "CommonProto";
 option java_package = "com.google.firestore.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1";
+option ruby_package = "Google::Cloud::Firestore::V1";
 
 // A set of field paths on a document.
 // Used to restrict a get or update operation on a document to a subset of its
diff --git a/google/firestore/v1/document.proto b/google/firestore/v1/document.proto
index 43f69478e..148d2bddd 100644
--- a/google/firestore/v1/document.proto
+++ b/google/firestore/v1/document.proto
@@ -28,6 +28,7 @@ option java_outer_classname = "DocumentProto";
 option java_package = "com.google.firestore.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1";
+option ruby_package = "Google::Cloud::Firestore::V1";
 
 // A Firestore document.
 //
diff --git a/google/firestore/v1/firestore.proto b/google/firestore/v1/firestore.proto
index 5f9b6d732..ee32c410c 100644
--- a/google/firestore/v1/firestore.proto
+++ b/google/firestore/v1/firestore.proto
@@ -34,6 +34,7 @@ option java_outer_classname = "FirestoreProto";
 option java_package = "com.google.firestore.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1";
+option ruby_package = "Google::Cloud::Firestore::V1";
 
 // Specification of the Firestore API.
 
@@ -132,6 +133,20 @@ service Firestore {
     };
   }
 
+  // Partitions a query by returning partition cursors that can be used to run
+  // the query in parallel. The returned partition cursors are split points that
+  // can be used by RunQuery as starting/end points for the query results.
+  rpc PartitionQuery(PartitionQueryRequest) returns (PartitionQueryResponse) {
+    option (google.api.http) = {
+      post: "/v1/{parent=projects/*/databases/*/documents}:partitionQuery"
+      body: "*"
+      additional_bindings {
+        post: "/v1/{parent=projects/*/databases/*/documents/*/**}:partitionQuery"
+        body: "*"
+      }
+    };
+  }
+
   // Streams batches of document updates and deletes, in order.
   rpc Write(stream WriteRequest) returns (stream WriteResponse) {
     option (google.api.http) = {
@@ -161,6 +176,22 @@ service Firestore {
     option (google.api.method_signature) = "parent";
   }
 
+  // Applies a batch of write operations.
+  //
+  // The BatchWrite method does not apply the write operations atomically
+  // and can apply them out of order. Method does not allow more than one write
+  // per document. Each write succeeds or fails independently. See the
+  // [BatchWriteResponse][google.firestore.v1.BatchWriteResponse] for the success status of each write.
+  //
+  // If you require an atomically applied set of writes, use
+  // [Commit][google.firestore.v1.Firestore.Commit] instead.
+  rpc BatchWrite(BatchWriteRequest) returns (BatchWriteResponse) {
+    option (google.api.http) = {
+      post: "/v1/{database=projects/*/databases/*}/documents:batchWrite"
+      body: "*"
+    };
+  }
+
   // Creates a new document.
   rpc CreateDocument(CreateDocumentRequest) returns (Document) {
     option (google.api.http) = {
@@ -189,7 +220,7 @@ message GetDocumentRequest {
     bytes transaction = 3;
 
     // Reads the version of the document at the given time.
-    // This may not be older than 60 seconds.
+    // This may not be older than 270 seconds.
     google.protobuf.Timestamp read_time = 5;
   }
 }
@@ -230,7 +261,7 @@ message ListDocumentsRequest {
     bytes transaction = 8;
 
     // Reads documents as they were at the given time.
-    // This may not be older than 60 seconds.
+    // This may not be older than 270 seconds.
     google.protobuf.Timestamp read_time = 10;
   }
 
@@ -346,7 +377,7 @@ message BatchGetDocumentsRequest {
     TransactionOptions new_transaction = 5;
 
     // Reads documents as they were at the given time.
-    // This may not be older than 60 seconds.
+    // This may not be older than 270 seconds.
     google.protobuf.Timestamp read_time = 7;
   }
 }
@@ -460,7 +491,7 @@ message RunQueryRequest {
     TransactionOptions new_transaction = 6;
 
     // Reads documents as they were at the given time.
-    // This may not be older than 60 seconds.
+    // This may not be older than 270 seconds.
     google.protobuf.Timestamp read_time = 7;
   }
 }
@@ -491,6 +522,81 @@ message RunQueryResponse {
   int32 skipped_results = 4;
 }
 
+// The request for [Firestore.PartitionQuery][google.firestore.v1.Firestore.PartitionQuery].
+message PartitionQueryRequest {
+  // Required. The parent resource name. In the format:
+  // `projects/{project_id}/databases/{database_id}/documents`.
+  // Document resource names are not supported; only database resource names
+  // can be specified.
+  string parent = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // The query to partition.
+  oneof query_type {
+    // A structured query.
+    // Filters, order bys, limits, offsets, and start/end cursors are not
+    // supported.
+    StructuredQuery structured_query = 2;
+  }
+
+  // The desired maximum number of partition points.
+  // The partitions may be returned across multiple pages of results.
+  // The number must be strictly positive. The actual number of partitions
+  // returned may be fewer.
+  //
+  // For example, this may be set to one fewer than the number of parallel
+  // queries to be run, or in running a data pipeline job, one fewer than the
+  // number of workers or compute instances available.
+  int64 partition_count = 3;
+
+  // The `next_page_token` value returned from a previous call to
+  // PartitionQuery that may be used to get an additional set of results.
+  // There are no ordering guarantees between sets of results. Thus, using
+  // multiple sets of results will require merging the different result sets.
+  //
+  // For example, two subsequent calls using a page_token may return:
+  //
+  //  * cursor B, cursor M, cursor Q
+  //  * cursor A, cursor U, cursor W
+  //
+  // To obtain a complete result set ordered with respect to the results of the
+  // query supplied to PartitionQuery, the results sets should be merged:
+  // cursor A, cursor B, cursor M, cursor Q, cursor U, cursor W
+  string page_token = 4;
+
+  // The maximum number of partitions to return in this call, subject to
+  // `partition_count`.
+  //
+  // For example, if `partition_count` = 10 and `page_size` = 8, the first call
+  // to PartitionQuery will return up to 8 partitions and a `next_page_token`
+  // if more results exist. A second call to PartitionQuery will return up to
+  // 2 partitions, to complete the total of 10 specified in `partition_count`.
+  int32 page_size = 5;
+}
+
+// The response for [Firestore.PartitionQuery][google.firestore.v1.Firestore.PartitionQuery].
+message PartitionQueryResponse {
+  // Partition results.
+  // Each partition is a split point that can be used by RunQuery as a starting
+  // or end point for the query results. The RunQuery requests must be made with
+  // the same query supplied to this PartitionQuery request. The partition
+  // cursors will be ordered according to same ordering as the results of the
+  // query supplied to PartitionQuery.
+  //
+  // For example, if a PartitionQuery request returns partition cursors A and B,
+  // running the following three queries will return the entire result set of
+  // the original query:
+  //
+  //  * query, end_at A
+  //  * query, start_at A, end_at B
+  //  * query, start_at B
+  repeated Cursor partitions = 1;
+
+  // A page token that may be used to request an additional set of results, up
+  // to the number specified by `partition_count` in the PartitionQuery request.
+  // If blank, there are no more results.
+  string next_page_token = 2;
+}
+
 // The request for [Firestore.Write][google.firestore.v1.Firestore.Write].
 //
 // The first request creates a stream, or resumes an existing one from a token.
@@ -756,3 +862,35 @@ message ListCollectionIdsResponse {
   // A page token that may be used to continue the list.
   string next_page_token = 2;
 }
+
+// The request for [Firestore.BatchWrite][google.firestore.v1.Firestore.BatchWrite].
+message BatchWriteRequest {
+  // Required. The database name. In the format:
+  // `projects/{project_id}/databases/{database_id}`.
+  string database = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // The writes to apply.
+  //
+  // Method does not apply writes atomically and does not guarantee ordering.
+  // Each write succeeds or fails independently. You cannot write to the same
+  // document more than once per request.
+  repeated Write writes = 2;
+
+  // Labels associated with this batch write.
+  map labels = 3;
+}
+
+// The response from [Firestore.BatchWrite][google.firestore.v1.Firestore.BatchWrite].
+message BatchWriteResponse {
+  // The result of applying the writes.
+  //
+  // This i-th write result corresponds to the i-th write in the
+  // request.
+  repeated WriteResult write_results = 1;
+
+  // The status of applying the writes.
+  //
+  // This i-th write status corresponds to the i-th write in the
+  // request.
+  repeated google.rpc.Status status = 2;
+}
diff --git a/google/firestore/v1/firestore_grpc_service_config.json b/google/firestore/v1/firestore_grpc_service_config.json
index 0c6f86d9c..ee7cdeccd 100755
--- a/google/firestore/v1/firestore_grpc_service_config.json
+++ b/google/firestore/v1/firestore_grpc_service_config.json
@@ -15,7 +15,16 @@
           "method": "Commit"
         }
       ],
-      "timeout": "60s"
+      "timeout": "60s",
+      "retryPolicy": {
+        "maxAttempts": 5,
+        "initialBackoff": "0.100s",
+        "maxBackoff": "60s",
+        "backoffMultiplier": 1.3,
+        "retryableStatusCodes": [
+          "UNAVAILABLE"
+        ]
+      }
     },
     {
       "name": [
diff --git a/google/firestore/v1/query.proto b/google/firestore/v1/query.proto
index 226d32418..557fbad1b 100644
--- a/google/firestore/v1/query.proto
+++ b/google/firestore/v1/query.proto
@@ -27,6 +27,7 @@ option java_outer_classname = "QueryProto";
 option java_package = "com.google.firestore.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1";
+option ruby_package = "Google::Cloud::Firestore::V1";
 
 // A Firestore query.
 message StructuredQuery {
@@ -83,31 +84,55 @@ message StructuredQuery {
       // Unspecified. This value must not be used.
       OPERATOR_UNSPECIFIED = 0;
 
-      // Less than. Requires that the field come first in `order_by`.
+      // The given `field` is less than the given `value`.
+      //
+      // Requires:
+      //
+      // * That `field` come first in `order_by`.
       LESS_THAN = 1;
 
-      // Less than or equal. Requires that the field come first in `order_by`.
+      // The given `field` is less than or equal to the given `value`.
+      //
+      // Requires:
+      //
+      // * That `field` come first in `order_by`.
       LESS_THAN_OR_EQUAL = 2;
 
-      // Greater than. Requires that the field come first in `order_by`.
+      // The given `field` is greater than the given `value`.
+      //
+      // Requires:
+      //
+      // * That `field` come first in `order_by`.
       GREATER_THAN = 3;
 
-      // Greater than or equal. Requires that the field come first in
-      // `order_by`.
+      // The given `field` is greater than or equal to the given `value`.
+      //
+      // Requires:
+      //
+      // * That `field` come first in `order_by`.
       GREATER_THAN_OR_EQUAL = 4;
 
-      // Equal.
+      // The given `field` is equal to the given `value`.
       EQUAL = 5;
 
-      // Contains. Requires that the field is an array.
+      // The given `field` is an array that contains the given `value`.
       ARRAY_CONTAINS = 7;
 
-      // In. Requires that `value` is a non-empty ArrayValue with at most 10
-      // values.
+      // The given `field` is equal to at least one value in the given array.
+      //
+      // Requires:
+      //
+      // * That `value` is a non-empty `ArrayValue` with at most 10 values.
+      // * No other `IN`, `ARRAY_CONTAINS_ANY`, or `NOT_IN`.
       IN = 8;
 
-      // Contains any. Requires that the field is an array and
-      // `value` is a non-empty ArrayValue with at most 10 values.
+      // The given `field` is an array that contains any of the values in the
+      // given array.
+      //
+      // Requires:
+      //
+      // * That `value` is a non-empty `ArrayValue` with at most 10 values.
+      // * No other `IN`, `ARRAY_CONTAINS_ANY`, or `NOT_IN`.
       ARRAY_CONTAINS_ANY = 9;
     }
 
@@ -121,15 +146,6 @@ message StructuredQuery {
     Value value = 3;
   }
 
-  // The projection of document's fields to return.
-  message Projection {
-    // The fields to return.
-    //
-    // If empty, all fields are returned. To only return the name
-    // of the document, use `['__name__']`.
-    repeated FieldReference fields = 2;
-  }
-
   // A filter with a single operand.
   message UnaryFilter {
     // A unary operator.
@@ -137,10 +153,10 @@ message StructuredQuery {
       // Unspecified. This value must not be used.
       OPERATOR_UNSPECIFIED = 0;
 
-      // Test if a field is equal to NaN.
+      // The given `field` is equal to `NaN`.
       IS_NAN = 2;
 
-      // Test if an expression evaluates to Null.
+      // The given `field` is equal to `NULL`.
       IS_NULL = 3;
     }
 
@@ -154,11 +170,6 @@ message StructuredQuery {
     }
   }
 
-  // A reference to a field, such as `max(messages.time) as max_time`.
-  message FieldReference {
-    string field_path = 2;
-  }
-
   // An order on a field.
   message Order {
     // The field to order by.
@@ -168,6 +179,20 @@ message StructuredQuery {
     Direction direction = 2;
   }
 
+  // A reference to a field, such as `max(messages.time) as max_time`.
+  message FieldReference {
+    string field_path = 2;
+  }
+
+  // The projection of document's fields to return.
+  message Projection {
+    // The fields to return.
+    //
+    // If empty, all fields are returned. To only return the name
+    // of the document, use `['__name__']`.
+    repeated FieldReference fields = 2;
+  }
+
   // A sort direction.
   enum Direction {
     // Unspecified.
diff --git a/google/firestore/v1/write.proto b/google/firestore/v1/write.proto
index 403c80f81..a6befb0e6 100644
--- a/google/firestore/v1/write.proto
+++ b/google/firestore/v1/write.proto
@@ -28,6 +28,7 @@ option java_outer_classname = "WriteProto";
 option java_package = "com.google.firestore.v1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1";
+option ruby_package = "Google::Cloud::Firestore::V1";
 
 // A write on a document.
 message Write {
diff --git a/google/firestore/v1beta1/BUILD.bazel b/google/firestore/v1beta1/BUILD.bazel
index d7036fbc0..7213234de 100644
--- a/google/firestore/v1beta1/BUILD.bazel
+++ b/google/firestore/v1beta1/BUILD.bazel
@@ -264,7 +264,7 @@ load(
 nodejs_gapic_library(
     name = "firestore_nodejs_gapic",
     src = ":firestore_proto_with_info",
-    gapic_yaml = "firestore_gapic.yaml",
+    grpc_service_config = "firestore_grpc_service_config.json",
     package = "google.firestore.v1beta1",
     service_yaml = "//google/firestore:firestore_v1beta1.yaml",
     deps = [],
diff --git a/google/firestore/v1beta1/common.proto b/google/firestore/v1beta1/common.proto
index 2eaa18347..b71a2e32e 100644
--- a/google/firestore/v1beta1/common.proto
+++ b/google/firestore/v1beta1/common.proto
@@ -27,6 +27,7 @@ option java_outer_classname = "CommonProto";
 option java_package = "com.google.firestore.v1beta1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
+option ruby_package = "Google::Cloud::Firestore::V1beta1";
 
 // A set of field paths on a document.
 // Used to restrict a get or update operation on a document to a subset of its
diff --git a/google/firestore/v1beta1/document.proto b/google/firestore/v1beta1/document.proto
index 7caae4688..38d81af96 100644
--- a/google/firestore/v1beta1/document.proto
+++ b/google/firestore/v1beta1/document.proto
@@ -29,6 +29,7 @@ option java_outer_classname = "DocumentProto";
 option java_package = "com.google.firestore.v1beta1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
+option ruby_package = "Google::Cloud::Firestore::V1beta1";
 
 // A Firestore document.
 //
diff --git a/google/firestore/v1beta1/firestore.proto b/google/firestore/v1beta1/firestore.proto
index c2b15b048..5cdccb7ea 100644
--- a/google/firestore/v1beta1/firestore.proto
+++ b/google/firestore/v1beta1/firestore.proto
@@ -35,6 +35,7 @@ option java_outer_classname = "FirestoreProto";
 option java_package = "com.google.firestore.v1beta1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
+option ruby_package = "Google::Cloud::Firestore::V1beta1";
 
 // Specification of the Firestore API.
 
diff --git a/google/firestore/v1beta1/query.proto b/google/firestore/v1beta1/query.proto
index 4f515fabe..5f9c3ab93 100644
--- a/google/firestore/v1beta1/query.proto
+++ b/google/firestore/v1beta1/query.proto
@@ -28,6 +28,7 @@ option java_outer_classname = "QueryProto";
 option java_package = "com.google.firestore.v1beta1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
+option ruby_package = "Google::Cloud::Firestore::V1beta1";
 
 // A Firestore query.
 message StructuredQuery {
diff --git a/google/firestore/v1beta1/write.proto b/google/firestore/v1beta1/write.proto
index c02a2a8a1..ba75b42a0 100644
--- a/google/firestore/v1beta1/write.proto
+++ b/google/firestore/v1beta1/write.proto
@@ -29,6 +29,7 @@ option java_outer_classname = "WriteProto";
 option java_package = "com.google.firestore.v1beta1";
 option objc_class_prefix = "GCFS";
 option php_namespace = "Google\\Cloud\\Firestore\\V1beta1";
+option ruby_package = "Google::Cloud::Firestore::V1beta1";
 
 // A write on a document.
 message Write {
diff --git a/google/home/graph/v1/BUILD.bazel b/google/home/graph/v1/BUILD.bazel
index a6829a35d..f7d0a906d 100644
--- a/google/home/graph/v1/BUILD.bazel
+++ b/google/home/graph/v1/BUILD.bazel
@@ -253,7 +253,7 @@ load(
 nodejs_gapic_library(
     name = "graph_nodejs_gapic",
     src = ":graph_proto_with_info",
-    gapic_yaml = "homegraph_gapic.yaml",
+    grpc_service_config = "homegraph_grpc_service_config.json",
     package = "google.home.graph.v1",
     service_yaml = "homegraph_v1.yaml",
     deps = [],
diff --git a/google/iam/admin/v1/BUILD.bazel b/google/iam/admin/v1/BUILD.bazel
index 2e6a2cde8..2eefb68be 100644
--- a/google/iam/admin/v1/BUILD.bazel
+++ b/google/iam/admin/v1/BUILD.bazel
@@ -262,7 +262,7 @@ load(
 nodejs_gapic_library(
     name = "admin_nodejs_gapic",
     src = ":admin_proto_with_info",
-    gapic_yaml = "iam_gapic.yaml",
+    grpc_service_config = "iam_grpc_service_config.json",
     package = "google.iam.admin.v1",
     service_yaml = "iam.yaml",
     deps = [],
diff --git a/google/iam/credentials/v1/BUILD.bazel b/google/iam/credentials/v1/BUILD.bazel
index 70878c684..eeff7e1ca 100644
--- a/google/iam/credentials/v1/BUILD.bazel
+++ b/google/iam/credentials/v1/BUILD.bazel
@@ -254,7 +254,7 @@ load(
 nodejs_gapic_library(
     name = "credentials_nodejs_gapic",
     src = ":credentials_proto_with_info",
-    gapic_yaml = "iamcredentials_gapic.yaml",
+    grpc_service_config = "iamcredentials_grpc_service_config.json",
     package = "google.iam.credentials.v1",
     service_yaml = "//google/iam/credentials:iamcredentials_v1.yaml",
     deps = [],
diff --git a/google/logging/type/http_request.proto b/google/logging/type/http_request.proto
index f5002062f..d5fd76c39 100644
--- a/google/logging/type/http_request.proto
+++ b/google/logging/type/http_request.proto
@@ -25,6 +25,7 @@ option java_multiple_files = true;
 option java_outer_classname = "HttpRequestProto";
 option java_package = "com.google.logging.type";
 option php_namespace = "Google\\Cloud\\Logging\\Type";
+option ruby_package = "Google::Cloud::Logging::Type";
 
 // A common proto for logging HTTP requests. Only contains semantics
 // defined by the HTTP specification. Product-specific logging
diff --git a/google/logging/type/log_severity.proto b/google/logging/type/log_severity.proto
index 108cd7c73..0762b5c93 100644
--- a/google/logging/type/log_severity.proto
+++ b/google/logging/type/log_severity.proto
@@ -24,6 +24,7 @@ option java_multiple_files = true;
 option java_outer_classname = "LogSeverityProto";
 option java_package = "com.google.logging.type";
 option php_namespace = "Google\\Cloud\\Logging\\Type";
+option ruby_package = "Google::Cloud::Logging::Type";
 
 // The severity of the event described in a log entry, expressed as one of the
 // standard severity levels listed below.  For your reference, the levels are
diff --git a/google/logging/v2/BUILD.bazel b/google/logging/v2/BUILD.bazel
index f972727d5..d97e9ce28 100644
--- a/google/logging/v2/BUILD.bazel
+++ b/google/logging/v2/BUILD.bazel
@@ -283,7 +283,7 @@ load(
 nodejs_gapic_library(
     name = "logging_nodejs_gapic",
     src = ":logging_proto_with_info",
-    gapic_yaml = "logging_gapic.yaml",
+    grpc_service_config = "logging_grpc_service_config.json",
     package = "google.logging.v2",
     service_yaml = "logging.yaml",
     deps = [],
diff --git a/google/logging/v2/log_entry.proto b/google/logging/v2/log_entry.proto
index 351f9e632..d2a172ec2 100644
--- a/google/logging/v2/log_entry.proto
+++ b/google/logging/v2/log_entry.proto
@@ -34,6 +34,7 @@ option java_multiple_files = true;
 option java_outer_classname = "LogEntryProto";
 option java_package = "com.google.logging.v2";
 option php_namespace = "Google\\Cloud\\Logging\\V2";
+option ruby_package = "Google::Cloud::Logging::V2";
 
 // An individual entry in a log.
 //
diff --git a/google/logging/v2/logging.proto b/google/logging/v2/logging.proto
index 36a81dcc2..8a2a8a580 100644
--- a/google/logging/v2/logging.proto
+++ b/google/logging/v2/logging.proto
@@ -35,6 +35,7 @@ option java_multiple_files = true;
 option java_outer_classname = "LoggingProto";
 option java_package = "com.google.logging.v2";
 option php_namespace = "Google\\Cloud\\Logging\\V2";
+option ruby_package = "Google::Cloud::Logging::V2";
 
 // Service for ingesting and querying logs.
 service LoggingServiceV2 {
diff --git a/google/logging/v2/logging_config.proto b/google/logging/v2/logging_config.proto
index b7cb9c94a..5fd8d496d 100644
--- a/google/logging/v2/logging_config.proto
+++ b/google/logging/v2/logging_config.proto
@@ -32,6 +32,7 @@ option java_multiple_files = true;
 option java_outer_classname = "LoggingConfigProto";
 option java_package = "com.google.logging.v2";
 option php_namespace = "Google\\Cloud\\Logging\\V2";
+option ruby_package = "Google::Cloud::Logging::V2";
 option (google.api.resource_definition) = {
   type: "logging.googleapis.com/OrganizationLocation"
   pattern: "organizations/{organization}/locations/{location}"
diff --git a/google/logging/v2/logging_metrics.proto b/google/logging/v2/logging_metrics.proto
index 518b6f691..e147578a7 100644
--- a/google/logging/v2/logging_metrics.proto
+++ b/google/logging/v2/logging_metrics.proto
@@ -34,6 +34,7 @@ option java_multiple_files = true;
 option java_outer_classname = "LoggingMetricsProto";
 option java_package = "com.google.logging.v2";
 option php_namespace = "Google\\Cloud\\Logging\\V2";
+option ruby_package = "Google::Cloud::Logging::V2";
 
 // Service for configuring logs-based metrics.
 service MetricsServiceV2 {
diff --git a/google/maps/playablelocations/v3/BUILD.bazel b/google/maps/playablelocations/v3/BUILD.bazel
new file mode 100644
index 000000000..1e2278f37
--- /dev/null
+++ b/google/maps/playablelocations/v3/BUILD.bazel
@@ -0,0 +1,312 @@
+# This file was automatically generated by BuildFileGenerator
+
+# This is an API workspace, having public visibility by default makes perfect sense.
+package(default_visibility = ["//visibility:public"])
+
+##############################################################################
+# Common
+##############################################################################
+load("@rules_proto//proto:defs.bzl", "proto_library")
+load("@com_google_googleapis_imports//:imports.bzl", "proto_library_with_info")
+
+proto_library(
+    name = "playablelocations_proto",
+    srcs = [
+        "playablelocations.proto",
+        "resources.proto",
+    ],
+    deps = [
+        "//google/api:annotations_proto",
+        "//google/api:client_proto",
+        "//google/api:field_behavior_proto",
+        "//google/maps/playablelocations/v3/sample:resources_proto",
+        "//google/maps/unity:clientinfo_proto",
+        "//google/type:latlng_proto",
+        "@com_google_protobuf//:duration_proto",
+        "@com_google_protobuf//:field_mask_proto",
+    ],
+)
+
+proto_library_with_info(
+    name = "playablelocations_proto_with_info",
+    deps = [
+        ":playablelocations_proto",
+        "//google/cloud:common_resources_proto",
+    ],
+)
+
+##############################################################################
+# Java
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "java_gapic_assembly_gradle_pkg",
+    "java_gapic_library",
+    "java_gapic_test",
+    "java_grpc_library",
+    "java_proto_library",
+)
+
+java_proto_library(
+    name = "playablelocations_java_proto",
+    deps = [
+        ":playablelocations_proto",
+        "//google/maps/playablelocations/v3/sample:resources_proto",
+        "//google/maps/unity:clientinfo_proto",
+    ],
+)
+
+java_grpc_library(
+    name = "playablelocations_java_grpc",
+    srcs = [":playablelocations_proto"],
+    deps = [":playablelocations_java_proto"],
+)
+
+java_gapic_library(
+    name = "playablelocations_java_gapic",
+    src = ":playablelocations_proto_with_info",
+    gapic_yaml = "playablelocations_gapic.yaml",
+    package = "google.maps.playablelocations.v3",
+    service_yaml = "playablelocations_v3.yaml",
+    test_deps = [
+        ":playablelocations_java_grpc",
+    ],
+    deps = [
+        ":playablelocations_java_proto",
+    ],
+)
+
+java_gapic_test(
+    name = "playablelocations_java_gapic_test_suite",
+    test_classes = [
+        "com.google.maps.playablelocations.v3.PlayableLocationsClientTest",
+    ],
+    runtime_deps = [":playablelocations_java_gapic_test"],
+)
+
+# Open Source Packages
+java_gapic_assembly_gradle_pkg(
+    name = "google-cloud-maps-playablelocations-v3-java",
+    deps = [
+        ":playablelocations_java_gapic",
+        ":playablelocations_java_grpc",
+        ":playablelocations_java_proto",
+        ":playablelocations_proto",
+    ],
+)
+
+##############################################################################
+# Go
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "go_gapic_assembly_pkg",
+    "go_gapic_library",
+    "go_proto_library",
+    "go_test",
+)
+
+go_proto_library(
+    name = "playablelocations_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "google.golang.org/genproto/googleapis/maps/playablelocations/v3",
+    protos = [":playablelocations_proto"],
+    deps = [
+        "//google/api:annotations_go_proto",
+        "//google/maps/playablelocations/v3/sample:resources_go_proto",
+        "//google/maps/unity:clientinfo_go_proto",
+        "//google/type:latlng_go_proto",
+    ],
+)
+
+go_gapic_library(
+    name = "playablelocations_go_gapic",
+    srcs = [":playablelocations_proto_with_info"],
+    grpc_service_config = "playablelocations_grpc_service_config.json",
+    importpath = "google.golang.org/google/maps/playablelocations/v3;playablelocations",
+    service_yaml = "playablelocations_v3.yaml",
+    deps = [
+        ":playablelocations_go_proto",
+        "@io_bazel_rules_go//proto/wkt:duration_go_proto",
+    ],
+)
+
+go_test(
+    name = "playablelocations_go_gapic_test",
+    srcs = [":playablelocations_go_gapic_srcjar_test"],
+    embed = [":playablelocations_go_gapic"],
+    importpath = "google.golang.org/google/maps/playablelocations/v3",
+)
+
+# Open Source Packages
+go_gapic_assembly_pkg(
+    name = "gapi-cloud-maps-playablelocations-v3-go",
+    deps = [
+        ":playablelocations_go_gapic",
+        ":playablelocations_go_gapic_srcjar-test.srcjar",
+        ":playablelocations_go_proto",
+    ],
+)
+
+##############################################################################
+# PHP
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "php_gapic_assembly_pkg",
+    "php_gapic_library",
+    "php_grpc_library",
+    "php_proto_library",
+)
+
+php_proto_library(
+    name = "playablelocations_php_proto",
+    deps = [":playablelocations_proto"],
+)
+
+php_grpc_library(
+    name = "playablelocations_php_grpc",
+    srcs = [":playablelocations_proto"],
+    deps = [":playablelocations_php_proto"],
+)
+
+php_gapic_library(
+    name = "playablelocations_php_gapic",
+    src = ":playablelocations_proto_with_info",
+    gapic_yaml = "playablelocations_gapic.yaml",
+    package = "google.maps.playablelocations.v3",
+    service_yaml = "playablelocations_v3.yaml",
+    deps = [
+        ":playablelocations_php_grpc",
+        ":playablelocations_php_proto",
+    ],
+)
+
+# Open Source Packages
+php_gapic_assembly_pkg(
+    name = "google-cloud-maps-playablelocations-v3-php",
+    deps = [
+        ":playablelocations_php_gapic",
+        ":playablelocations_php_grpc",
+        ":playablelocations_php_proto",
+    ],
+)
+
+##############################################################################
+# Node.js
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "nodejs_gapic_assembly_pkg",
+    "nodejs_gapic_library",
+)
+
+nodejs_gapic_library(
+    name = "playablelocations_nodejs_gapic",
+    src = ":playablelocations_proto_with_info",
+    grpc_service_config = "playablelocations_grpc_service_config.json",
+    package = "google.maps.playablelocations.v3",
+    service_yaml = "playablelocations_v3.yaml",
+    deps = [],
+)
+
+nodejs_gapic_assembly_pkg(
+    name = "maps-playablelocations-v3-nodejs",
+    deps = [
+        ":playablelocations_nodejs_gapic",
+        ":playablelocations_proto",
+    ],
+)
+
+##############################################################################
+# Ruby
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "ruby_gapic_assembly_pkg",
+    "ruby_gapic_library",
+    "ruby_grpc_library",
+    "ruby_proto_library",
+)
+
+ruby_proto_library(
+    name = "playablelocations_ruby_proto",
+    deps = [":playablelocations_proto"],
+)
+
+ruby_grpc_library(
+    name = "playablelocations_ruby_grpc",
+    srcs = [":playablelocations_proto"],
+    deps = [":playablelocations_ruby_proto"],
+)
+
+ruby_gapic_library(
+    name = "playablelocations_ruby_gapic",
+    src = ":playablelocations_proto_with_info",
+    gapic_yaml = "playablelocations_gapic.yaml",
+    package = "google.maps.playablelocations.v3",
+    service_yaml = "playablelocations_v3.yaml",
+    deps = [
+        ":playablelocations_ruby_grpc",
+        ":playablelocations_ruby_proto",
+    ],
+)
+
+# Open Source Packages
+ruby_gapic_assembly_pkg(
+    name = "google-cloud-maps-playablelocations-v3-ruby",
+    deps = [
+        ":playablelocations_ruby_gapic",
+        ":playablelocations_ruby_grpc",
+        ":playablelocations_ruby_proto",
+    ],
+)
+
+##############################################################################
+# C#
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "csharp_gapic_assembly_pkg",
+    "csharp_gapic_library",
+    "csharp_grpc_library",
+    "csharp_proto_library",
+)
+
+csharp_proto_library(
+    name = "playablelocations_csharp_proto",
+    deps = [":playablelocations_proto"],
+)
+
+csharp_grpc_library(
+    name = "playablelocations_csharp_grpc",
+    srcs = [":playablelocations_proto"],
+    deps = [":playablelocations_csharp_proto"],
+)
+
+csharp_gapic_library(
+    name = "playablelocations_csharp_gapic",
+    src = ":playablelocations_proto_with_info",
+    gapic_yaml = "playablelocations_gapic.yaml",
+    package = "google.maps.playablelocations.v3",
+    service_yaml = "playablelocations_v3.yaml",
+    deps = [
+        ":playablelocations_csharp_grpc",
+        ":playablelocations_csharp_proto",
+    ],
+)
+
+# Open Source Packages
+csharp_gapic_assembly_pkg(
+    name = "google-cloud-maps-playablelocations-v3-csharp",
+    deps = [
+        ":playablelocations_csharp_gapic",
+        ":playablelocations_csharp_grpc",
+        ":playablelocations_csharp_proto",
+    ],
+)
+
+##############################################################################
+# C++
+##############################################################################
+# Put your C++ rules here
diff --git a/google/maps/playablelocations/v3/playablelocations_gapic.yaml b/google/maps/playablelocations/v3/playablelocations_gapic.yaml
new file mode 100644
index 000000000..a82504b5f
--- /dev/null
+++ b/google/maps/playablelocations/v3/playablelocations_gapic.yaml
@@ -0,0 +1,16 @@
+type: com.google.api.codegen.ConfigProto
+config_schema_version: 2.0.0
+language_settings:
+  java:
+    package_name: com.google.maps.playablelocations.v3
+  go:
+    package_name: developers.google.com/maps/go/playablelocations/v3
+  csharp:
+    package_name: Google.Maps.PlayableLocations.V3
+  ruby:
+    package_name: Google::Maps::PlayableLocations::V3
+  php:
+    package_name: Google\Maps\PlayableLocations\V3
+  nodejs:
+    package_name: playablelocations.v3
+    domain_layer_location: googlemaps
diff --git a/google/maps/playablelocations/v3/sample/BUILD.bazel b/google/maps/playablelocations/v3/sample/BUILD.bazel
new file mode 100644
index 000000000..c9e518286
--- /dev/null
+++ b/google/maps/playablelocations/v3/sample/BUILD.bazel
@@ -0,0 +1,134 @@
+# This file was automatically generated by BuildFileGenerator
+
+# This is an API workspace, having public visibility by default makes perfect sense.
+package(default_visibility = ["//visibility:public"])
+
+##############################################################################
+# Common
+##############################################################################
+load("@rules_proto//proto:defs.bzl", "proto_library")
+
+proto_library(
+    name = "resources_proto",
+    srcs = [
+        "resources.proto",
+    ],
+    deps = [
+        "//google/api:field_behavior_proto",
+        "//google/type:latlng_proto",
+        "@com_google_protobuf//:field_mask_proto",
+    ],
+)
+
+##############################################################################
+# Java
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "java_grpc_library",
+    "java_proto_library",
+)
+
+java_proto_library(
+    name = "resources_java_proto",
+    deps = [":resources_proto"],
+)
+
+java_grpc_library(
+    name = "resources_java_grpc",
+    srcs = [":resources_proto"],
+    deps = [":resources_java_proto"],
+)
+
+##############################################################################
+# Go
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "go_proto_library",
+)
+
+go_proto_library(
+    name = "resources_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "google.golang.org/genproto/googleapis/maps/playablelocations/v3/sample",
+    protos = [":resources_proto"],
+    deps = [
+        "//google/api:annotations_go_proto",
+        "//google/type:latlng_go_proto",
+    ],
+)
+
+##############################################################################
+# PHP
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "php_grpc_library",
+    "php_proto_library",
+)
+
+php_proto_library(
+    name = "resources_php_proto",
+    deps = [":resources_proto"],
+)
+
+php_grpc_library(
+    name = "resources_php_grpc",
+    srcs = [":resources_proto"],
+    deps = [":resources_php_proto"],
+)
+
+##############################################################################
+# Node.js
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "nodejs_gapic_assembly_pkg",
+    "nodejs_gapic_library",
+)
+
+##############################################################################
+# Ruby
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "ruby_grpc_library",
+    "ruby_proto_library",
+)
+
+ruby_proto_library(
+    name = "resources_ruby_proto",
+    deps = [":resources_proto"],
+)
+
+ruby_grpc_library(
+    name = "resources_ruby_grpc",
+    srcs = [":resources_proto"],
+    deps = [":resources_ruby_proto"],
+)
+
+##############################################################################
+# C#
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "csharp_grpc_library",
+    "csharp_proto_library",
+)
+
+csharp_proto_library(
+    name = "resources_csharp_proto",
+    deps = [":resources_proto"],
+)
+
+csharp_grpc_library(
+    name = "resources_csharp_grpc",
+    srcs = [":resources_proto"],
+    deps = [":resources_csharp_proto"],
+)
+
+##############################################################################
+# C++
+##############################################################################
+# Put your C++ code here
diff --git a/google/maps/playablelocations/v3/sample/resources.proto b/google/maps/playablelocations/v3/sample/resources.proto
index 6a8f8b2c6..2a97a00f0 100644
--- a/google/maps/playablelocations/v3/sample/resources.proto
+++ b/google/maps/playablelocations/v3/sample/resources.proto
@@ -49,12 +49,12 @@ message PlayableLocation {
   // Type information might not be available for all playable locations.
   repeated string types = 4;
 
-  // Required. The latitude and longitude associated with the center of the playable
-  // location.
+  // Required. The latitude and longitude associated with the center of the
+  // playable location.
   //
   // By default, the set of playable locations returned from
-  // [SamplePlayableLocations][google.maps.playablelocations.v3.PlayableLocations.SamplePlayableLocations] use
-  // center-point coordinates.
+  // [SamplePlayableLocations][google.maps.playablelocations.v3.PlayableLocations.SamplePlayableLocations]
+  // use center-point coordinates.
   google.type.LatLng center_point = 5;
 
   // The playable location's coordinates, snapped to the sidewalk of the
@@ -79,9 +79,8 @@ message SpacingOptions {
     SNAPPED_POINT = 2;
   }
 
-  // Required. The minimum spacing between any two playable locations, measured in meters.
-  // The minimum value is 200.
-  // The maximum value is 1000.
+  // Required. The minimum spacing between any two playable locations, measured
+  // in meters. The minimum value is 30. The maximum value is 1000.
   //
   // Inputs will be rounded up to the next 10 meter interval.
   //
@@ -135,7 +134,7 @@ message SpacingOptions {
 // Specifies the filters to use when searching for playable locations.
 message Filter {
   // Specifies the maximum number of playable locations to return. This value
-  // must not be greater than 500. The default value is 100.
+  // must not be greater than 1000. The default value is 100.
   //
   // Only the top-ranking playable locations are returned.
   int32 max_location_count = 1;
@@ -152,9 +151,10 @@ message Filter {
 // Encapsulates a filter criterion for searching for a set of playable
 // locations.
 message Criterion {
-  // Required. An arbitrary, developer-defined identifier of the type of game object that
-  // the playable location is used for. This field allows you to specify
-  // criteria per game object type when searching for playable locations.
+  // Required. An arbitrary, developer-defined identifier of the type of game
+  // object that the playable location is used for. This field allows you to
+  // specify criteria per game object type when searching for playable
+  // locations.
   //
   // You should assign a unique `game_object_type` ID across all
   // `request_criteria` to represent a distinct type of game object. For
@@ -184,8 +184,8 @@ message Criterion {
 
 // Specifies the area to search for playable locations.
 message AreaFilter {
-  // Required. The S2 cell ID of the area you want. This must be between cell level 11 and
-  // 14 (inclusive).
+  // Required. The S2 cell ID of the area you want. This must be between cell
+  // level 11 and 14 (inclusive).
   //
   // S2 cells are 64-bit integers that identify areas on the Earth. They are
   // hierarchical, and can therefore be used for spatial indexing.
diff --git a/google/maps/roads/v1op/BUILD.bazel b/google/maps/roads/v1op/BUILD.bazel
index c1705d08d..ddd3afc57 100644
--- a/google/maps/roads/v1op/BUILD.bazel
+++ b/google/maps/roads/v1op/BUILD.bazel
@@ -243,7 +243,7 @@ load(
 nodejs_gapic_library(
     name = "roads_nodejs_gapic",
     src = ":roads_proto_with_info",
-    gapic_yaml = "roads_gapic.yaml",
+    grpc_service_config = "roads_grpc_service_config.json",
     package = "google.maps.roads.v1op",
     service_yaml = "roads_v1op.yaml",
     deps = [],
diff --git a/google/maps/unity/BUILD.bazel b/google/maps/unity/BUILD.bazel
new file mode 100644
index 000000000..e45c212d7
--- /dev/null
+++ b/google/maps/unity/BUILD.bazel
@@ -0,0 +1,129 @@
+# This file was automatically generated by BuildFileGenerator
+
+# This is an API workspace, having public visibility by default makes perfect sense.
+package(default_visibility = ["//visibility:public"])
+
+##############################################################################
+# Common
+##############################################################################
+load("@rules_proto//proto:defs.bzl", "proto_library")
+
+proto_library(
+    name = "clientinfo_proto",
+    srcs = [
+        "clientinfo.proto",
+    ],
+    deps = [
+    ],
+)
+
+##############################################################################
+# Java
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "java_grpc_library",
+    "java_proto_library",
+)
+
+java_proto_library(
+    name = "clientinfo_java_proto",
+    deps = [":clientinfo_proto"],
+)
+
+java_grpc_library(
+    name = "clientinfo_java_grpc",
+    srcs = [":clientinfo_proto"],
+    deps = [":clientinfo_java_proto"],
+)
+
+##############################################################################
+# Go
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "go_proto_library",
+)
+
+go_proto_library(
+    name = "clientinfo_go_proto",
+    compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+    importpath = "google.golang.org/genproto/googleapis/maps/unity",
+    protos = [":clientinfo_proto"],
+    deps = [
+    ],
+)
+
+##############################################################################
+# PHP
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "php_grpc_library",
+    "php_proto_library",
+)
+
+php_proto_library(
+    name = "clientinfo_php_proto",
+    deps = [":clientinfo_proto"],
+)
+
+php_grpc_library(
+    name = "clientinfo_php_grpc",
+    srcs = [":clientinfo_proto"],
+    deps = [":clientinfo_php_proto"],
+)
+
+##############################################################################
+# Node.js
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "nodejs_gapic_assembly_pkg",
+    "nodejs_gapic_library",
+)
+
+##############################################################################
+# Ruby
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "ruby_grpc_library",
+    "ruby_proto_library",
+)
+
+ruby_proto_library(
+    name = "clientinfo_ruby_proto",
+    deps = [":clientinfo_proto"],
+)
+
+ruby_grpc_library(
+    name = "clientinfo_ruby_grpc",
+    srcs = [":clientinfo_proto"],
+    deps = [":clientinfo_ruby_proto"],
+)
+
+##############################################################################
+# C#
+##############################################################################
+load(
+    "@com_google_googleapis_imports//:imports.bzl",
+    "csharp_grpc_library",
+    "csharp_proto_library",
+)
+
+csharp_proto_library(
+    name = "clientinfo_csharp_proto",
+    deps = [":clientinfo_proto"],
+)
+
+csharp_grpc_library(
+    name = "clientinfo_csharp_grpc",
+    srcs = [":clientinfo_proto"],
+    deps = [":clientinfo_csharp_proto"],
+)
+
+##############################################################################
+# C++
+##############################################################################
+# Put your C++ code here
diff --git a/google/monitoring/dashboard/v1/BUILD.bazel b/google/monitoring/dashboard/v1/BUILD.bazel
index 31164b6a8..24dbbde63 100644
--- a/google/monitoring/dashboard/v1/BUILD.bazel
+++ b/google/monitoring/dashboard/v1/BUILD.bazel
@@ -1,4 +1,5 @@
-# This file was created manually
+# This file was automatically generated by BuildFileGenerator except for the
+# c++ rules at the end of the file.
 
 # This is an API workspace, having public visibility by default makes perfect sense.
 package(default_visibility = ["//visibility:public"])
@@ -27,7 +28,9 @@ proto_library(
     deps = [
         "//google/api:annotations_proto",
         "//google/api:client_proto",
+        "//google/api:distribution_proto",
         "//google/api:field_behavior_proto",
+        "//google/api:resource_proto",
         "@com_google_protobuf//:duration_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
@@ -116,13 +119,14 @@ go_proto_library(
     protos = [":dashboard_proto"],
     deps = [
         "//google/api:annotations_go_proto",
+        "//google/api:distribution_go_proto",
     ],
 )
 
 go_gapic_library(
     name = "dashboard_go_gapic",
     srcs = [":dashboard_proto_with_info"],
-    grpc_service_config = "",
+    grpc_service_config = "dashboards_grpc_service_config.json",
     importpath = "cloud.google.com/go/monitoring/dashboard/apiv1;dashboard",
     service_yaml = "monitoring.yaml",
     deps = [
@@ -166,7 +170,9 @@ moved_proto_library(
     deps = [
         "//google/api:annotations_proto",
         "//google/api:client_proto",
+        "//google/api:distribution_proto",
         "//google/api:field_behavior_proto",
+        "//google/api:resource_proto",
         "@com_google_protobuf//:duration_proto",
         "@com_google_protobuf//:empty_proto",
         "@com_google_protobuf//:field_mask_proto",
@@ -263,7 +269,7 @@ load(
 nodejs_gapic_library(
     name = "dashboard_nodejs_gapic",
     src = ":dashboard_proto_with_info",
-    gapic_yaml = "monitoring_gapic.yaml",
+    grpc_service_config = "dashboards_grpc_service_config.json",
     package = "google.monitoring.dashboard.v1",
     service_yaml = "monitoring.yaml",
     deps = [],
diff --git a/google/monitoring/dashboard/v1/common.proto b/google/monitoring/dashboard/v1/common.proto
index 4ab3f5312..6dedcf09e 100644
--- a/google/monitoring/dashboard/v1/common.proto
+++ b/google/monitoring/dashboard/v1/common.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,328 +11,376 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
 package google.monitoring.dashboard.v1;
 
+import "google/api/distribution.proto";
 import "google/protobuf/duration.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "CommonProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
-// Describes how to combine multiple time series to provide different views of
-// the data.  Aggregation consists of an alignment step on individual time
-// series (`alignment_period` and `per_series_aligner`) followed by an optional
-// reduction step of the data across the aligned time series
-// (`cross_series_reducer` and `group_by_fields`).  For more details, see
-// [Aggregation](/monitoring/api/learn_more#aggregation).
+// Describes how to combine multiple time series to provide a different view of
+// the data.  Aggregation of time series is done in two steps. First, each time
+// series in the set is _aligned_ to the same time interval boundaries, then the
+// set of time series is optionally _reduced_ in number.
+//
+// Alignment consists of applying the `per_series_aligner` operation
+// to each time series after its data has been divided into regular
+// `alignment_period` time intervals. This process takes _all_ of the data
+// points in an alignment period, applies a mathematical transformation such as
+// averaging, minimum, maximum, delta, etc., and converts them into a single
+// data point per period.
+//
+// Reduction is when the aligned and transformed time series can optionally be
+// combined, reducing the number of time series through similar mathematical
+// transformations. Reduction involves applying a `cross_series_reducer` to
+// all the time series, optionally sorting the time series into subsets with
+// `group_by_fields`, and applying the reducer to each subset.
+//
+// The raw time series data can contain a huge amount of information from
+// multiple sources. Alignment and reduction transforms this mass of data into
+// a more manageable and representative collection of data, for example "the
+// 95% latency across the average of all tasks in a cluster". This
+// representative data can be more easily graphed and comprehended, and the
+// individual time series data is still available for later drilldown. For more
+// details, see [Filtering and
+// aggregation](https://cloud.google.com/monitoring/api/v3/aggregation).
 message Aggregation {
-  // The Aligner describes how to bring the data points in a single
-  // time series into temporal alignment.
+  // The `Aligner` specifies the operation that will be applied to the data
+  // points in each alignment period in a time series. Except for
+  // `ALIGN_NONE`, which specifies that no operation be applied, each alignment
+  // operation replaces the set of data values in each alignment period with
+  // a single value: the result of applying the operation to the data values.
+  // An aligned time series has a single data value at the end of each
+  // `alignment_period`.
+  //
+  // An alignment operation can change the data type of the values, too. For
+  // example, if you apply a counting operation to boolean values, the data
+  // `value_type` in the original time series is `BOOLEAN`, but the `value_type`
+  // in the aligned result is `INT64`.
   enum Aligner {
-    // No alignment. Raw data is returned. Not valid if cross-time
-    // series reduction is requested. The value type of the result is
-    // the same as the value type of the input.
+    // No alignment. Raw data is returned. Not valid if cross-series reduction
+    // is requested. The `value_type` of the result is the same as the
+    // `value_type` of the input.
     ALIGN_NONE = 0;
 
-    // Align and convert to delta metric type. This alignment is valid
-    // for cumulative metrics and delta metrics. Aligning an existing
-    // delta metric to a delta metric requires that the alignment
-    // period be increased. The value type of the result is the same
-    // as the value type of the input.
+    // Align and convert to
+    // [DELTA][google.api.MetricDescriptor.MetricKind.DELTA].
+    // The output is `delta = y1 - y0`.
     //
-    // One can think of this aligner as a rate but without time units; that
-    // is, the output is conceptually (second_point - first_point).
+    // This alignment is valid for
+    // [CUMULATIVE][google.api.MetricDescriptor.MetricKind.CUMULATIVE] and
+    // `DELTA` metrics. If the selected alignment period results in periods
+    // with no data, then the aligned value for such a period is created by
+    // interpolation. The `value_type`  of the aligned result is the same as
+    // the `value_type` of the input.
     ALIGN_DELTA = 1;
 
-    // Align and convert to a rate. This alignment is valid for
-    // cumulative metrics and delta metrics with numeric values. The output is a
-    // gauge metric with value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align and convert to a rate. The result is computed as
+    // `rate = (y1 - y0)/(t1 - t0)`, or "delta over time".
+    // Think of this aligner as providing the slope of the line that passes
+    // through the value at the start and at the end of the `alignment_period`.
     //
-    // One can think of this aligner as conceptually providing the slope of
-    // the line that passes through the value at the start and end of the
-    // window. In other words, this is conceptually ((y1 - y0)/(t1 - t0)),
-    // and the output unit is one that has a "/time" dimension.
+    // This aligner is valid for `CUMULATIVE`
+    // and `DELTA` metrics with numeric values. If the selected alignment
+    // period results in periods with no data, then the aligned value for
+    // such a period is created by interpolation. The output is a `GAUGE`
+    // metric with `value_type` `DOUBLE`.
     //
-    // If, by rate, you are looking for percentage change, see the
-    // `ALIGN_PERCENT_CHANGE` aligner option.
+    // If, by "rate", you mean "percentage change", see the
+    // `ALIGN_PERCENT_CHANGE` aligner instead.
     ALIGN_RATE = 2;
 
-    // Align by interpolating between adjacent points around the
-    // period boundary. This alignment is valid for gauge
-    // metrics with numeric values. The value type of the result is the same
-    // as the value type of the input.
+    // Align by interpolating between adjacent points around the alignment
+    // period boundary. This aligner is valid for `GAUGE` metrics with
+    // numeric values. The `value_type` of the aligned result is the same as the
+    // `value_type` of the input.
     ALIGN_INTERPOLATE = 3;
 
-    // Align by shifting the oldest data point before the period
-    // boundary to the boundary. This alignment is valid for gauge
-    // metrics. The value type of the result is the same as the
-    // value type of the input.
+    // Align by moving the most recent data point before the end of the
+    // alignment period to the boundary at the end of the alignment
+    // period. This aligner is valid for `GAUGE` metrics. The `value_type` of
+    // the aligned result is the same as the `value_type` of the input.
     ALIGN_NEXT_OLDER = 4;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the minimum of all data points in the
-    // period. This alignment is valid for gauge and delta metrics with numeric
-    // values. The value type of the result is the same as the value
-    // type of the input.
+    // Align the time series by returning the minimum value in each alignment
+    // period. This aligner is valid for `GAUGE` and `DELTA` metrics with
+    // numeric values. The `value_type` of the aligned result is the same as
+    // the `value_type` of the input.
     ALIGN_MIN = 10;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the maximum of all data points in the
-    // period. This alignment is valid for gauge and delta metrics with numeric
-    // values. The value type of the result is the same as the value
-    // type of the input.
+    // Align the time series by returning the maximum value in each alignment
+    // period. This aligner is valid for `GAUGE` and `DELTA` metrics with
+    // numeric values. The `value_type` of the aligned result is the same as
+    // the `value_type` of the input.
     ALIGN_MAX = 11;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the average or arithmetic mean of all
-    // data points in the period. This alignment is valid for gauge and delta
-    // metrics with numeric values. The value type of the output is
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align the time series by returning the mean value in each alignment
+    // period. This aligner is valid for `GAUGE` and `DELTA` metrics with
+    // numeric values. The `value_type` of the aligned result is `DOUBLE`.
     ALIGN_MEAN = 12;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the count of all data points in the
-    // period. This alignment is valid for gauge and delta metrics with numeric
-    // or Boolean values. The value type of the output is
-    // [INT64][google.api.MetricDescriptor.ValueType.INT64].
+    // Align the time series by returning the number of values in each alignment
+    // period. This aligner is valid for `GAUGE` and `DELTA` metrics with
+    // numeric or Boolean values. The `value_type` of the aligned result is
+    // `INT64`.
     ALIGN_COUNT = 13;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the sum of all data points in the
-    // period. This alignment is valid for gauge and delta metrics with numeric
-    // and distribution values. The value type of the output is the
-    // same as the value type of the input.
+    // Align the time series by returning the sum of the values in each
+    // alignment period. This aligner is valid for `GAUGE` and `DELTA`
+    // metrics with numeric and distribution values. The `value_type` of the
+    // aligned result is the same as the `value_type` of the input.
     ALIGN_SUM = 14;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the standard deviation of all data
-    // points in the period. This alignment is valid for gauge and delta metrics
-    // with numeric values. The value type of the output is
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align the time series by returning the standard deviation of the values
+    // in each alignment period. This aligner is valid for `GAUGE` and
+    // `DELTA` metrics with numeric values. The `value_type` of the output is
+    // `DOUBLE`.
     ALIGN_STDDEV = 15;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the count of True-valued data points in the
-    // period. This alignment is valid for gauge metrics with
-    // Boolean values. The value type of the output is
-    // [INT64][google.api.MetricDescriptor.ValueType.INT64].
+    // Align the time series by returning the number of `True` values in
+    // each alignment period. This aligner is valid for `GAUGE` metrics with
+    // Boolean values. The `value_type` of the output is `INT64`.
     ALIGN_COUNT_TRUE = 16;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the count of False-valued data points in the
-    // period. This alignment is valid for gauge metrics with
-    // Boolean values. The value type of the output is
-    // [INT64][google.api.MetricDescriptor.ValueType.INT64].
+    // Align the time series by returning the number of `False` values in
+    // each alignment period. This aligner is valid for `GAUGE` metrics with
+    // Boolean values. The `value_type` of the output is `INT64`.
     ALIGN_COUNT_FALSE = 24;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the fraction of True-valued data points in the
-    // period. This alignment is valid for gauge metrics with Boolean values.
-    // The output value is in the range [0, 1] and has value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align the time series by returning the ratio of the number of `True`
+    // values to the total number of values in each alignment period. This
+    // aligner is valid for `GAUGE` metrics with Boolean values. The output
+    // value is in the range [0.0, 1.0] and has `value_type` `DOUBLE`.
     ALIGN_FRACTION_TRUE = 17;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the 99th percentile of all data
-    // points in the period. This alignment is valid for gauge and delta metrics
-    // with distribution values. The output is a gauge metric with value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align the time series by using [percentile
+    // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
+    // data point in each alignment period is the 99th percentile of all data
+    // points in the period. This aligner is valid for `GAUGE` and `DELTA`
+    // metrics with distribution values. The output is a `GAUGE` metric with
+    // `value_type` `DOUBLE`.
     ALIGN_PERCENTILE_99 = 18;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the 95th percentile of all data
-    // points in the period. This alignment is valid for gauge and delta metrics
-    // with distribution values. The output is a gauge metric with value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align the time series by using [percentile
+    // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
+    // data point in each alignment period is the 95th percentile of all data
+    // points in the period. This aligner is valid for `GAUGE` and `DELTA`
+    // metrics with distribution values. The output is a `GAUGE` metric with
+    // `value_type` `DOUBLE`.
     ALIGN_PERCENTILE_95 = 19;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the 50th percentile of all data
-    // points in the period. This alignment is valid for gauge and delta metrics
-    // with distribution values. The output is a gauge metric with value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align the time series by using [percentile
+    // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
+    // data point in each alignment period is the 50th percentile of all data
+    // points in the period. This aligner is valid for `GAUGE` and `DELTA`
+    // metrics with distribution values. The output is a `GAUGE` metric with
+    // `value_type` `DOUBLE`.
     ALIGN_PERCENTILE_50 = 20;
 
-    // Align time series via aggregation. The resulting data point in
-    // the alignment period is the 5th percentile of all data
-    // points in the period. This alignment is valid for gauge and delta metrics
-    // with distribution values. The output is a gauge metric with value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Align the time series by using [percentile
+    // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting
+    // data point in each alignment period is the 5th percentile of all data
+    // points in the period. This aligner is valid for `GAUGE` and `DELTA`
+    // metrics with distribution values. The output is a `GAUGE` metric with
+    // `value_type` `DOUBLE`.
     ALIGN_PERCENTILE_05 = 21;
 
-    // Align and convert to a percentage change. This alignment is valid for
-    // gauge and delta metrics with numeric values. This alignment conceptually
-    // computes the equivalent of "((current - previous)/previous)*100"
-    // where previous value is determined based on the alignmentPeriod.
-    // In the event that previous is 0 the calculated value is infinity with the
-    // exception that if both (current - previous) and previous are 0 the
-    // calculated value is 0.
-    // A 10 minute moving mean is computed at each point of the time window
+    // Align and convert to a percentage change. This aligner is valid for
+    // `GAUGE` and `DELTA` metrics with numeric values. This alignment returns
+    // `((current - previous)/previous) * 100`, where the value of `previous` is
+    // determined based on the `alignment_period`.
+    //
+    // If the values of `current` and `previous` are both 0, then the returned
+    // value is 0. If only `previous` is 0, the returned value is infinity.
+    //
+    // A 10-minute moving mean is computed at each point of the alignment period
     // prior to the above calculation to smooth the metric and prevent false
-    // positives from very short lived spikes.
-    // Only applicable for data that is >= 0. Any values < 0 are treated as
-    // no data. While delta metrics are accepted by this alignment special care
-    // should be taken that the values for the metric will always be positive.
-    // The output is a gauge metric with value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // positives from very short-lived spikes. The moving mean is only
+    // applicable for data whose values are `>= 0`. Any values `< 0` are
+    // treated as a missing datapoint, and are ignored. While `DELTA`
+    // metrics are accepted by this alignment, special care should be taken that
+    // the values for the metric will always be positive. The output is a
+    // `GAUGE` metric with `value_type` `DOUBLE`.
     ALIGN_PERCENT_CHANGE = 23;
   }
 
-  // A Reducer describes how to aggregate data points from multiple
-  // time series into a single time series.
+  // A Reducer operation describes how to aggregate data points from multiple
+  // time series into a single time series, where the value of each data point
+  // in the resulting series is a function of all the already aligned values in
+  // the input time series.
   enum Reducer {
-    // No cross-time series reduction. The output of the aligner is
+    // No cross-time series reduction. The output of the `Aligner` is
     // returned.
     REDUCE_NONE = 0;
 
-    // Reduce by computing the mean across time series for each
-    // alignment period. This reducer is valid for delta and
-    // gauge metrics with numeric or distribution values. The value type of the
-    // output is [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Reduce by computing the mean value across time series for each
+    // alignment period. This reducer is valid for
+    // [DELTA][google.api.MetricDescriptor.MetricKind.DELTA] and
+    // [GAUGE][google.api.MetricDescriptor.MetricKind.GAUGE] metrics with
+    // numeric or distribution values. The `value_type` of the output is
+    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
     REDUCE_MEAN = 1;
 
-    // Reduce by computing the minimum across time series for each
-    // alignment period. This reducer is valid for delta and
-    // gauge metrics with numeric values. The value type of the output
-    // is the same as the value type of the input.
+    // Reduce by computing the minimum value across time series for each
+    // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics
+    // with numeric values. The `value_type` of the output is the same as the
+    // `value_type` of the input.
     REDUCE_MIN = 2;
 
-    // Reduce by computing the maximum across time series for each
-    // alignment period. This reducer is valid for delta and
-    // gauge metrics with numeric values. The value type of the output
-    // is the same as the value type of the input.
+    // Reduce by computing the maximum value across time series for each
+    // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics
+    // with numeric values. The `value_type` of the output is the same as the
+    // `value_type` of the input.
     REDUCE_MAX = 3;
 
     // Reduce by computing the sum across time series for each
-    // alignment period. This reducer is valid for delta and
-    // gauge metrics with numeric and distribution values. The value type of
-    // the output is the same as the value type of the input.
+    // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics
+    // with numeric and distribution values. The `value_type` of the output is
+    // the same as the `value_type` of the input.
     REDUCE_SUM = 4;
 
     // Reduce by computing the standard deviation across time series
-    // for each alignment period. This reducer is valid for delta
-    // and gauge metrics with numeric or distribution values. The value type of
-    // the output is [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // for each alignment period. This reducer is valid for `DELTA` and
+    // `GAUGE` metrics with numeric or distribution values. The `value_type`
+    // of the output is `DOUBLE`.
     REDUCE_STDDEV = 5;
 
-    // Reduce by computing the count of data points across time series
-    // for each alignment period. This reducer is valid for delta
-    // and gauge metrics of numeric, Boolean, distribution, and string value
-    // type. The value type of the output is
-    // [INT64][google.api.MetricDescriptor.ValueType.INT64].
+    // Reduce by computing the number of data points across time series
+    // for each alignment period. This reducer is valid for `DELTA` and
+    // `GAUGE` metrics of numeric, Boolean, distribution, and string
+    // `value_type`. The `value_type` of the output is `INT64`.
     REDUCE_COUNT = 6;
 
-    // Reduce by computing the count of True-valued data points across time
-    // series for each alignment period. This reducer is valid for delta
-    // and gauge metrics of Boolean value type. The value type of
-    // the output is [INT64][google.api.MetricDescriptor.ValueType.INT64].
+    // Reduce by computing the number of `True`-valued data points across time
+    // series for each alignment period. This reducer is valid for `DELTA` and
+    // `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output
+    // is `INT64`.
     REDUCE_COUNT_TRUE = 7;
 
-    // Reduce by computing the count of False-valued data points across time
-    // series for each alignment period. This reducer is valid for delta
-    // and gauge metrics of Boolean value type. The value type of
-    // the output is [INT64][google.api.MetricDescriptor.ValueType.INT64].
+    // Reduce by computing the number of `False`-valued data points across time
+    // series for each alignment period. This reducer is valid for `DELTA` and
+    // `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output
+    // is `INT64`.
     REDUCE_COUNT_FALSE = 15;
 
-    // Reduce by computing the fraction of True-valued data points across time
-    // series for each alignment period. This reducer is valid for delta
-    // and gauge metrics of Boolean value type. The output value is in the
-    // range [0, 1] and has value type
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE].
+    // Reduce by computing the ratio of the number of `True`-valued data points
+    // to the total number of data points for each alignment period. This
+    // reducer is valid for `DELTA` and `GAUGE` metrics of Boolean `value_type`.
+    // The output value is in the range [0.0, 1.0] and has `value_type`
+    // `DOUBLE`.
     REDUCE_FRACTION_TRUE = 8;
 
-    // Reduce by computing 99th percentile of data points across time series
-    // for each alignment period. This reducer is valid for gauge and delta
-    // metrics of numeric and distribution type. The value of the output is
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
+    // Reduce by computing the [99th
+    // percentile](https://en.wikipedia.org/wiki/Percentile) of data points
+    // across time series for each alignment period. This reducer is valid for
+    // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value
+    // of the output is `DOUBLE`.
     REDUCE_PERCENTILE_99 = 9;
 
-    // Reduce by computing 95th percentile of data points across time series
-    // for each alignment period. This reducer is valid for gauge and delta
-    // metrics of numeric and distribution type. The value of the output is
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
+    // Reduce by computing the [95th
+    // percentile](https://en.wikipedia.org/wiki/Percentile) of data points
+    // across time series for each alignment period. This reducer is valid for
+    // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value
+    // of the output is `DOUBLE`.
     REDUCE_PERCENTILE_95 = 10;
 
-    // Reduce by computing 50th percentile of data points across time series
-    // for each alignment period. This reducer is valid for gauge and delta
-    // metrics of numeric and distribution type. The value of the output is
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
+    // Reduce by computing the [50th
+    // percentile](https://en.wikipedia.org/wiki/Percentile) of data points
+    // across time series for each alignment period. This reducer is valid for
+    // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value
+    // of the output is `DOUBLE`.
     REDUCE_PERCENTILE_50 = 11;
 
-    // Reduce by computing 5th percentile of data points across time series
-    // for each alignment period. This reducer is valid for gauge and delta
-    // metrics of numeric and distribution type. The value of the output is
-    // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]
+    // Reduce by computing the [5th
+    // percentile](https://en.wikipedia.org/wiki/Percentile) of data points
+    // across time series for each alignment period. This reducer is valid for
+    // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value
+    // of the output is `DOUBLE`.
     REDUCE_PERCENTILE_05 = 12;
   }
 
-  // The alignment period for per-[time series][TimeSeries]
-  // alignment. If present, `alignmentPeriod` must be at least 60
-  // seconds.  After per-time series alignment, each time series will
-  // contain data points only on the period boundaries. If
-  // `perSeriesAligner` is not specified or equals `ALIGN_NONE`, then
-  // this field is ignored. If `perSeriesAligner` is specified and
-  // does not equal `ALIGN_NONE`, then this field must be defined;
-  // otherwise an error is returned.
+  // The `alignment_period` specifies a time interval, in seconds, that is used
+  // to divide the data in all the
+  // [time series][google.monitoring.v3.TimeSeries] into consistent blocks of
+  // time. This will be done before the per-series aligner can be applied to
+  // the data.
+  //
+  // The value must be at least 60 seconds. If a per-series aligner other than
+  // `ALIGN_NONE` is specified, this field is required or an error is returned.
+  // If no per-series aligner is specified, or the aligner `ALIGN_NONE` is
+  // specified, then this field is ignored.
   google.protobuf.Duration alignment_period = 1;
 
-  // The approach to be used to align individual time series. Not all
-  // alignment functions may be applied to all time series, depending
-  // on the metric type and value type of the original time
-  // series. Alignment may change the metric type or the value type of
+  // An `Aligner` describes how to bring the data points in a single
+  // time series into temporal alignment. Except for `ALIGN_NONE`, all
+  // alignments cause all the data points in an `alignment_period` to be
+  // mathematically grouped together, resulting in a single data point for
+  // each `alignment_period` with end timestamp at the end of the period.
+  //
+  // Not all alignment operations may be applied to all time series. The valid
+  // choices depend on the `metric_kind` and `value_type` of the original time
+  // series. Alignment can change the `metric_kind` or the `value_type` of
   // the time series.
   //
   // Time series data must be aligned in order to perform cross-time
-  // series reduction. If `crossSeriesReducer` is specified, then
-  // `perSeriesAligner` must be specified and not equal `ALIGN_NONE`
-  // and `alignmentPeriod` must be specified; otherwise, an error is
+  // series reduction. If `cross_series_reducer` is specified, then
+  // `per_series_aligner` must be specified and not equal to `ALIGN_NONE`
+  // and `alignment_period` must be specified; otherwise, an error is
   // returned.
   Aligner per_series_aligner = 2;
 
-  // The approach to be used to combine time series. Not all reducer
-  // functions may be applied to all time series, depending on the
-  // metric type and the value type of the original time
-  // series. Reduction may change the metric type of value type of the
-  // time series.
+  // The reduction operation to be used to combine time series into a single
+  // time series, where the value of each data point in the resulting series is
+  // a function of all the already aligned values in the input time series.
   //
-  // Time series data must be aligned in order to perform cross-time
-  // series reduction. If `crossSeriesReducer` is specified, then
-  // `perSeriesAligner` must be specified and not equal `ALIGN_NONE`
-  // and `alignmentPeriod` must be specified; otherwise, an error is
-  // returned.
+  // Not all reducer operations can be applied to all time series. The valid
+  // choices depend on the `metric_kind` and the `value_type` of the original
+  // time series. Reduction can yield a time series with a different
+  // `metric_kind` or `value_type` than the input time series.
+  //
+  // Time series data must first be aligned (see `per_series_aligner`) in order
+  // to perform cross-time series reduction. If `cross_series_reducer` is
+  // specified, then `per_series_aligner` must be specified, and must not be
+  // `ALIGN_NONE`. An `alignment_period` must also be specified; otherwise, an
+  // error is returned.
   Reducer cross_series_reducer = 4;
 
-  // The set of fields to preserve when `crossSeriesReducer` is
-  // specified. The `groupByFields` determine how the time series are
+  // The set of fields to preserve when `cross_series_reducer` is
+  // specified. The `group_by_fields` determine how the time series are
   // partitioned into subsets prior to applying the aggregation
-  // function. Each subset contains time series that have the same
+  // operation. Each subset contains time series that have the same
   // value for each of the grouping fields. Each individual time
   // series is a member of exactly one subset. The
-  // `crossSeriesReducer` is applied to each subset of time series.
+  // `cross_series_reducer` is applied to each subset of time series.
   // It is not possible to reduce across different resource types, so
   // this field implicitly contains `resource.type`.  Fields not
-  // specified in `groupByFields` are aggregated away.  If
-  // `groupByFields` is not specified and all the time series have
+  // specified in `group_by_fields` are aggregated away.  If
+  // `group_by_fields` is not specified and all the time series have
   // the same resource type, then the time series are aggregated into
-  // a single output time series. If `crossSeriesReducer` is not
+  // a single output time series. If `cross_series_reducer` is not
   // defined, this field is ignored.
   repeated string group_by_fields = 5;
 }
 
 // Describes a ranking-based time series filter. Each input time series is
-// ranked with an aligner. The filter lets through up to `num_time_series` time
-// series, selecting them based on the relative ranking.
+// ranked with an aligner. The filter will allow up to `num_time_series` time
+// series to pass through it, selecting them based on the relative ranking.
+//
+// For example, if `ranking_method` is `METHOD_MEAN`,`direction` is `BOTTOM`,
+// and `num_time_series` is 3, then the 3 times series with the lowest mean
+// values will pass through the filter.
 message PickTimeSeriesFilter {
-  // The value reducers that can be applied to a PickTimeSeriesFilter.
+  // The value reducers that can be applied to a `PickTimeSeriesFilter`.
   enum Method {
-    // Not allowed in well-formed requests.
+    // Not allowed. You must specify a different `Method` if you specify a
+    // `PickTimeSeriesFilter`.
     METHOD_UNSPECIFIED = 0;
 
     // Select the mean of all values.
@@ -353,21 +401,23 @@ message PickTimeSeriesFilter {
 
   // Describes the ranking directions.
   enum Direction {
-    // Not allowed in well-formed requests.
+    // Not allowed. You must specify a different `Direction` if you specify a
+    // `PickTimeSeriesFilter`.
     DIRECTION_UNSPECIFIED = 0;
 
-    // Pass the highest ranking inputs.
+    // Pass the highest `num_time_series` ranking inputs.
     TOP = 1;
 
-    // Pass the lowest ranking inputs.
+    // Pass the lowest `num_time_series` ranking inputs.
     BOTTOM = 2;
   }
 
-  // `rankingMethod` is applied to each time series independently to produce the
-  // value which will be used to compare the time series to other time series.
+  // `ranking_method` is applied to each time series independently to produce
+  // the value which will be used to compare the time series to other time
+  // series.
   Method ranking_method = 1;
 
-  // How many time series to return.
+  // How many time series to allow to pass through the filter.
   int32 num_time_series = 2;
 
   // How to use the ranking to select time series that pass through the filter.
@@ -376,6 +426,7 @@ message PickTimeSeriesFilter {
 
 // A filter that ranks streams based on their statistical relation to other
 // streams in a request.
+// Note: This field is deprecated and completely ignored by the API.
 message StatisticalTimeSeriesFilter {
   // The filter methods that can be applied to a stream.
   enum Method {
diff --git a/google/monitoring/dashboard/v1/dashboard.proto b/google/monitoring/dashboard/v1/dashboard.proto
index b973f4e47..7a25776ec 100644
--- a/google/monitoring/dashboard/v1/dashboard.proto
+++ b/google/monitoring/dashboard/v1/dashboard.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,28 +11,34 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
 package google.monitoring.dashboard.v1;
 
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
 import "google/monitoring/dashboard/v1/layouts.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "DashboardsProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // A Google Stackdriver dashboard. Dashboards define the content and layout
 // of pages in the Stackdriver web application.
 message Dashboard {
-  // The resource name of the dashboard.
-  string name = 1;
+  option (google.api.resource) = {
+    type: "monitoring.googleapis.com/Dashboard"
+    pattern: "projects/{project}/dashboards/{dashboard}"
+  };
+
+  // Immutable. The resource name of the dashboard.
+  string name = 1 [(google.api.field_behavior) = IMMUTABLE];
 
-  // The mutable, human-readable name.
-  string display_name = 2;
+  // Required. The mutable, human-readable name.
+  string display_name = 2 [(google.api.field_behavior) = REQUIRED];
 
   // `etag` is used for optimistic concurrency control as a way to help
   // prevent simultaneous updates of a policy from overwriting each other.
diff --git a/google/monitoring/dashboard/v1/dashboards_grpc_service_config.json b/google/monitoring/dashboard/v1/dashboards_grpc_service_config.json
new file mode 100644
index 000000000..bf48b1269
--- /dev/null
+++ b/google/monitoring/dashboard/v1/dashboards_grpc_service_config.json
@@ -0,0 +1,21 @@
+{
+  "methodConfig": [{
+    "name": [{ "service": "google.monitoring.dashboard.v1.DashboardsService" }],
+    "timeout": "30s",
+    "retryPolicy": {
+      "maxAttempts": 5,
+      "initialBackoff": "1s",
+      "maxBackoff": "10s",
+      "backoffMultiplier": 1.3,
+      "retryableStatusCodes": ["UNAVAILABLE", "UNKNOWN"]
+    }
+  },
+    {
+      "name": [
+        { "service": "google.monitoring.dashboard.v1.DashboardsService", "method": "CreateDashboard" },
+        { "service": "google.monitoring.dashboard.v1.DashboardsService", "method": "DeleteDashboard" },
+        { "service": "google.monitoring.dashboard.v1.DashboardsService", "method": "UpdateDashboard" }
+      ],
+      "timeout": "30s"
+    }]
+}
\ No newline at end of file
diff --git a/google/monitoring/dashboard/v1/dashboards_service.proto b/google/monitoring/dashboard/v1/dashboards_service.proto
index 83dbc2149..a7cbef56e 100644
--- a/google/monitoring/dashboard/v1/dashboards_service.proto
+++ b/google/monitoring/dashboard/v1/dashboards_service.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -19,16 +18,17 @@ package google.monitoring.dashboard.v1;
 
 import "google/api/annotations.proto";
 import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
 import "google/monitoring/dashboard/v1/dashboard.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/field_mask.proto";
 import "google/api/client.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "DashboardsServiceProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // Manages Stackdriver dashboards. A dashboard is an arrangement of data display
 // widgets in a specific layout.
@@ -100,9 +100,11 @@ service DashboardsService {
 
 // The `CreateDashboard` request.
 message CreateDashboardRequest {
-  // Required. The project on which to execute the request. The format is
-  // `"projects/{project_id_or_number}"`. The {project_id_or_number} must match
-  // the dashboard resource name.
+  // Required. The project on which to execute the request. The format is:
+  //
+  //     projects/[PROJECT_ID_OR_NUMBER]
+  //
+  // The `[PROJECT_ID_OR_NUMBER]` must match the dashboard resource name.
   string parent = 1 [(google.api.field_behavior) = REQUIRED];
 
   // Required. The initial dashboard specification.
@@ -111,9 +113,15 @@ message CreateDashboardRequest {
 
 // The `ListDashboards` request.
 message ListDashboardsRequest {
-  // Required. The scope of the dashboards to list. A project scope must be
-  // specified in the form of `"projects/{project_id_or_number}"`.
-  string parent = 1 [(google.api.field_behavior) = REQUIRED];
+  // Required. The scope of the dashboards to list. The format is:
+  //
+  //     projects/[PROJECT_ID_OR_NUMBER]
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "cloudresourcemanager.googleapis.com/Project"
+    }
+  ];
 
   // A positive number that is the maximum number of results to return.
   // If unspecified, a default of 1000 is used.
@@ -132,24 +140,36 @@ message ListDashboardsResponse {
 
   // If there are more results than have been returned, then this field is set
   // to a non-empty value.  To see the additional results,
-  // use that value as `pageToken` in the next call to this method.
+  // use that value as `page_token` in the next call to this method.
   string next_page_token = 2;
 }
 
 // The `GetDashboard` request.
 message GetDashboardRequest {
-  // Required. The resource name of the Dashboard. The format is one of
-  // `"dashboards/{dashboard_id}"` (for system dashboards) or
-  // `"projects/{project_id_or_number}/dashboards/{dashboard_id}"`
-  // (for custom dashboards).
-  string name = 1 [(google.api.field_behavior) = REQUIRED];
+  // Required. The resource name of the Dashboard. The format is one of:
+  //
+  //  -  `dashboards/[DASHBOARD_ID]` (for system dashboards)
+  //  -  `projects/[PROJECT_ID_OR_NUMBER]/dashboards/[DASHBOARD_ID]`
+  //       (for custom dashboards).
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "monitoring.googleapis.com/Dashboard"
+    }
+  ];
 }
 
 // The `DeleteDashboard` request.
 message DeleteDashboardRequest {
-  // Required. The resource name of the Dashboard. The format is
-  // `"projects/{project_id_or_number}/dashboards/{dashboard_id}"`.
-  string name = 1 [(google.api.field_behavior) = REQUIRED];
+  // Required. The resource name of the Dashboard. The format is:
+  //
+  //     projects/[PROJECT_ID_OR_NUMBER]/dashboards/[DASHBOARD_ID]
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "monitoring.googleapis.com/Dashboard"
+    }
+  ];
 }
 
 // The `UpdateDashboard` request.
diff --git a/google/monitoring/dashboard/v1/drilldowns.proto b/google/monitoring/dashboard/v1/drilldowns.proto
index d551b48d0..0080df5c7 100644
--- a/google/monitoring/dashboard/v1/drilldowns.proto
+++ b/google/monitoring/dashboard/v1/drilldowns.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,14 +11,15 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
 package google.monitoring.dashboard.v1;
 
+import "google/monitoring/dashboard/v1/common.proto";
+
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "DrilldownsProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
diff --git a/google/monitoring/dashboard/v1/layouts.proto b/google/monitoring/dashboard/v1/layouts.proto
index 278c77050..acc0517c3 100644
--- a/google/monitoring/dashboard/v1/layouts.proto
+++ b/google/monitoring/dashboard/v1/layouts.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -20,10 +19,10 @@ package google.monitoring.dashboard.v1;
 import "google/monitoring/dashboard/v1/widget.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "LayoutsProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // A basic layout divides the available space into vertical columns of equal
 // width and arranges a list of widgets using a row-first strategy.
diff --git a/google/monitoring/dashboard/v1/metrics.proto b/google/monitoring/dashboard/v1/metrics.proto
index 1487c3003..2fff1d20a 100644
--- a/google/monitoring/dashboard/v1/metrics.proto
+++ b/google/monitoring/dashboard/v1/metrics.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -21,10 +20,10 @@ import "google/api/field_behavior.proto";
 import "google/monitoring/dashboard/v1/common.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "MetricsProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // TimeSeriesQuery collects the set of supported methods for querying time
 // series data from the Stackdriver metrics API.
@@ -36,23 +35,26 @@ message TimeSeriesQuery {
 
     // Parameters to fetch a ratio between two time series filters.
     TimeSeriesFilterRatio time_series_filter_ratio = 2;
+
+    // A query used to fetch time series.
+    string time_series_query_language = 3;
   }
 
   // The unit of data contained in fetched time series. If non-empty, this
   // unit will override any unit that accompanies fetched data. The format is
   // the same as the
-  // [`unit`](/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors)
+  // [`unit`](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors)
   // field in `MetricDescriptor`.
   string unit_override = 5;
 }
 
 // A filter that defines a subset of time series data that is displayed in a
 // widget. Time series data is fetched using the
-// [`ListTimeSeries`](/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list)
+// [`ListTimeSeries`](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list)
 // method.
 message TimeSeriesFilter {
-  // Required. The [monitoring filter](/monitoring/api/v3/filters) that identifies the
-  // metric types, resources, and projects to query.
+  // Required. The [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters)
+  // that identifies the metric types, resources, and projects to query.
   string filter = 1 [(google.api.field_behavior) = REQUIRED];
 
   // By default, the raw time series data is returned.
@@ -60,13 +62,17 @@ message TimeSeriesFilter {
   // data.
   Aggregation aggregation = 2;
 
+  // Apply a second aggregation after `aggregation` is applied.
+  Aggregation secondary_aggregation = 3;
+
   // Selects an optional time series filter.
   oneof output_filter {
     // Ranking based time series filter.
     PickTimeSeriesFilter pick_time_series_filter = 4;
 
     // Statistics based time series filter.
-    StatisticalTimeSeriesFilter statistical_time_series_filter = 5;
+    // Note: This field is deprecated and completely ignored by the API.
+    StatisticalTimeSeriesFilter statistical_time_series_filter = 5 [deprecated = true];
   }
 }
 
@@ -77,8 +83,9 @@ message TimeSeriesFilterRatio {
   // Describes a query to build the numerator or denominator of a
   // TimeSeriesFilterRatio.
   message RatioPart {
-    // Required. The [monitoring filter](/monitoring/api/v3/filters) that identifies the
-    // metric types, resources, and projects to query.
+    // Required. The [monitoring
+    // filter](https://cloud.google.com/monitoring/api/v3/filters) that
+    // identifies the metric types, resources, and projects to query.
     string filter = 1 [(google.api.field_behavior) = REQUIRED];
 
     // By default, the raw time series data is returned.
@@ -103,7 +110,8 @@ message TimeSeriesFilterRatio {
     PickTimeSeriesFilter pick_time_series_filter = 4;
 
     // Statistics based time series filter.
-    StatisticalTimeSeriesFilter statistical_time_series_filter = 5;
+    // Note: This field is deprecated and completely ignored by the API.
+    StatisticalTimeSeriesFilter statistical_time_series_filter = 5 [deprecated = true];
   }
 }
 
diff --git a/google/monitoring/dashboard/v1/monitoring.yaml b/google/monitoring/dashboard/v1/monitoring.yaml
index 25f31317f..a01d1a2cb 100644
--- a/google/monitoring/dashboard/v1/monitoring.yaml
+++ b/google/monitoring/dashboard/v1/monitoring.yaml
@@ -1,14 +1,19 @@
 type: google.api.Service
 config_version: 3
 name: monitoring.googleapis.com
-title: Stackdriver Monitoring Dashboards API
+title: Cloud Monitoring API
 
 apis:
 - name: google.monitoring.dashboard.v1.DashboardsService
 
 documentation:
   summary: |-
-   Manages dashboard configurations used in the Stackdriver UI.
+    Manages your Cloud Monitoring data and configurations. Most projects must
+    be associated with a Workspace, with a few exceptions as noted on the
+    individual method pages. The table entries below are presented in
+    alphabetical order, not in order of common use. For explanations of the
+    concepts found in the table entries, read the [Cloud Monitoring
+    documentation](/monitoring/docs).
 
 authentication:
   rules:
diff --git a/google/monitoring/dashboard/v1/scorecard.proto b/google/monitoring/dashboard/v1/scorecard.proto
index dd2633bec..1820c0311 100644
--- a/google/monitoring/dashboard/v1/scorecard.proto
+++ b/google/monitoring/dashboard/v1/scorecard.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,20 +11,20 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
 package google.monitoring.dashboard.v1;
 
+import "google/api/field_behavior.proto";
 import "google/monitoring/dashboard/v1/metrics.proto";
 import "google/protobuf/duration.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "ScorecardProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // A widget showing the latest value of a metric, and how this value relates to
 // one or more thresholds.
@@ -47,8 +47,8 @@ message Scorecard {
   // to show up on a Scorecard, showing recent trends of the scorecard's
   // timeseries.
   message SparkChartView {
-    // The type of sparkchart to show in this chartView.
-    SparkChartType spark_chart_type = 1;
+    // Required. The type of sparkchart to show in this chartView.
+    SparkChartType spark_chart_type = 1 [(google.api.field_behavior) = REQUIRED];
 
     // The lower bound on data point frequency in the chart implemented by
     // specifying the minimum alignment period to use in a time series query.
@@ -58,9 +58,9 @@ message Scorecard {
     google.protobuf.Duration min_alignment_period = 2;
   }
 
-  // Fields for querying time series data from the
+  // Required. Fields for querying time series data from the
   // Stackdriver metrics API.
-  TimeSeriesQuery time_series_query = 1;
+  TimeSeriesQuery time_series_query = 1 [(google.api.field_behavior) = REQUIRED];
 
   // Defines the optional additional chart shown on the scorecard. If
   // neither is included - then a default scorecard is shown.
diff --git a/google/monitoring/dashboard/v1/service.proto b/google/monitoring/dashboard/v1/service.proto
index 1d2151077..5bb41ec59 100644
--- a/google/monitoring/dashboard/v1/service.proto
+++ b/google/monitoring/dashboard/v1/service.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,14 +11,13 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
 package google.monitoring.dashboard.v1;
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "ServiceMonitoringProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
diff --git a/google/monitoring/dashboard/v1/text.proto b/google/monitoring/dashboard/v1/text.proto
index 537daeacb..acc1671fc 100644
--- a/google/monitoring/dashboard/v1/text.proto
+++ b/google/monitoring/dashboard/v1/text.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,17 +11,16 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
 package google.monitoring.dashboard.v1;
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "TextProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // A widget that displays textual content.
 message Text {
diff --git a/google/monitoring/dashboard/v1/widget.proto b/google/monitoring/dashboard/v1/widget.proto
index cb9282af8..12b5a698b 100644
--- a/google/monitoring/dashboard/v1/widget.proto
+++ b/google/monitoring/dashboard/v1/widget.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -24,10 +23,10 @@ import "google/monitoring/dashboard/v1/xychart.proto";
 import "google/protobuf/empty.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "WidgetProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // Widget contains a single dashboard component and configuration of how to
 // present the component in the dashboard.
diff --git a/google/monitoring/dashboard/v1/xychart.proto b/google/monitoring/dashboard/v1/xychart.proto
index 3d768b7bc..d241ae783 100644
--- a/google/monitoring/dashboard/v1/xychart.proto
+++ b/google/monitoring/dashboard/v1/xychart.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -22,10 +21,10 @@ import "google/monitoring/dashboard/v1/metrics.proto";
 import "google/protobuf/duration.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/monitoring/dashboard/v1;dashboard";
-option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 option java_multiple_files = true;
 option java_outer_classname = "XyChartProto";
 option java_package = "com.google.monitoring.dashboard.v1";
+option ruby_package = "Google::Cloud::Monitoring::Dashboard::V1";
 
 // A chart that displays data on a 2D (X and Y axes) plane.
 message XyChart {
@@ -58,15 +57,15 @@ message XyChart {
       HEATMAP = 4;
     }
 
-    // Fields for querying time series data from the
+    // Required. Fields for querying time series data from the
     // Stackdriver metrics API.
-    TimeSeriesQuery time_series_query = 1;
+    TimeSeriesQuery time_series_query = 1 [(google.api.field_behavior) = REQUIRED];
 
     // How this data should be plotted on the chart.
     PlotType plot_type = 2;
 
     // A template string for naming `TimeSeries` in the resulting data set.
-    // This should be a string with interpolations of the form ${label_name},
+    // This should be a string with interpolations of the form `${label_name}`,
     // which will resolve to the label's value.
     string legend_template = 3;
 
@@ -99,8 +98,8 @@ message XyChart {
     Scale scale = 2;
   }
 
-  // The data displayed in this chart.
-  repeated DataSet data_sets = 1;
+  // Required. The data displayed in this chart.
+  repeated DataSet data_sets = 1 [(google.api.field_behavior) = REQUIRED];
 
   // The duration used to display a comparison chart. A comparison chart
   // simultaneously shows values from two similar-length time periods
diff --git a/google/monitoring/v3/BUILD.bazel b/google/monitoring/v3/BUILD.bazel
index 1808da10d..e2419b81e 100644
--- a/google/monitoring/v3/BUILD.bazel
+++ b/google/monitoring/v3/BUILD.bazel
@@ -305,7 +305,7 @@ load(
 nodejs_gapic_library(
     name = "monitoring_nodejs_gapic",
     src = ":monitoring_proto_with_info",
-    gapic_yaml = "monitoring_gapic.yaml",
+    grpc_service_config = "monitoring_grpc_service_config.json",
     package = "google.monitoring.v3",
     service_yaml = "monitoring.yaml",
     deps = [],
diff --git a/google/monitoring/v3/common.proto b/google/monitoring/v3/common.proto
index f1b38c234..262422252 100644
--- a/google/monitoring/v3/common.proto
+++ b/google/monitoring/v3/common.proto
@@ -51,7 +51,11 @@ message TypedValue {
   }
 }
 
-// A closed time interval. It extends from the start time to the end time, and includes both: `[startTime, endTime]`. Valid time intervals depend on the [`MetricKind`](/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind) of the metric value. In no case can the end time be earlier than the start time.
+// A closed time interval. It extends from the start time to the end time, and
+// includes both: `[startTime, endTime]`. Valid time intervals depend on the
+// [`MetricKind`](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind)
+// of the metric value. In no case can the end time be earlier than the start
+// time.
 //
 // * For a `GAUGE` metric, the `startTime` value is technically optional; if
 //   no value is specified, the start time defaults to the value of the
diff --git a/google/privacy/dlp/v2/BUILD.bazel b/google/privacy/dlp/v2/BUILD.bazel
index d58be0fb9..4f4f0bd6a 100644
--- a/google/privacy/dlp/v2/BUILD.bazel
+++ b/google/privacy/dlp/v2/BUILD.bazel
@@ -270,7 +270,7 @@ load(
 nodejs_gapic_library(
     name = "dlp_nodejs_gapic",
     src = ":dlp_proto_with_info",
-    gapic_yaml = "dlp_gapic.yaml",
+    grpc_service_config = "dlp_grpc_service_config.json",
     package = "google.privacy.dlp.v2",
     service_yaml = "dlp_v2.yaml",
     deps = [],
diff --git a/google/privacy/dlp/v2/dlp.proto b/google/privacy/dlp/v2/dlp.proto
index 29291fa5a..dea496258 100644
--- a/google/privacy/dlp/v2/dlp.proto
+++ b/google/privacy/dlp/v2/dlp.proto
@@ -2423,16 +2423,16 @@ message CryptoReplaceFfxFpeConfig {
     // Unused.
     FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED = 0;
 
-    // [0-9] (radix of 10)
+    // `[0-9]` (radix of 10)
     NUMERIC = 1;
 
-    // [0-9A-F] (radix of 16)
+    // `[0-9A-F]` (radix of 16)
     HEXADECIMAL = 2;
 
-    // [0-9A-Z] (radix of 36)
+    // `[0-9A-Z]` (radix of 36)
     UPPER_CASE_ALPHA_NUMERIC = 3;
 
-    // [0-9A-Za-z] (radix of 62)
+    // `[0-9A-Za-z]` (radix of 62)
     ALPHA_NUMERIC = 4;
   }
 
@@ -2491,7 +2491,7 @@ message CryptoReplaceFfxFpeConfig {
   //
   // This annotation identifies the surrogate when inspecting content using the
   // custom infoType
-  // [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
+  // [`SurrogateType`](https://cloud.google.com/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
   // This facilitates reversal of the surrogate when it occurs in free text.
   //
   // In order for inspection to work properly, the name of this infoType must
@@ -2982,7 +2982,7 @@ message Action {
   // Publish a message into given Pub/Sub topic when DlpJob has completed. The
   // message contains a single field, `DlpJobName`, which is equal to the
   // finished job's
-  // [`DlpJob.name`](/dlp/docs/reference/rest/v2/projects.dlpJobs#DlpJob).
+  // [`DlpJob.name`](https://cloud.google.com/dlp/docs/reference/rest/v2/projects.dlpJobs#DlpJob).
   // Compatible with: Inspect, Risk
   message PublishToPubSub {
     // Cloud Pub/Sub topic to send notifications to. The topic must have given
diff --git a/google/privacy/dlp/v2/storage.proto b/google/privacy/dlp/v2/storage.proto
index 9408d6de7..9276bb4b5 100644
--- a/google/privacy/dlp/v2/storage.proto
+++ b/google/privacy/dlp/v2/storage.proto
@@ -128,7 +128,7 @@ message CustomInfoType {
 
   // Message for detecting output from deidentification transformations
   // such as
-  // [`CryptoReplaceFfxFpeConfig`](/dlp/docs/reference/rest/v2/organizations.deidentifyTemplates#cryptoreplaceffxfpeconfig).
+  // [`CryptoReplaceFfxFpeConfig`](https://cloud.google.com/dlp/docs/reference/rest/v2/organizations.deidentifyTemplates#cryptoreplaceffxfpeconfig).
   // These types of transformations are
   // those that perform pseudonymization, thereby producing a "surrogate" as
   // output. This should be used in conjunction with a field on the
diff --git a/google/pubsub/v1/BUILD.bazel b/google/pubsub/v1/BUILD.bazel
index 0185b6853..147cd738a 100644
--- a/google/pubsub/v1/BUILD.bazel
+++ b/google/pubsub/v1/BUILD.bazel
@@ -267,7 +267,7 @@ load(
 nodejs_gapic_library(
     name = "pubsub_nodejs_gapic",
     src = ":pubsub_proto_with_info",
-    gapic_yaml = "pubsub_gapic.yaml",
+    grpc_service_config = "pubsub_grpc_service_config.json",
     service_yaml = ":pubsub_v1.yaml",
     deps = [],
 )
diff --git a/google/pubsub/v1/pubsub.proto b/google/pubsub/v1/pubsub.proto
index a42d03220..5bb1f14a5 100644
--- a/google/pubsub/v1/pubsub.proto
+++ b/google/pubsub/v1/pubsub.proto
@@ -88,7 +88,7 @@ service Publisher {
     option (google.api.method_signature) = "project";
   }
 
-  // Lists the names of the subscriptions on this topic.
+  // Lists the names of the attached subscriptions on this topic.
   rpc ListTopicSubscriptions(ListTopicSubscriptionsRequest)
       returns (ListTopicSubscriptionsResponse) {
     option (google.api.http) = {
@@ -122,8 +122,20 @@ service Publisher {
     };
     option (google.api.method_signature) = "topic";
   }
+
+  // Detaches a subscription from this topic. All messages retained in the
+  // subscription are dropped. Subsequent `Pull` and `StreamingPull` requests
+  // will return FAILED_PRECONDITION. If the subscription is a push
+  // subscription, pushes to the endpoint will stop.
+  rpc DetachSubscription(DetachSubscriptionRequest)
+      returns (DetachSubscriptionResponse) {
+    option (google.api.http) = {
+      post: "/v1/{subscription=projects/*/subscriptions/*}:detach"
+    };
+  }
 }
 
+// A policy constraining the storage of messages published to the topic.
 message MessageStoragePolicy {
   // A list of IDs of GCP regions where messages that are published to the topic
   // may be persisted in storage. Messages published by publishers running in
@@ -179,7 +191,8 @@ message PubsubMessage {
   bytes data = 1;
 
   // Attributes for this message. If this field is empty, the message must
-  // contain non-empty data.
+  // contain non-empty data. This can be used to filter messages on the
+  // subscription.
   map attributes = 2;
 
   // ID of this message, assigned by the server when the message is published.
@@ -300,7 +313,7 @@ message ListTopicSubscriptionsRequest {
 
 // Response for the `ListTopicSubscriptions` method.
 message ListTopicSubscriptionsResponse {
-  // The names of the subscriptions that match the request.
+  // The names of subscriptions attached to the topic specified in the request.
   repeated string subscriptions = 1 [(google.api.resource_reference) = {
     type: "pubsub.googleapis.com/Subscription"
   }];
@@ -350,6 +363,22 @@ message DeleteTopicRequest {
   ];
 }
 
+// Request for the DetachSubscription method.
+message DetachSubscriptionRequest {
+  // Required. The subscription to detach.
+  // Format is `projects/{project}/subscriptions/{subscription}`.
+  string subscription = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "pubsub.googleapis.com/Subscription"
+    }
+  ];
+}
+
+// Response for the DetachSubscription method.
+// Reserved for future use.
+message DetachSubscriptionResponse {}
+
 // The service that an application uses to manipulate subscriptions and to
 // consume messages from a subscription via the `Pull` method or by
 // establishing a bi-directional stream using the `StreamingPull` method.
@@ -672,13 +701,11 @@ message Subscription {
   // value for `expiration_policy.ttl` is 1 day.
   ExpirationPolicy expiration_policy = 11;
 
-  // An expression written in the Cloud Pub/Sub filter language. If non-empty,
+  // An expression written in the Pub/Sub [filter
+  // language](https://cloud.google.com/pubsub/docs/filtering). If non-empty,
   // then only `PubsubMessage`s whose `attributes` field matches the filter are
   // delivered on this subscription. If empty, then no messages are filtered
   // out.
-  // EXPERIMENTAL: This feature is part of a closed alpha release. This
-  // API might be changed in backward-incompatible ways and is not recommended
-  // for production use. It is not subject to any SLA or deprecation policy.
   string filter = 12;
 
   // A policy that specifies the conditions for dead lettering messages in
@@ -691,17 +718,21 @@ message Subscription {
   // permission to Acknowledge() messages on this subscription.
   DeadLetterPolicy dead_letter_policy = 13;
 
-  // A policy that specifies how Cloud Pub/Sub retries message delivery for this
+  // A policy that specifies how Pub/Sub retries message delivery for this
   // subscription.
   //
   // If not set, the default retry policy is applied. This generally implies
   // that messages will be retried as soon as possible for healthy subscribers.
   // RetryPolicy will be triggered on NACKs or acknowledgement deadline
   // exceeded events for a given message.
-  // EXPERIMENTAL: This API might be changed in backward-incompatible
-  // ways and is not recommended for production use. It is not subject to any
-  // SLA or deprecation policy.
   RetryPolicy retry_policy = 14;
+
+  // Indicates whether the subscription is detached from its topic. Detached
+  // subscriptions don't receive messages from their topic and don't retain any
+  // backlog. `Pull` and `StreamingPull` requests will return
+  // FAILED_PRECONDITION. If the subscription is a push subscription, pushes to
+  // the endpoint will not be made.
+  bool detached = 15;
 }
 
 // A policy that specifies how Cloud Pub/Sub retries message delivery.
diff --git a/google/pubsub/v1/pubsub_grpc_service_config.json b/google/pubsub/v1/pubsub_grpc_service_config.json
index 15abf6f93..aba23982c 100755
--- a/google/pubsub/v1/pubsub_grpc_service_config.json
+++ b/google/pubsub/v1/pubsub_grpc_service_config.json
@@ -14,6 +14,10 @@
           "service": "google.pubsub.v1.Publisher",
           "method": "DeleteTopic"
         },
+        {
+          "service": "google.pubsub.v1.Publisher",
+          "method": "DetachSubscription"
+        },
         {
           "service": "google.pubsub.v1.Publisher",
           "method": "SetIamPolicy"
diff --git a/google/spanner/admin/database/v1/BUILD.bazel b/google/spanner/admin/database/v1/BUILD.bazel
index 2acb01f60..70ca97ce5 100644
--- a/google/spanner/admin/database/v1/BUILD.bazel
+++ b/google/spanner/admin/database/v1/BUILD.bazel
@@ -131,7 +131,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -271,7 +270,7 @@ load(
 nodejs_gapic_library(
     name = "database_nodejs_gapic",
     src = ":database_proto_with_info",
-    gapic_yaml = "spanner_admin_database_gapic.yaml",
+    grpc_service_config = "spanner_admin_database_grpc_service_config.json",
     package = "google.spanner.admin.database.v1",
     service_yaml = "spanner_admin_database.yaml",
     deps = [],
diff --git a/google/spanner/admin/database/v1/backup.proto b/google/spanner/admin/database/v1/backup.proto
index b883adf34..e33fadddd 100644
--- a/google/spanner/admin/database/v1/backup.proto
+++ b/google/spanner/admin/database/v1/backup.proto
@@ -30,6 +30,7 @@ option java_multiple_files = true;
 option java_outer_classname = "BackupProto";
 option java_package = "com.google.spanner.admin.database.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\Admin\\Database\\V1";
+option ruby_package = "Google::Cloud::Spanner::Admin::Database::V1";
 
 // A backup of a Cloud Spanner database.
 message Backup {
diff --git a/google/spanner/admin/database/v1/common.proto b/google/spanner/admin/database/v1/common.proto
index 4914cb8ac..27ecb0a98 100644
--- a/google/spanner/admin/database/v1/common.proto
+++ b/google/spanner/admin/database/v1/common.proto
@@ -26,6 +26,7 @@ option java_multiple_files = true;
 option java_outer_classname = "CommonProto";
 option java_package = "com.google.spanner.admin.database.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\Admin\\Database\\V1";
+option ruby_package = "Google::Cloud::Spanner::Admin::Database::V1";
 
 // Encapsulates progress related information for a Cloud Spanner long
 // running operation.
diff --git a/google/spanner/admin/database/v1/spanner_admin_database_gapic.legacy.yaml b/google/spanner/admin/database/v1/spanner_admin_database_gapic.legacy.yaml
index 6155bfda8..af3feed7a 100644
--- a/google/spanner/admin/database/v1/spanner_admin_database_gapic.legacy.yaml
+++ b/google/spanner/admin/database/v1/spanner_admin_database_gapic.legacy.yaml
@@ -67,7 +67,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       parent: instance
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: CreateDatabase
     flattening:
       groups:
@@ -102,7 +102,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       name: database
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: UpdateDatabaseDdl
     flattening:
       groups:
@@ -150,7 +150,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       database: database
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: SetIamPolicy
     flattening:
       groups:
@@ -225,7 +225,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       name: backup
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: UpdateBackup
     flattening:
       groups:
@@ -239,7 +239,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       backup.name: backup
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: DeleteBackup
     flattening:
       groups:
@@ -272,7 +272,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       parent: instance
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: RestoreDatabase
     flattening:
       groups:
@@ -314,7 +314,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       parent: instance
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: ListBackupOperations
     flattening:
       groups:
@@ -335,7 +335,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       parent: instance
-    timeout_millis: 600000
+    timeout_millis: 3600000
 resource_name_generation:
 - message_name: ListDatabasesRequest
   field_entity_map:
diff --git a/google/spanner/admin/database/v1/spanner_admin_database_gapic.yaml b/google/spanner/admin/database/v1/spanner_admin_database_gapic.yaml
index 0df2c7710..b3ba4884f 100644
--- a/google/spanner/admin/database/v1/spanner_admin_database_gapic.yaml
+++ b/google/spanner/admin/database/v1/spanner_admin_database_gapic.yaml
@@ -35,6 +35,10 @@ interfaces:
     max_rpc_timeout_millis: 60000
     total_timeout_millis: 600000
   methods:
+  - name: ListDatabases
+    retry_codes_name: idempotent
+    retry_params_name: default
+    timeout_millis: 3600000
   - name: CreateDatabase
     long_running:
       initial_poll_delay_millis: 20000
@@ -43,7 +47,7 @@ interfaces:
       total_poll_timeout_millis: 86400000
     timeout_millis: 3600000
   - name: GetDatabase
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: UpdateDatabaseDdl
     retry_codes_name: idempotent
     retry_params_name: default
@@ -58,7 +62,7 @@ interfaces:
     retry_params_name: default
     timeout_millis: 3600000
   - name: GetDatabaseDdl
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: SetIamPolicy
     timeout_millis: 30000
   - name: GetIamPolicy
@@ -79,11 +83,11 @@ interfaces:
   - name: GetBackup
     retry_codes_name: idempotent
     retry_params_name: default
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: UpdateBackup
     retry_codes_name: non_idempotent
     retry_params_name: default
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: DeleteBackup
     retry_codes_name: idempotent
     retry_params_name: default
@@ -91,7 +95,7 @@ interfaces:
   - name: ListBackups
     retry_codes_name: idempotent
     retry_params_name: default
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: RestoreDatabase
     retry_codes_name: non_idempotent
     retry_params_name: default
@@ -104,8 +108,8 @@ interfaces:
   - name: ListDatabaseOperations
     retry_codes_name: idempotent
     retry_params_name: default
-    timeout_millis: 600000
+    timeout_millis: 3600000
   - name: ListBackupOperations
     retry_codes_name: idempotent
     retry_params_name: default
-    timeout_millis: 600000
+    timeout_millis: 3600000
diff --git a/google/spanner/admin/database/v1/spanner_admin_database_grpc_service_config.json b/google/spanner/admin/database/v1/spanner_admin_database_grpc_service_config.json
index e19bb95b9..4eb2525bf 100755
--- a/google/spanner/admin/database/v1/spanner_admin_database_grpc_service_config.json
+++ b/google/spanner/admin/database/v1/spanner_admin_database_grpc_service_config.json
@@ -22,29 +22,17 @@
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
           "method": "GetDatabaseDdl"
         },
-        {
-          "service": "google.spanner.admin.database.v1.DatabaseAdmin",
-          "method": "GetIamPolicy"
-        },
         {
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
           "method": "GetBackup"
         },
-        {
-          "service": "google.spanner.admin.database.v1.DatabaseAdmin",
-          "method": "UpdateBackup"
-        },
-        {
-          "service": "google.spanner.admin.database.v1.DatabaseAdmin",
-          "method": "DeleteBackup"
-        },
         {
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
           "method": "ListBackups"
         },
         {
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
-          "method": "RestoreDatabase"
+          "method": "DeleteBackup"
         },
         {
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
@@ -66,6 +54,24 @@
         ]
       }
     },
+    {
+      "name": [
+        {
+          "service": "google.spanner.admin.database.v1.DatabaseAdmin",
+          "method": "GetIamPolicy"
+        }
+      ],
+      "timeout": "30s",
+      "retryPolicy": {
+        "initialBackoff": "1s",
+        "maxBackoff": "32s",
+        "backoffMultiplier": 1.3,
+        "retryableStatusCodes": [
+          "UNAVAILABLE",
+          "DEADLINE_EXCEEDED"
+        ]
+      }
+    },
     {
       "name": [
         {
@@ -74,18 +80,31 @@
         },
         {
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
-          "method": "SetIamPolicy"
+          "method": "CreateBackup"
         },
         {
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
-          "method": "TestIamPermissions"
+          "method": "UpdateBackup"
         },
         {
           "service": "google.spanner.admin.database.v1.DatabaseAdmin",
-          "method": "CreateBackup"
+          "method": "RestoreDatabase"
         }
       ],
       "timeout": "3600s"
+    },
+    {
+      "name": [
+        {
+          "service": "google.spanner.admin.database.v1.DatabaseAdmin",
+          "method": "SetIamPolicy"
+        },
+        {
+          "service": "google.spanner.admin.database.v1.DatabaseAdmin",
+          "method": "TestIamPermissions"
+        }
+      ],
+      "timeout": "30s"
     }
   ]
 }
diff --git a/google/spanner/admin/database/v1/spanner_database_admin.proto b/google/spanner/admin/database/v1/spanner_database_admin.proto
index d48adc8ab..e51f178a3 100644
--- a/google/spanner/admin/database/v1/spanner_database_admin.proto
+++ b/google/spanner/admin/database/v1/spanner_database_admin.proto
@@ -34,6 +34,7 @@ option java_multiple_files = true;
 option java_outer_classname = "SpannerDatabaseAdminProto";
 option java_package = "com.google.spanner.admin.database.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\Admin\\Database\\V1";
+option ruby_package = "Google::Cloud::Spanner::Admin::Database::V1";
 option (google.api.resource_definition) = {
   type: "spanner.googleapis.com/Instance"
   pattern: "projects/{project}/instances/{instance}"
diff --git a/google/spanner/admin/instance/v1/BUILD.bazel b/google/spanner/admin/instance/v1/BUILD.bazel
index 41bcb7d1f..063f7b144 100644
--- a/google/spanner/admin/instance/v1/BUILD.bazel
+++ b/google/spanner/admin/instance/v1/BUILD.bazel
@@ -129,7 +129,6 @@ go_gapic_library(
         "//google/longrunning:longrunning_go_gapic",
         "//google/longrunning:longrunning_go_proto",
         "@com_google_cloud_go//longrunning:go_default_library",
-        "@com_google_cloud_go//longrunning/autogen:go_default_library",
     ],
 )
 
@@ -269,7 +268,7 @@ load(
 nodejs_gapic_library(
     name = "instance_nodejs_gapic",
     src = ":instance_proto_with_info",
-    gapic_yaml = "spanner_admin_instance_gapic.yaml",
+    grpc_service_config = "spanner_admin_instance_grpc_service_config.json",
     package = "google.spanner.admin.instance.v1",
     service_yaml = "spanner_admin_instance.yaml",
     deps = [],
diff --git a/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.legacy.yaml b/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.legacy.yaml
index 1c0358db5..8e149a7e5 100644
--- a/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.legacy.yaml
+++ b/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.legacy.yaml
@@ -67,7 +67,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       parent: project
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: GetInstanceConfig
     flattening:
       groups:
@@ -80,7 +80,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       name: instance_config
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: ListInstances
     flattening:
       groups:
@@ -100,7 +100,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       parent: project
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: GetInstance
     flattening:
       groups:
@@ -113,7 +113,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       name: instance
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: CreateInstance
     flattening:
       groups:
@@ -130,7 +130,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       parent: project
-    timeout_millis: 30000
+    timeout_millis: 3600000
     long_running:
       return_type: google.spanner.admin.instance.v1.Instance
       metadata_type: google.spanner.admin.instance.v1.CreateInstanceMetadata
@@ -152,7 +152,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       instance.name: instance
-    timeout_millis: 30000
+    timeout_millis: 3600000
     long_running:
       return_type: google.spanner.admin.instance.v1.Instance
       metadata_type: google.spanner.admin.instance.v1.UpdateInstanceMetadata
@@ -172,7 +172,7 @@ interfaces:
     retry_params_name: default
     field_name_patterns:
       name: instance
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: SetIamPolicy
     flattening:
       groups:
diff --git a/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.yaml b/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.yaml
index 0bfc10cdf..570bc8f54 100644
--- a/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.yaml
+++ b/google/spanner/admin/instance/v1/spanner_admin_instance_gapic.yaml
@@ -36,31 +36,31 @@ interfaces:
     total_timeout_millis: 600000
   methods:
   - name: ListInstanceConfigs
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: GetInstanceConfig
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: ListInstances
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: GetInstance
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: CreateInstance
     long_running:
       initial_poll_delay_millis: 20000
       poll_delay_multiplier: 1.5
       max_poll_delay_millis: 45000
       total_poll_timeout_millis: 86400000
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: UpdateInstance
     long_running:
       initial_poll_delay_millis: 20000
       poll_delay_multiplier: 1.5
       max_poll_delay_millis: 45000
       total_poll_timeout_millis: 86400000
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: DeleteInstance
     retry_codes_name: idempotent
     retry_params_name: default
-    timeout_millis: 30000
+    timeout_millis: 3600000
   - name: SetIamPolicy
     timeout_millis: 30000
   - name: GetIamPolicy
diff --git a/google/spanner/admin/instance/v1/spanner_admin_instance_grpc_service_config.json b/google/spanner/admin/instance/v1/spanner_admin_instance_grpc_service_config.json
index e44367443..f1241560e 100755
--- a/google/spanner/admin/instance/v1/spanner_admin_instance_grpc_service_config.json
+++ b/google/spanner/admin/instance/v1/spanner_admin_instance_grpc_service_config.json
@@ -21,13 +21,27 @@
         {
           "service": "google.spanner.admin.instance.v1.InstanceAdmin",
           "method": "DeleteInstance"
-        },
+        }
+      ],
+      "timeout": "3600s",
+      "retryPolicy": {
+        "initialBackoff": "1s",
+        "maxBackoff": "32s",
+        "backoffMultiplier": 1.3,
+        "retryableStatusCodes": [
+          "UNAVAILABLE",
+          "DEADLINE_EXCEEDED"
+        ]
+      }
+    },
+    {
+      "name": [
         {
           "service": "google.spanner.admin.instance.v1.InstanceAdmin",
           "method": "GetIamPolicy"
         }
       ],
-      "timeout": "3600s",
+      "timeout": "30s",
       "retryPolicy": {
         "initialBackoff": "1s",
         "maxBackoff": "32s",
@@ -47,7 +61,12 @@
         {
           "service": "google.spanner.admin.instance.v1.InstanceAdmin",
           "method": "UpdateInstance"
-        },
+        }
+      ],
+      "timeout": "3600s"
+    },
+    {
+      "name": [
         {
           "service": "google.spanner.admin.instance.v1.InstanceAdmin",
           "method": "SetIamPolicy"
@@ -57,7 +76,7 @@
           "method": "TestIamPermissions"
         }
       ],
-      "timeout": "3600s"
+      "timeout": "30s"
     }
   ]
 }
diff --git a/google/spanner/admin/instance/v1/spanner_instance_admin.proto b/google/spanner/admin/instance/v1/spanner_instance_admin.proto
index 6a068baca..54767bf26 100644
--- a/google/spanner/admin/instance/v1/spanner_instance_admin.proto
+++ b/google/spanner/admin/instance/v1/spanner_instance_admin.proto
@@ -33,6 +33,7 @@ option java_multiple_files = true;
 option java_outer_classname = "SpannerInstanceAdminProto";
 option java_package = "com.google.spanner.admin.instance.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\Admin\\Instance\\V1";
+option ruby_package = "Google::Cloud::Spanner::Admin::Instance::V1";
 
 // Cloud Spanner Instance Admin API
 //
diff --git a/google/spanner/v1/BUILD.bazel b/google/spanner/v1/BUILD.bazel
index ad2819e47..568631fb9 100644
--- a/google/spanner/v1/BUILD.bazel
+++ b/google/spanner/v1/BUILD.bazel
@@ -266,7 +266,7 @@ load(
 nodejs_gapic_library(
     name = "spanner_nodejs_gapic",
     src = ":spanner_proto_with_info",
-    gapic_yaml = "spanner_gapic.yaml",
+    grpc_service_config = "spanner_grpc_service_config.json",
     package = "google.spanner.v1",
     service_yaml = "spanner.yaml",
     deps = [],
diff --git a/google/spanner/v1/keys.proto b/google/spanner/v1/keys.proto
index d129255c4..267df0d10 100644
--- a/google/spanner/v1/keys.proto
+++ b/google/spanner/v1/keys.proto
@@ -25,6 +25,7 @@ option java_multiple_files = true;
 option java_outer_classname = "KeysProto";
 option java_package = "com.google.spanner.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\V1";
+option ruby_package = "Google::Cloud::Spanner::V1";
 
 // KeyRange represents a range of rows in a table or index.
 //
diff --git a/google/spanner/v1/mutation.proto b/google/spanner/v1/mutation.proto
index 2c675830f..8ba51fc9a 100644
--- a/google/spanner/v1/mutation.proto
+++ b/google/spanner/v1/mutation.proto
@@ -26,6 +26,7 @@ option java_multiple_files = true;
 option java_outer_classname = "MutationProto";
 option java_package = "com.google.spanner.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\V1";
+option ruby_package = "Google::Cloud::Spanner::V1";
 
 // A modification to one or more Cloud Spanner rows.  Mutations can be
 // applied to a Cloud Spanner database by sending them in a
diff --git a/google/spanner/v1/query_plan.proto b/google/spanner/v1/query_plan.proto
index 6ad13a77b..974a70e6d 100644
--- a/google/spanner/v1/query_plan.proto
+++ b/google/spanner/v1/query_plan.proto
@@ -25,6 +25,7 @@ option java_multiple_files = true;
 option java_outer_classname = "QueryPlanProto";
 option java_package = "com.google.spanner.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\V1";
+option ruby_package = "Google::Cloud::Spanner::V1";
 
 // Node information for nodes appearing in a [QueryPlan.plan_nodes][google.spanner.v1.QueryPlan.plan_nodes].
 message PlanNode {
diff --git a/google/spanner/v1/result_set.proto b/google/spanner/v1/result_set.proto
index e24a35aaf..a87d741fd 100644
--- a/google/spanner/v1/result_set.proto
+++ b/google/spanner/v1/result_set.proto
@@ -29,6 +29,7 @@ option java_multiple_files = true;
 option java_outer_classname = "ResultSetProto";
 option java_package = "com.google.spanner.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\V1";
+option ruby_package = "Google::Cloud::Spanner::V1";
 
 // Results from [Read][google.spanner.v1.Spanner.Read] or
 // [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql].
diff --git a/google/spanner/v1/spanner.proto b/google/spanner/v1/spanner.proto
index 0c7da37c7..93e4987ed 100644
--- a/google/spanner/v1/spanner.proto
+++ b/google/spanner/v1/spanner.proto
@@ -36,6 +36,7 @@ option java_multiple_files = true;
 option java_outer_classname = "SpannerProto";
 option java_package = "com.google.spanner.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\V1";
+option ruby_package = "Google::Cloud::Spanner::V1";
 option (google.api.resource_definition) = {
   type: "spanner.googleapis.com/Database"
   pattern: "projects/{project}/instances/{instance}/databases/{database}"
diff --git a/google/spanner/v1/spanner_grpc_service_config.json b/google/spanner/v1/spanner_grpc_service_config.json
index 8602c9425..49ea75f81 100755
--- a/google/spanner/v1/spanner_grpc_service_config.json
+++ b/google/spanner/v1/spanner_grpc_service_config.json
@@ -18,6 +18,10 @@
         {
           "service": "google.spanner.v1.Spanner",
           "method": "Commit"
+        },
+        {
+          "service": "google.spanner.v1.Spanner",
+          "method": "ListSessions"
         }
       ],
       "timeout": "3600s",
@@ -32,21 +36,30 @@
     },
     {
       "name": [
-        {
-          "service": "google.spanner.v1.Spanner",
-          "method": "CreateSession"
-        },
         {
           "service": "google.spanner.v1.Spanner",
           "method": "BatchCreateSessions"
-        },
+        }
+      ],
+      "timeout": "60s",
+      "retryPolicy": {
+        "initialBackoff": "0.250s",
+        "maxBackoff": "32s",
+        "backoffMultiplier": 1.3,
+        "retryableStatusCodes": [
+          "UNAVAILABLE"
+        ]
+      }
+    },
+    {
+      "name": [
         {
           "service": "google.spanner.v1.Spanner",
-          "method": "GetSession"
+          "method": "CreateSession"
         },
         {
           "service": "google.spanner.v1.Spanner",
-          "method": "ListSessions"
+          "method": "GetSession"
         },
         {
           "service": "google.spanner.v1.Spanner",
diff --git a/google/spanner/v1/transaction.proto b/google/spanner/v1/transaction.proto
index 6a429f5d4..0bcbfcf90 100644
--- a/google/spanner/v1/transaction.proto
+++ b/google/spanner/v1/transaction.proto
@@ -26,6 +26,7 @@ option java_multiple_files = true;
 option java_outer_classname = "TransactionProto";
 option java_package = "com.google.spanner.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\V1";
+option ruby_package = "Google::Cloud::Spanner::V1";
 
 // # Transactions
 //
diff --git a/google/spanner/v1/type.proto b/google/spanner/v1/type.proto
index b749d5084..eebed5a49 100644
--- a/google/spanner/v1/type.proto
+++ b/google/spanner/v1/type.proto
@@ -24,6 +24,7 @@ option java_multiple_files = true;
 option java_outer_classname = "TypeProto";
 option java_package = "com.google.spanner.v1";
 option php_namespace = "Google\\Cloud\\Spanner\\V1";
+option ruby_package = "Google::Cloud::Spanner::V1";
 
 // `TypeCode` is used as part of [Type][google.spanner.v1.Type] to
 // indicate the type of a Cloud Spanner value.
diff --git a/google/storage/v1/BUILD.bazel b/google/storage/v1/BUILD.bazel
index a098c0e52..cd22b3b3c 100644
--- a/google/storage/v1/BUILD.bazel
+++ b/google/storage/v1/BUILD.bazel
@@ -267,7 +267,7 @@ load(
 nodejs_gapic_library(
     name = "storage_nodejs_gapic",
     src = ":storage_proto_with_info",
-    gapic_yaml = "storage_gapic.yaml",
+    grpc_service_config = "storage_service_config.json",
     package = "google.storage.v1",
     service_yaml = "storage_v1.yaml",
     deps = [],
diff --git a/google/streetview/publish/v1/BUILD.bazel b/google/streetview/publish/v1/BUILD.bazel
index 13abbcdcc..d4fb6e7dc 100644
--- a/google/streetview/publish/v1/BUILD.bazel
+++ b/google/streetview/publish/v1/BUILD.bazel
@@ -18,6 +18,7 @@ proto_library(
     ],
     deps = [
         "//google/api:annotations_proto",
+        "//google/api:client_proto",
         "//google/rpc:status_proto",
         "//google/type:latlng_proto",
         "@com_google_protobuf//:empty_proto",
@@ -113,35 +114,33 @@ go_proto_library(
     ],
 )
 
-#go_gapic_library(
-#    name = "publish_go_gapic",
-#    src = ":publish_proto_with_info",
-#    gapic_yaml = "//google/streetview/publish:streetview_publish_gapic.yaml",
-#    importpath = "google.golang.org/api/streetviewpublish/v1",
-#    package = "google.streetview.publish.v1",
-#    service_yaml = "//google/streetview/publish:streetview_publish.yaml",
-#    deps = [
-#        ":publish_go_proto",
-#    ],
-#)
-#
-#go_test(
-#    name = "publish_go_gapic_test",
-#    srcs = [":publish_go_gapic_srcjar_test"],
-#    embed = [":publish_go_gapic"],
-#    importpath = "google.golang.org/api/streetviewpublish/v1",
-#)
-#
+go_gapic_library(
+    name = "publish_go_gapic",
+    srcs = [":publish_proto_with_info"],
+    gapic_yaml = "//google/streetview/publish:streetview_publish_gapic.yaml",
+    importpath = "google.golang.org/api/streetviewpublish/apiv1;streetviewpublish",
+    service_yaml = "//google/streetview/publish:streetview_publish.yaml",
+    deps = [
+        ":publish_go_proto",
+    ],
+)
+
+go_test(
+    name = "publish_go_gapic_test",
+    srcs = [":publish_go_gapic_srcjar_test"],
+    embed = [":publish_go_gapic"],
+    importpath = "google.golang.org/api/streetviewpublish/apiv1",
+)
+
 ## Open Source Packages
-#go_gapic_assembly_pkg(
-#    name = "gapi-cloud-streetview-publish-v1-go",
-#    deps = [
-#        ":publish_go_gapic",
-#        ":publish_go_gapic_srcjar-smoke-test.srcjar",
-#        ":publish_go_gapic_srcjar-test.srcjar",
-#        ":publish_go_proto",
-#    ],
-#)
+go_gapic_assembly_pkg(
+    name = "gapi-cloud-streetview-publish-v1-go",
+    deps = [
+        ":publish_go_gapic",
+        ":publish_go_gapic_srcjar-test.srcjar",
+        ":publish_go_proto",
+    ],
+)
 
 ##############################################################################
 # Python
@@ -160,6 +159,7 @@ moved_proto_library(
     srcs = [":publish_proto"],
     deps = [
         "//google/api:annotations_proto",
+        "//google/api:client_proto",
         "//google/rpc:status_proto",
         "//google/type:latlng_proto",
         "@com_google_protobuf//:empty_proto",
diff --git a/google/streetview/publish/v1/streetview_publish.proto b/google/streetview/publish/v1/streetview_publish.proto
index 0ea2112be..2aff8f800 100644
--- a/google/streetview/publish/v1/streetview_publish.proto
+++ b/google/streetview/publish/v1/streetview_publish.proto
@@ -17,6 +17,7 @@ syntax = "proto3";
 package google.streetview.publish.v1;
 
 import "google/api/annotations.proto";
+import "google/api/client.proto";
 import "google/protobuf/empty.proto";
 import "google/streetview/publish/v1/resources.proto";
 import "google/streetview/publish/v1/rpcmessages.proto";
@@ -29,6 +30,9 @@ option java_package = "com.google.geo.ugc.streetview.publish.v1";
 
 // Publishes and connects user-contributed photos on Street View.
 service StreetViewPublishService {
+  option (google.api.default_host) = "streetviewpublish.googleapis.com";
+  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/streetviewpublish";
+
   // Creates an upload session to start uploading photo bytes. The method uses
   // the upload URL of the returned
   // [UploadRef][google.streetview.publish.v1.UploadRef] to upload the bytes for
diff --git a/grafeas/v1/BUILD.bazel b/grafeas/v1/BUILD.bazel
index 125d8adc8..f8997ed77 100644
--- a/grafeas/v1/BUILD.bazel
+++ b/grafeas/v1/BUILD.bazel
@@ -268,7 +268,7 @@ load(
 nodejs_gapic_library(
     name = "grafeas_nodejs_gapic",
     src = ":grafeas_proto_with_info",
-    gapic_yaml = "grafeas_gapic.yaml",
+    grpc_service_config = "grafeas_grpc_service_config.json",
     package = "grafeas.v1",
     service_yaml = "//grafeas:grafeas_v1.yaml",
     deps = [],
diff --git a/repository_rules.bzl b/repository_rules.bzl
index 32d461e24..7bbcb8879 100644
--- a/repository_rules.bzl
+++ b/repository_rules.bzl
@@ -243,11 +243,13 @@ def switched_rules_by_language(
     #
     rules["nodejs_gapic_library"] = _switch(
         nodejs and grpc and gapic,
-        "@com_google_api_codegen//rules_gapic/nodejs:nodejs_gapic.bzl",
+        "@gapic_generator_typescript//rules_typescript_gapic:typescript_gapic.bzl",
+        "typescript_gapic_library",
     )
     rules["nodejs_gapic_assembly_pkg"] = _switch(
         nodejs and grpc and gapic,
-        "@com_google_api_codegen//rules_gapic/nodejs:nodejs_gapic_pkg.bzl",
+        "@gapic_generator_typescript//rules_typescript_gapic:typescript_gapic_pkg.bzl",
+        "typescript_gapic_assembly_pkg",
     )
 
     #