Repository: googleapis/java-storage
Pull request #3165 (2025-06-24 18:55:40)

test: update GrpcPlainRequestLoggingInterceptor to also log headers when x-retry-test-id is present
Update all `fmtProto` methods to use `fmtProto(MessageOrBuilder)` instead of `Message#toString`




Patch:
diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml
index b635365d..9f0cb118 100644
--- a/.github/workflows/hermetic_library_generation.yaml
+++ b/.github/workflows/hermetic_library_generation.yaml
@@ -43,7 +43,7 @@ jobs:
       with:
         fetch-depth: 0
         token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }}
-    - uses: googleapis/sdk-platform-java/.github/scripts@v2.59.2
+    - uses: googleapis/sdk-platform-java/.github/scripts@v2.60.0
       if: env.SHOULD_RUN == 'true'
       with:
         base_ref: ${{ github.base_ref }}
diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml
index 0cf8ad50..2eeb8f58 100644
--- a/.github/workflows/unmanaged_dependency_check.yaml
+++ b/.github/workflows/unmanaged_dependency_check.yaml
@@ -17,6 +17,6 @@ jobs:
           # repository
           .kokoro/build.sh
       - name: Unmanaged dependency check
-        uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.49.2
+        uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.50.0
         with:
           bom-path: google-cloud-storage-bom/pom.xml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 699c7152..f9cdcf7a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,18 @@
 # Changelog
 
+## [2.53.2](https://github.com/googleapis/java-storage/compare/v2.53.1...v2.53.2) (2025-06-25)
+
+
+### Bug Fixes
+
+* Fix Journaling BlobWriteSessionConfig to properly handle multiple consecutive retries ([#3166](https://github.com/googleapis/java-storage/issues/3166)) ([895bfbd](https://github.com/googleapis/java-storage/commit/895bfbda902a77d16a33fe5238349a6b3d397c10))
+
+
+### Dependencies
+
+* Update dependency com.google.cloud.opentelemetry:exporter-trace to v0.36.0 ([#3162](https://github.com/googleapis/java-storage/issues/3162)) ([41a1030](https://github.com/googleapis/java-storage/commit/41a1030a2e77036cf961a16d472068b07e624192))
+* Update sdk-platform-java dependencies ([#3164](https://github.com/googleapis/java-storage/issues/3164)) ([c22a131](https://github.com/googleapis/java-storage/commit/c22a1319d8e2d92beeb03abac6bf2af8d09d49ee))
+
 ## [2.53.1](https://github.com/googleapis/java-storage/compare/v2.53.0...v2.53.1) (2025-06-18)
 
 
diff --git a/README.md b/README.md
index 1f853d2f..bb02676d 100644
--- a/README.md
+++ b/README.md
@@ -46,12 +46,12 @@ If you are using Maven without the BOM, add this to your dependencies:
 <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage</artifactId>
-  <version>2.53.0</version>
+  <version>2.53.1</version>
 </dependency>
 <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-control</artifactId>
-  <version>2.53.0</version>
+  <version>2.53.1</version>
 </dependency>
 
 ```
@@ -66,13 +66,13 @@ implementation 'com.google.cloud:google-cloud-storage'
 If you are using Gradle without BOM, add this to your dependencies:
 
 ```Groovy
-implementation 'com.google.cloud:google-cloud-storage:2.53.1'
+implementation 'com.google.cloud:google-cloud-storage:2.53.2'
 ```
 
 If you are using SBT, add this to your dependencies:
 
 ```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.53.1"
+libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.53.2"
 ```
 
 ## Authentication
@@ -347,6 +347,13 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/
 | Set Public Access Prevention Inherited | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/SetPublicAccessPreventionInherited.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/SetPublicAccessPreventionInherited.java) |
 | Set Retention Policy | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/SetRetentionPolicy.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/SetRetentionPolicy.java) |
 | Set Soft Delete Policy | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/SetSoftDeletePolicy.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/SetSoftDeletePolicy.java) |
+| Anywhere Cache Create | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java) |
+| Anywhere Cache Disable | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java) |
+| Anywhere Cache Get | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java) |
+| Anywhere Cache List | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java) |
+| Anywhere Cache Pause | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java) |
+| Anywhere Cache Resume | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java) |
+| Anywhere Cache Update | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java) |
 | Create Folder | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/CreateFolder.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/CreateFolder.java) |
 | Create Hierarchical Namespace Bucket | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/CreateHierarchicalNamespaceBucket.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/CreateHierarchicalNamespaceBucket.java) |
 | Delete Folder | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolder.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolder.java) |
@@ -515,7 +522,7 @@ Java is a registered trademark of Oracle and/or its affiliates.
 [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-storage/java11.html
 [stability-image]: https://img.shields.io/badge/stability-stable-green
 [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-storage.svg
-[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.53.1
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.53.2
 [authentication]: https://github.com/googleapis/google-cloud-java#authentication
 [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes
 [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles
diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml
index 56eca8ee..b34ac48f 100644
--- a/gapic-google-cloud-storage-v2/pom.xml
+++ b/gapic-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>gapic-google-cloud-storage-v2</artifactId>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
   <name>gapic-google-cloud-storage-v2</name>
   <description>GRPC library for gapic-google-cloud-storage-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/generation_config.yaml b/generation_config.yaml
index 86fc804a..2e0613f7 100644
--- a/generation_config.yaml
+++ b/generation_config.yaml
@@ -1,5 +1,5 @@
 gapic_generator_version: 2.59.0
-googleapis_commitish: 3a45aa38968f4fe537cd3837c0e95af8c189b11b
+googleapis_commitish: d57057715ebe652819419146472b09c14729d054
 libraries_bom_version: 26.61.0
 libraries:
   - api_shortname: storage
diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml
index 5b5ae2a6..670aae79 100644
--- a/google-cloud-storage-bom/pom.xml
+++ b/google-cloud-storage-bom/pom.xml
@@ -19,12 +19,12 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-bom</artifactId>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   <packaging>pom</packaging>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>sdk-platform-java-config</artifactId>
-    <version>3.49.2</version>
+    <version>3.50.0</version>
     <relativePath/>
   </parent>
 
@@ -69,37 +69,37 @@
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>gapic-google-cloud-storage-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage-control</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-control-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-control-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
       </dependency>
     </dependencies>
   </dependencyManagement>
diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml
index ee1ee776..d82af174 100644
--- a/google-cloud-storage-control/pom.xml
+++ b/google-cloud-storage-control/pom.xml
@@ -5,13 +5,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-control</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
     <name>google-cloud-storage-control</name>
     <description>GRPC library for google-cloud-storage-control</description>
     <parent>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage-parent</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
     </parent>
 
     <dependencies>
@@ -47,11 +47,27 @@
             <groupId>com.google.api</groupId>
             <artifactId>gax</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.api</groupId>
+            <artifactId>gax</artifactId>
+            <scope>test</scope>
+            <classifier>testlib</classifier>
+        </dependency>
 
         <dependency>
             <groupId>com.google.api</groupId>
             <artifactId>gax-grpc</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.api</groupId>
+            <artifactId>gax-httpjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.api</groupId>
+            <artifactId>gax-httpjson</artifactId>
+            <scope>test</scope>
+            <classifier>testlib</classifier>
+        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
@@ -71,6 +87,11 @@
             <groupId>com.google.api.grpc</groupId>
             <artifactId>grpc-google-cloud-storage-control-v2</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.google.http-client</groupId>
+            <artifactId>google-http-client</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <profiles>
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java
index 46840a92..ac92b590 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java
@@ -18,7 +18,9 @@ package com.google.storage.control.v2;
 
 import com.google.api.core.ApiFuture;
 import com.google.api.core.ApiFutures;
+import com.google.api.core.BetaApi;
 import com.google.api.gax.core.BackgroundResource;
+import com.google.api.gax.httpjson.longrunning.OperationsClient;
 import com.google.api.gax.longrunning.OperationFuture;
 import com.google.api.gax.paging.AbstractFixedSizeCollection;
 import com.google.api.gax.paging.AbstractPage;
@@ -28,7 +30,6 @@ import com.google.api.gax.rpc.PageContext;
 import com.google.api.gax.rpc.UnaryCallable;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.google.longrunning.Operation;
-import com.google.longrunning.OperationsClient;
 import com.google.protobuf.Empty;
 import com.google.protobuf.FieldMask;
 import com.google.storage.control.v2.stub.StorageControlStub;
@@ -547,13 +548,28 @@ import javax.annotation.Generated;
  * StorageControlClient storageControlClient = StorageControlClient.create(storageControlSettings);
  * }</pre>
  *
+ * <p>To use REST (HTTP1.1/JSON) transport (instead of gRPC) for sending and receiving requests over
+ * the wire:
+ *
+ * <pre>{@code
+ * // This snippet has been automatically generated and should be regarded as a code template only.
+ * // It will require modifications to work:
+ * // - It may require correct/in-range values for request initialization.
+ * // - It may require specifying regional endpoints when creating the service client as shown in
+ * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+ * StorageControlSettings storageControlSettings =
+ *     StorageControlSettings.newHttpJsonBuilder().build();
+ * StorageControlClient storageControlClient = StorageControlClient.create(storageControlSettings);
+ * }</pre>
+ *
  * <p>Please refer to the GitHub repository's samples for more quickstart code snippets.
  */
 @Generated("by gapic-generator-java")
 public class StorageControlClient implements BackgroundResource {
   private final StorageControlSettings settings;
   private final StorageControlStub stub;
-  private final OperationsClient operationsClient;
+  private final OperationsClient httpJsonOperationsClient;
+  private final com.google.longrunning.OperationsClient operationsClient;
 
   /** Constructs an instance of StorageControlClient with default settings. */
   public static final StorageControlClient create() throws IOException {
@@ -585,13 +601,17 @@ public class StorageControlClient implements BackgroundResource {
   protected StorageControlClient(StorageControlSettings settings) throws IOException {
     this.settings = settings;
     this.stub = ((StorageControlStubSettings) settings.getStubSettings()).createStub();
-    this.operationsClient = OperationsClient.create(this.stub.getOperationsStub());
+    this.operationsClient =
+        com.google.longrunning.OperationsClient.create(this.stub.getOperationsStub());
+    this.httpJsonOperationsClient = OperationsClient.create(this.stub.getHttpJsonOperationsStub());
   }
 
   protected StorageControlClient(StorageControlStub stub) {
     this.settings = null;
     this.stub = stub;
-    this.operationsClient = OperationsClient.create(this.stub.getOperationsStub());
+    this.operationsClient =
+        com.google.longrunning.OperationsClient.create(this.stub.getOperationsStub());
+    this.httpJsonOperationsClient = OperationsClient.create(this.stub.getHttpJsonOperationsStub());
   }
 
   public final StorageControlSettings getSettings() {
@@ -606,10 +626,19 @@ public class StorageControlClient implements BackgroundResource {
    * Returns the OperationsClient that can be used to query the status of a long-running operation
    * returned by another API method call.
    */
-  public final OperationsClient getOperationsClient() {
+  public final com.google.longrunning.OperationsClient getOperationsClient() {
     return operationsClient;
   }
 
+  /**
+   * Returns the OperationsClient that can be used to query the status of a long-running operation
+   * returned by another API method call.
+   */
+  @BetaApi
+  public final OperationsClient getHttpJsonOperationsClient() {
+    return httpJsonOperationsClient;
+  }
+
   // AUTO-GENERATED DOCUMENTATION AND METHOD.
   /**
    * Creates a new folder. This operation is only applicable to a hierarchical namespace enabled
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java
index a7bee17d..286869bc 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java
@@ -21,9 +21,11 @@ import static com.google.storage.control.v2.StorageControlClient.ListFoldersPage
 import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse;
 
 import com.google.api.core.ApiFunction;
+import com.google.api.core.BetaApi;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.InstantiatingExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
+import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider;
 import com.google.api.gax.rpc.ApiClientHeaderProvider;
 import com.google.api.gax.rpc.ClientContext;
 import com.google.api.gax.rpc.ClientSettings;
@@ -297,11 +299,18 @@ public class StorageControlSettings extends ClientSettings<StorageControlSetting
     return StorageControlStubSettings.defaultCredentialsProviderBuilder();
   }
 
-  /** Returns a builder for the default ChannelProvider for this service. */
+  /** Returns a builder for the default gRPC ChannelProvider for this service. */
   public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() {
     return StorageControlStubSettings.defaultGrpcTransportProviderBuilder();
   }
 
+  /** Returns a builder for the default REST ChannelProvider for this service. */
+  @BetaApi
+  public static InstantiatingHttpJsonChannelProvider.Builder
+      defaultHttpJsonTransportProviderBuilder() {
+    return StorageControlStubSettings.defaultHttpJsonTransportProviderBuilder();
+  }
+
   public static TransportChannelProvider defaultTransportChannelProvider() {
     return StorageControlStubSettings.defaultTransportChannelProvider();
   }
@@ -310,11 +319,16 @@ public class StorageControlSettings extends ClientSettings<StorageControlSetting
     return StorageControlStubSettings.defaultApiClientHeaderProviderBuilder();
   }
 
-  /** Returns a new builder for this class. */
+  /** Returns a new gRPC builder for this class. */
   public static Builder newBuilder() {
     return Builder.createDefault();
   }
 
+  /** Returns a new REST builder for this class. */
+  public static Builder newHttpJsonBuilder() {
+    return Builder.createHttpJsonDefault();
+  }
+
   /** Returns a new builder for this class. */
   public static Builder newBuilder(ClientContext clientContext) {
     return new Builder(clientContext);
@@ -352,6 +366,10 @@ public class StorageControlSettings extends ClientSettings<StorageControlSetting
       return new Builder(StorageControlStubSettings.newBuilder());
     }
 
+    private static Builder createHttpJsonDefault() {
+      return new Builder(StorageControlStubSettings.newHttpJsonBuilder());
+    }
+
     public StorageControlStubSettings.Builder getStubSettingsBuilder() {
       return ((StorageControlStubSettings.Builder) getStubSettings());
     }
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java
new file mode 100644
index 00000000..dac9e065
--- /dev/null
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2025 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
+ *
+ *      https://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.
+ */
+
+package com.google.storage.control.v2.stub;
+
+import com.google.api.gax.httpjson.HttpJsonCallSettings;
+import com.google.api.gax.httpjson.HttpJsonCallableFactory;
+import com.google.api.gax.httpjson.HttpJsonOperationSnapshotCallable;
+import com.google.api.gax.httpjson.HttpJsonStubCallableFactory;
+import com.google.api.gax.httpjson.longrunning.stub.OperationsStub;
+import com.google.api.gax.rpc.BatchingCallSettings;
+import com.google.api.gax.rpc.ClientContext;
+import com.google.api.gax.rpc.OperationCallSettings;
+import com.google.api.gax.rpc.OperationCallable;
+import com.google.api.gax.rpc.PagedCallSettings;
+import com.google.api.gax.rpc.ServerStreamingCallSettings;
+import com.google.api.gax.rpc.ServerStreamingCallable;
+import com.google.api.gax.rpc.UnaryCallSettings;
+import com.google.api.gax.rpc.UnaryCallable;
+import com.google.longrunning.Operation;
+import javax.annotation.Generated;
+
+// AUTO-GENERATED DOCUMENTATION AND CLASS.
+/**
+ * REST callable factory implementation for the StorageControl service API.
+ *
+ * <p>This class is for advanced usage.
+ */
+@Generated("by gapic-generator-java")
+public class HttpJsonStorageControlCallableFactory
+    implements HttpJsonStubCallableFactory<Operation, OperationsStub> {
+
+  @Override
+  public <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUnaryCallable(
+      HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
+      UnaryCallSettings<RequestT, ResponseT> callSettings,
+      ClientContext clientContext) {
+    return HttpJsonCallableFactory.createUnaryCallable(
+        httpJsonCallSettings, callSettings, clientContext);
+  }
+
+  @Override
+  public <RequestT, ResponseT, PagedListResponseT>
+      UnaryCallable<RequestT, PagedListResponseT> createPagedCallable(
+          HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
+          PagedCallSettings<RequestT, ResponseT, PagedListResponseT> callSettings,
+          ClientContext clientContext) {
+    return HttpJsonCallableFactory.createPagedCallable(
+        httpJsonCallSettings, callSettings, clientContext);
+  }
+
+  @Override
+  public <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBatchingCallable(
+      HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
+      BatchingCallSettings<RequestT, ResponseT> callSettings,
+      ClientContext clientContext) {
+    return HttpJsonCallableFactory.createBatchingCallable(
+        httpJsonCallSettings, callSettings, clientContext);
+  }
+
+  @Override
+  public <RequestT, ResponseT, MetadataT>
+      OperationCallable<RequestT, ResponseT, MetadataT> createOperationCallable(
+          HttpJsonCallSettings<RequestT, Operation> httpJsonCallSettings,
+          OperationCallSettings<RequestT, ResponseT, MetadataT> callSettings,
+          ClientContext clientContext,
+          OperationsStub operationsStub) {
+    UnaryCallable<RequestT, Operation> innerCallable =
+        HttpJsonCallableFactory.createBaseUnaryCallable(
+            httpJsonCallSettings, callSettings.getInitialCallSettings(), clientContext);
+    HttpJsonOperationSnapshotCallable<RequestT, Operation> initialCallable =
+        new HttpJsonOperationSnapshotCallable<RequestT, Operation>(
+            innerCallable,
+            httpJsonCallSettings.getMethodDescriptor().getOperationSnapshotFactory());
+    return HttpJsonCallableFactory.createOperationCallable(
+        callSettings, clientContext, operationsStub.longRunningClient(), initialCallable);
+  }
+
+  @Override
+  public <RequestT, ResponseT>
+      ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
+          HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
+          ServerStreamingCallSettings<RequestT, ResponseT> callSettings,
+          ClientContext clientContext) {
+    return HttpJsonCallableFactory.createServerStreamingCallable(
+        httpJsonCallSettings, callSettings, clientContext);
+  }
+}
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java
new file mode 100644
index 00000000..9aed10cf
--- /dev/null
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java
@@ -0,0 +1,727 @@
+/*
+ * Copyright 2025 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
+ *
+ *      https://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.
+ */
+
+package com.google.storage.control.v2.stub;
+
+import com.google.api.core.InternalApi;
+import com.google.api.gax.core.BackgroundResource;
+import com.google.api.gax.core.BackgroundResourceAggregation;
+import com.google.api.gax.httpjson.ApiMethodDescriptor;
+import com.google.api.gax.httpjson.HttpJsonCallSettings;
+import com.google.api.gax.httpjson.HttpJsonStubCallableFactory;
+import com.google.api.gax.httpjson.ProtoMessageRequestFormatter;
+import com.google.api.gax.httpjson.ProtoMessageResponseParser;
+import com.google.api.gax.httpjson.ProtoRestSerializer;
+import com.google.api.gax.httpjson.longrunning.stub.HttpJsonOperationsStub;
+import com.google.api.gax.rpc.ClientContext;
+import com.google.api.gax.rpc.RequestParamsBuilder;
+import com.google.api.gax.rpc.UnaryCallable;
+import com.google.longrunning.Operation;
+import com.google.protobuf.Empty;
+import com.google.protobuf.TypeRegistry;
+import com.google.storage.control.v2.AnywhereCache;
+import com.google.storage.control.v2.CreateAnywhereCacheMetadata;
+import com.google.storage.control.v2.CreateAnywhereCacheRequest;
+import com.google.storage.control.v2.CreateFolderRequest;
+import com.google.storage.control.v2.CreateManagedFolderRequest;
+import com.google.storage.control.v2.DeleteFolderRequest;
+import com.google.storage.control.v2.DeleteManagedFolderRequest;
+import com.google.storage.control.v2.DisableAnywhereCacheRequest;
+import com.google.storage.control.v2.Folder;
+import com.google.storage.control.v2.GetAnywhereCacheRequest;
+import com.google.storage.control.v2.GetFolderIntelligenceConfigRequest;
+import com.google.storage.control.v2.GetFolderRequest;
+import com.google.storage.control.v2.GetManagedFolderRequest;
+import com.google.storage.control.v2.GetOrganizationIntelligenceConfigRequest;
+import com.google.storage.control.v2.GetProjectIntelligenceConfigRequest;
+import com.google.storage.control.v2.GetStorageLayoutRequest;
+import com.google.storage.control.v2.IntelligenceConfig;
+import com.google.storage.control.v2.ListAnywhereCachesRequest;
+import com.google.storage.control.v2.ListAnywhereCachesResponse;
+import com.google.storage.control.v2.ListFoldersRequest;
+import com.google.storage.control.v2.ListFoldersResponse;
+import com.google.storage.control.v2.ListManagedFoldersRequest;
+import com.google.storage.control.v2.ListManagedFoldersResponse;
+import com.google.storage.control.v2.ManagedFolder;
+import com.google.storage.control.v2.PauseAnywhereCacheRequest;
+import com.google.storage.control.v2.RenameFolderMetadata;
+import com.google.storage.control.v2.RenameFolderRequest;
+import com.google.storage.control.v2.ResumeAnywhereCacheRequest;
+import com.google.storage.control.v2.StorageLayout;
+import com.google.storage.control.v2.UpdateAnywhereCacheMetadata;
+import com.google.storage.control.v2.UpdateAnywhereCacheRequest;
+import com.google.storage.control.v2.UpdateFolderIntelligenceConfigRequest;
+import com.google.storage.control.v2.UpdateOrganizationIntelligenceConfigRequest;
+import com.google.storage.control.v2.UpdateProjectIntelligenceConfigRequest;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.Generated;
+
+// AUTO-GENERATED DOCUMENTATION AND CLASS.
+/**
+ * REST stub implementation for the StorageControl service API.
+ *
+ * <p>This class is for advanced usage and reflects the underlying API directly.
+ */
+@Generated("by gapic-generator-java")
+public class HttpJsonStorageControlStub extends StorageControlStub {
+  private static final TypeRegistry typeRegistry =
+      TypeRegistry.newBuilder()
+          .add(RenameFolderMetadata.getDescriptor())
+          .add(Folder.getDescriptor())
+          .add(AnywhereCache.getDescriptor())
+          .add(UpdateAnywhereCacheMetadata.getDescriptor())
+          .add(CreateAnywhereCacheMetadata.getDescriptor())
+          .build();
+
+  private static final ApiMethodDescriptor<GetProjectIntelligenceConfigRequest, IntelligenceConfig>
+      getProjectIntelligenceConfigMethodDescriptor =
+          ApiMethodDescriptor.<GetProjectIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+              .setFullMethodName(
+                  "google.storage.control.v2.StorageControl/GetProjectIntelligenceConfig")
+              .setHttpMethod("GET")
+              .setType(ApiMethodDescriptor.MethodType.UNARY)
+              .setRequestFormatter(
+                  ProtoMessageRequestFormatter.<GetProjectIntelligenceConfigRequest>newBuilder()
+                      .setPath(
+                          "/v2/{name=projects/*/locations/*/intelligenceConfig}",
+                          request -> {
+                            Map<String, String> fields = new HashMap<>();
+                            ProtoRestSerializer<GetProjectIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putPathParam(fields, "name", request.getName());
+                            return fields;
+                          })
+                      .setQueryParamsExtractor(
+                          request -> {
+                            Map<String, List<String>> fields = new HashMap<>();
+                            ProtoRestSerializer<GetProjectIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+                            return fields;
+                          })
+                      .setRequestBodyExtractor(request -> null)
+                      .build())
+              .setResponseParser(
+                  ProtoMessageResponseParser.<IntelligenceConfig>newBuilder()
+                      .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+                      .setDefaultTypeRegistry(typeRegistry)
+                      .build())
+              .build();
+
+  private static final ApiMethodDescriptor<
+          UpdateProjectIntelligenceConfigRequest, IntelligenceConfig>
+      updateProjectIntelligenceConfigMethodDescriptor =
+          ApiMethodDescriptor
+              .<UpdateProjectIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+              .setFullMethodName(
+                  "google.storage.control.v2.StorageControl/UpdateProjectIntelligenceConfig")
+              .setHttpMethod("PATCH")
+              .setType(ApiMethodDescriptor.MethodType.UNARY)
+              .setRequestFormatter(
+                  ProtoMessageRequestFormatter.<UpdateProjectIntelligenceConfigRequest>newBuilder()
+                      .setPath(
+                          "/v2/{intelligenceConfig.name=projects/*/locations/*/intelligenceConfig}",
+                          request -> {
+                            Map<String, String> fields = new HashMap<>();
+                            ProtoRestSerializer<UpdateProjectIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putPathParam(
+                                fields,
+                                "intelligenceConfig.name",
+                                request.getIntelligenceConfig().getName());
+                            return fields;
+                          })
+                      .setQueryParamsExtractor(
+                          request -> {
+                            Map<String, List<String>> fields = new HashMap<>();
+                            ProtoRestSerializer<UpdateProjectIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putQueryParam(fields, "requestId", request.getRequestId());
+                            serializer.putQueryParam(fields, "updateMask", request.getUpdateMask());
+                            serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+                            return fields;
+                          })
+                      .setRequestBodyExtractor(
+                          request ->
+                              ProtoRestSerializer.create()
+                                  .toBody(
+                                      "intelligenceConfig", request.getIntelligenceConfig(), true))
+                      .build())
+              .setResponseParser(
+                  ProtoMessageResponseParser.<IntelligenceConfig>newBuilder()
+                      .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+                      .setDefaultTypeRegistry(typeRegistry)
+                      .build())
+              .build();
+
+  private static final ApiMethodDescriptor<GetFolderIntelligenceConfigRequest, IntelligenceConfig>
+      getFolderIntelligenceConfigMethodDescriptor =
+          ApiMethodDescriptor.<GetFolderIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+              .setFullMethodName(
+                  "google.storage.control.v2.StorageControl/GetFolderIntelligenceConfig")
+              .setHttpMethod("GET")
+              .setType(ApiMethodDescriptor.MethodType.UNARY)
+              .setRequestFormatter(
+                  ProtoMessageRequestFormatter.<GetFolderIntelligenceConfigRequest>newBuilder()
+                      .setPath(
+                          "/v2/{name=folders/*/locations/*/intelligenceConfig}",
+                          request -> {
+                            Map<String, String> fields = new HashMap<>();
+                            ProtoRestSerializer<GetFolderIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putPathParam(fields, "name", request.getName());
+                            return fields;
+                          })
+                      .setQueryParamsExtractor(
+                          request -> {
+                            Map<String, List<String>> fields = new HashMap<>();
+                            ProtoRestSerializer<GetFolderIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+                            return fields;
+                          })
+                      .setRequestBodyExtractor(request -> null)
+                      .build())
+              .setResponseParser(
+                  ProtoMessageResponseParser.<IntelligenceConfig>newBuilder()
+                      .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+                      .setDefaultTypeRegistry(typeRegistry)
+                      .build())
+              .build();
+
+  private static final ApiMethodDescriptor<
+          UpdateFolderIntelligenceConfigRequest, IntelligenceConfig>
+      updateFolderIntelligenceConfigMethodDescriptor =
+          ApiMethodDescriptor
+              .<UpdateFolderIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+              .setFullMethodName(
+                  "google.storage.control.v2.StorageControl/UpdateFolderIntelligenceConfig")
+              .setHttpMethod("PATCH")
+              .setType(ApiMethodDescriptor.MethodType.UNARY)
+              .setRequestFormatter(
+                  ProtoMessageRequestFormatter.<UpdateFolderIntelligenceConfigRequest>newBuilder()
+                      .setPath(
+                          "/v2/{intelligenceConfig.name=folders/*/locations/*/intelligenceConfig}",
+                          request -> {
+                            Map<String, String> fields = new HashMap<>();
+                            ProtoRestSerializer<UpdateFolderIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putPathParam(
+                                fields,
+                                "intelligenceConfig.name",
+                                request.getIntelligenceConfig().getName());
+                            return fields;
+                          })
+                      .setQueryParamsExtractor(
+                          request -> {
+                            Map<String, List<String>> fields = new HashMap<>();
+                            ProtoRestSerializer<UpdateFolderIntelligenceConfigRequest> serializer =
+                                ProtoRestSerializer.create();
+                            serializer.putQueryParam(fields, "requestId", request.getRequestId());
+                            serializer.putQueryParam(fields, "updateMask", request.getUpdateMask());
+                            serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+                            return fields;
+                          })
+                      .setRequestBodyExtractor(
+                          request ->
+                              ProtoRestSerializer.create()
+                                  .toBody(
+                                      "intelligenceConfig", request.getIntelligenceConfig(), true))
+                      .build())
+              .setResponseParser(
+                  ProtoMessageResponseParser.<IntelligenceConfig>newBuilder()
+                      .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+                      .setDefaultTypeRegistry(typeRegistry)
+                      .build())
+              .build();
+
+  private static final ApiMethodDescriptor<
+          GetOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+      getOrganizationIntelligenceConfigMethodDescriptor =
+          ApiMethodDescriptor
+              .<GetOrganizationIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+              .setFullMethodName(
+                  "google.storage.control.v2.StorageControl/GetOrganizationIntelligenceConfig")
+              .setHttpMethod("GET")
+              .setType(ApiMethodDescriptor.MethodType.UNARY)
+              .setRequestFormatter(
+                  ProtoMessageRequestFormatter
+                      .<GetOrganizationIntelligenceConfigRequest>newBuilder()
+                      .setPath(
+                          "/v2/{name=organizations/*/locations/*/intelligenceConfig}",
+                          request -> {
+                            Map<String, String> fields = new HashMap<>();
+                            ProtoRestSerializer<GetOrganizationIntelligenceConfigRequest>
+                                serializer = ProtoRestSerializer.create();
+                            serializer.putPathParam(fields, "name", request.getName());
+                            return fields;
+                          })
+                      .setQueryParamsExtractor(
+                          request -> {
+                            Map<String, List<String>> fields = new HashMap<>();
+                            ProtoRestSerializer<GetOrganizationIntelligenceConfigRequest>
+                                serializer = ProtoRestSerializer.create();
+                            serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+                            return fields;
+                          })
+                      .setRequestBodyExtractor(request -> null)
+                      .build())
+              .setResponseParser(
+                  ProtoMessageResponseParser.<IntelligenceConfig>newBuilder()
+                      .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+                      .setDefaultTypeRegistry(typeRegistry)
+                      .build())
+              .build();
+
+  private static final ApiMethodDescriptor<
+          UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+      updateOrganizationIntelligenceConfigMethodDescriptor =
+          ApiMethodDescriptor
+              .<UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+              .setFullMethodName(
+                  "google.storage.control.v2.StorageControl/UpdateOrganizationIntelligenceConfig")
+              .setHttpMethod("PATCH")
+              .setType(ApiMethodDescriptor.MethodType.UNARY)
+              .setRequestFormatter(
+                  ProtoMessageRequestFormatter
+                      .<UpdateOrganizationIntelligenceConfigRequest>newBuilder()
+                      .setPath(
+                          "/v2/{intelligenceConfig.name=organizations/*/locations/*/intelligenceConfig}",
+                          request -> {
+                            Map<String, String> fields = new HashMap<>();
+                            ProtoRestSerializer<UpdateOrganizationIntelligenceConfigRequest>
+                                serializer = ProtoRestSerializer.create();
+                            serializer.putPathParam(
+                                fields,
+                                "intelligenceConfig.name",
+                                request.getIntelligenceConfig().getName());
+                            return fields;
+                          })
+                      .setQueryParamsExtractor(
+                          request -> {
+                            Map<String, List<String>> fields = new HashMap<>();
+                            ProtoRestSerializer<UpdateOrganizationIntelligenceConfigRequest>
+                                serializer = ProtoRestSerializer.create();
+                            serializer.putQueryParam(fields, "requestId", request.getRequestId());
+                            serializer.putQueryParam(fields, "updateMask", request.getUpdateMask());
+                            serializer.putQueryParam(fields, "$alt", "json;enum-encoding=int");
+                            return fields;
+                          })
+                      .setRequestBodyExtractor(
+                          request ->
+                              ProtoRestSerializer.create()
+                                  .toBody(
+                                      "intelligenceConfig", request.getIntelligenceConfig(), true))
+                      .build())
+              .setResponseParser(
+                  ProtoMessageResponseParser.<IntelligenceConfig>newBuilder()
+                      .setDefaultInstance(IntelligenceConfig.getDefaultInstance())
+                      .setDefaultTypeRegistry(typeRegistry)
+                      .build())
+              .build();
+
+  private final UnaryCallable<GetProjectIntelligenceConfigRequest, IntelligenceConfig>
+      getProjectIntelligenceConfigCallable;
+  private final UnaryCallable<UpdateProjectIntelligenceConfigRequest, IntelligenceConfig>
+      updateProjectIntelligenceConfigCallable;
+  private final UnaryCallable<GetFolderIntelligenceConfigRequest, IntelligenceConfig>
+      getFolderIntelligenceConfigCallable;
+  private final UnaryCallable<UpdateFolderIntelligenceConfigRequest, IntelligenceConfig>
+      updateFolderIntelligenceConfigCallable;
+  private final UnaryCallable<GetOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+      getOrganizationIntelligenceConfigCallable;
+  private final UnaryCallable<UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+      updateOrganizationIntelligenceConfigCallable;
+
+  private final BackgroundResource backgroundResources;
+  private final HttpJsonOperationsStub httpJsonOperationsStub;
+  private final HttpJsonStubCallableFactory callableFactory;
+
+  public static final HttpJsonStorageControlStub create(StorageControlStubSettings settings)
+      throws IOException {
+    return new HttpJsonStorageControlStub(settings, ClientContext.create(settings));
+  }
+
+  public static final HttpJsonStorageControlStub create(ClientContext clientContext)
+      throws IOException {
+    return new HttpJsonStorageControlStub(
+        StorageControlStubSettings.newHttpJsonBuilder().build(), clientContext);
+  }
+
+  public static final HttpJsonStorageControlStub create(
+      ClientContext clientContext, HttpJsonStubCallableFactory callableFactory) throws IOException {
+    return new HttpJsonStorageControlStub(
+        StorageControlStubSettings.newHttpJsonBuilder().build(), clientContext, callableFactory);
+  }
+
+  /**
+   * Constructs an instance of HttpJsonStorageControlStub, using the given settings. This is
+   * protected so that it is easy to make a subclass, but otherwise, the static factory methods
+   * should be preferred.
+   */
+  protected HttpJsonStorageControlStub(
+      StorageControlStubSettings settings, ClientContext clientContext) throws IOException {
+    this(settings, clientContext, new HttpJsonStorageControlCallableFactory());
+  }
+
+  /**
+   * Constructs an instance of HttpJsonStorageControlStub, using the given settings. This is
+   * protected so that it is easy to make a subclass, but otherwise, the static factory methods
+   * should be preferred.
+   */
+  protected HttpJsonStorageControlStub(
+      StorageControlStubSettings settings,
+      ClientContext clientContext,
+      HttpJsonStubCallableFactory callableFactory)
+      throws IOException {
+    this.callableFactory = callableFactory;
+    this.httpJsonOperationsStub =
+        HttpJsonOperationsStub.create(clientContext, callableFactory, typeRegistry);
+
+    HttpJsonCallSettings<GetProjectIntelligenceConfigRequest, IntelligenceConfig>
+        getProjectIntelligenceConfigTransportSettings =
+            HttpJsonCallSettings
+                .<GetProjectIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+                .setMethodDescriptor(getProjectIntelligenceConfigMethodDescriptor)
+                .setTypeRegistry(typeRegistry)
+                .setParamsExtractor(
+                    request -> {
+                      RequestParamsBuilder builder = RequestParamsBuilder.create();
+                      builder.add("name", String.valueOf(request.getName()));
+                      return builder.build();
+                    })
+                .build();
+    HttpJsonCallSettings<UpdateProjectIntelligenceConfigRequest, IntelligenceConfig>
+        updateProjectIntelligenceConfigTransportSettings =
+            HttpJsonCallSettings
+                .<UpdateProjectIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+                .setMethodDescriptor(updateProjectIntelligenceConfigMethodDescriptor)
+                .setTypeRegistry(typeRegistry)
+                .setParamsExtractor(
+                    request -> {
+                      RequestParamsBuilder builder = RequestParamsBuilder.create();
+                      builder.add(
+                          "intelligence_config.name",
+                          String.valueOf(request.getIntelligenceConfig().getName()));
+                      return builder.build();
+                    })
+                .build();
+    HttpJsonCallSettings<GetFolderIntelligenceConfigRequest, IntelligenceConfig>
+        getFolderIntelligenceConfigTransportSettings =
+            HttpJsonCallSettings
+                .<GetFolderIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+                .setMethodDescriptor(getFolderIntelligenceConfigMethodDescriptor)
+                .setTypeRegistry(typeRegistry)
+                .setParamsExtractor(
+                    request -> {
+                      RequestParamsBuilder builder = RequestParamsBuilder.create();
+                      builder.add("name", String.valueOf(request.getName()));
+                      return builder.build();
+                    })
+                .build();
+    HttpJsonCallSettings<UpdateFolderIntelligenceConfigRequest, IntelligenceConfig>
+        updateFolderIntelligenceConfigTransportSettings =
+            HttpJsonCallSettings
+                .<UpdateFolderIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+                .setMethodDescriptor(updateFolderIntelligenceConfigMethodDescriptor)
+                .setTypeRegistry(typeRegistry)
+                .setParamsExtractor(
+                    request -> {
+                      RequestParamsBuilder builder = RequestParamsBuilder.create();
+                      builder.add(
+                          "intelligence_config.name",
+                          String.valueOf(request.getIntelligenceConfig().getName()));
+                      return builder.build();
+                    })
+                .build();
+    HttpJsonCallSettings<GetOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+        getOrganizationIntelligenceConfigTransportSettings =
+            HttpJsonCallSettings
+                .<GetOrganizationIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+                .setMethodDescriptor(getOrganizationIntelligenceConfigMethodDescriptor)
+                .setTypeRegistry(typeRegistry)
+                .setParamsExtractor(
+                    request -> {
+                      RequestParamsBuilder builder = RequestParamsBuilder.create();
+                      builder.add("name", String.valueOf(request.getName()));
+                      return builder.build();
+                    })
+                .build();
+    HttpJsonCallSettings<UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+        updateOrganizationIntelligenceConfigTransportSettings =
+            HttpJsonCallSettings
+                .<UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig>newBuilder()
+                .setMethodDescriptor(updateOrganizationIntelligenceConfigMethodDescriptor)
+                .setTypeRegistry(typeRegistry)
+                .setParamsExtractor(
+                    request -> {
+                      RequestParamsBuilder builder = RequestParamsBuilder.create();
+                      builder.add(
+                          "intelligence_config.name",
+                          String.valueOf(request.getIntelligenceConfig().getName()));
+                      return builder.build();
+                    })
+                .build();
+
+    this.getProjectIntelligenceConfigCallable =
+        callableFactory.createUnaryCallable(
+            getProjectIntelligenceConfigTransportSettings,
+            settings.getProjectIntelligenceConfigSettings(),
+            clientContext);
+    this.updateProjectIntelligenceConfigCallable =
+        callableFactory.createUnaryCallable(
+            updateProjectIntelligenceConfigTransportSettings,
+            settings.updateProjectIntelligenceConfigSettings(),
+            clientContext);
+    this.getFolderIntelligenceConfigCallable =
+        callableFactory.createUnaryCallable(
+            getFolderIntelligenceConfigTransportSettings,
+            settings.getFolderIntelligenceConfigSettings(),
+            clientContext);
+    this.updateFolderIntelligenceConfigCallable =
+        callableFactory.createUnaryCallable(
+            updateFolderIntelligenceConfigTransportSettings,
+            settings.updateFolderIntelligenceConfigSettings(),
+            clientContext);
+    this.getOrganizationIntelligenceConfigCallable =
+        callableFactory.createUnaryCallable(
+            getOrganizationIntelligenceConfigTransportSettings,
+            settings.getOrganizationIntelligenceConfigSettings(),
+            clientContext);
+    this.updateOrganizationIntelligenceConfigCallable =
+        callableFactory.createUnaryCallable(
+            updateOrganizationIntelligenceConfigTransportSettings,
+            settings.updateOrganizationIntelligenceConfigSettings(),
+            clientContext);
+
+    this.backgroundResources =
+        new BackgroundResourceAggregation(clientContext.getBackgroundResources());
+  }
+
+  @InternalApi
+  public static List<ApiMethodDescriptor> getMethodDescriptors() {
+    List<ApiMethodDescriptor> methodDescriptors = new ArrayList<>();
+    methodDescriptors.add(getProjectIntelligenceConfigMethodDescriptor);
+    methodDescriptors.add(updateProjectIntelligenceConfigMethodDescriptor);
+    methodDescriptors.add(getFolderIntelligenceConfigMethodDescriptor);
+    methodDescriptors.add(updateFolderIntelligenceConfigMethodDescriptor);
+    methodDescriptors.add(getOrganizationIntelligenceConfigMethodDescriptor);
+    methodDescriptors.add(updateOrganizationIntelligenceConfigMethodDescriptor);
+    return methodDescriptors;
+  }
+
+  public HttpJsonOperationsStub getHttpJsonOperationsStub() {
+    return httpJsonOperationsStub;
+  }
+
+  @Override
+  public UnaryCallable<GetProjectIntelligenceConfigRequest, IntelligenceConfig>
+      getProjectIntelligenceConfigCallable() {
+    return getProjectIntelligenceConfigCallable;
+  }
+
+  @Override
+  public UnaryCallable<UpdateProjectIntelligenceConfigRequest, IntelligenceConfig>
+      updateProjectIntelligenceConfigCallable() {
+    return updateProjectIntelligenceConfigCallable;
+  }
+
+  @Override
+  public UnaryCallable<GetFolderIntelligenceConfigRequest, IntelligenceConfig>
+      getFolderIntelligenceConfigCallable() {
+    return getFolderIntelligenceConfigCallable;
+  }
+
+  @Override
+  public UnaryCallable<UpdateFolderIntelligenceConfigRequest, IntelligenceConfig>
+      updateFolderIntelligenceConfigCallable() {
+    return updateFolderIntelligenceConfigCallable;
+  }
+
+  @Override
+  public UnaryCallable<GetOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+      getOrganizationIntelligenceConfigCallable() {
+    return getOrganizationIntelligenceConfigCallable;
+  }
+
+  @Override
+  public UnaryCallable<UpdateOrganizationIntelligenceConfigRequest, IntelligenceConfig>
+      updateOrganizationIntelligenceConfigCallable() {
+    return updateOrganizationIntelligenceConfigCallable;
+  }
+
+  @Override
+  public UnaryCallable<CreateFolderRequest, Folder> createFolderCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: createFolderCallable(). REST transport is not implemented for this method"
+            + " yet.");
+  }
+
+  @Override
+  public UnaryCallable<DeleteFolderRequest, Empty> deleteFolderCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: deleteFolderCallable(). REST transport is not implemented for this method"
+            + " yet.");
+  }
+
+  @Override
+  public UnaryCallable<GetFolderRequest, Folder> getFolderCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: getFolderCallable(). REST transport is not implemented for this method"
+            + " yet.");
+  }
+
+  @Override
+  public UnaryCallable<ListFoldersRequest, ListFoldersResponse> listFoldersCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: listFoldersCallable(). REST transport is not implemented for this method"
+            + " yet.");
+  }
+
+  @Override
+  public UnaryCallable<RenameFolderRequest, Operation> renameFolderCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: renameFolderCallable(). REST transport is not implemented for this method"
+            + " yet.");
+  }
+
+  @Override
+  public UnaryCallable<GetStorageLayoutRequest, StorageLayout> getStorageLayoutCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: getStorageLayoutCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<CreateManagedFolderRequest, ManagedFolder> createManagedFolderCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: createManagedFolderCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<DeleteManagedFolderRequest, Empty> deleteManagedFolderCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: deleteManagedFolderCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<GetManagedFolderRequest, ManagedFolder> getManagedFolderCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: getManagedFolderCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<ListManagedFoldersRequest, ListManagedFoldersResponse>
+      listManagedFoldersCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: listManagedFoldersCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<CreateAnywhereCacheRequest, Operation> createAnywhereCacheCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: createAnywhereCacheCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<UpdateAnywhereCacheRequest, Operation> updateAnywhereCacheCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: updateAnywhereCacheCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<DisableAnywhereCacheRequest, AnywhereCache> disableAnywhereCacheCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: disableAnywhereCacheCallable(). REST transport is not implemented for"
+            + " this method yet.");
+  }
+
+  @Override
+  public UnaryCallable<PauseAnywhereCacheRequest, AnywhereCache> pauseAnywhereCacheCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: pauseAnywhereCacheCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<ResumeAnywhereCacheRequest, AnywhereCache> resumeAnywhereCacheCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: resumeAnywhereCacheCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<GetAnywhereCacheRequest, AnywhereCache> getAnywhereCacheCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: getAnywhereCacheCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public UnaryCallable<ListAnywhereCachesRequest, ListAnywhereCachesResponse>
+      listAnywhereCachesCallable() {
+    throw new UnsupportedOperationException(
+        "Not implemented: listAnywhereCachesCallable(). REST transport is not implemented for this"
+            + " method yet.");
+  }
+
+  @Override
+  public final void close() {
+    try {
+      backgroundResources.close();
+    } catch (RuntimeException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new IllegalStateException("Failed to close resource", e);
+    }
+  }
+
+  @Override
+  public void shutdown() {
+    backgroundResources.shutdown();
+  }
+
+  @Override
+  public boolean isShutdown() {
+    return backgroundResources.isShutdown();
+  }
+
+  @Override
+  public boolean isTerminated() {
+    return backgroundResources.isTerminated();
+  }
+
+  @Override
+  public void shutdownNow() {
+    backgroundResources.shutdownNow();
+  }
+
+  @Override
+  public boolean awaitTermination(long duration, TimeUnit unit) throws InterruptedException {
+    return backgroundResources.awaitTermination(duration, unit);
+  }
+}
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java
index 30efedc1..5bab8877 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java
@@ -72,7 +72,11 @@ import javax.annotation.Generated;
 public abstract class StorageControlStub implements BackgroundResource {
 
   public OperationsStub getOperationsStub() {
-    throw new UnsupportedOperationException("Not implemented: getOperationsStub()");
+    return null;
+  }
+
+  public com.google.api.gax.httpjson.longrunning.stub.OperationsStub getHttpJsonOperationsStub() {
+    return null;
   }
 
   public UnaryCallable<CreateFolderRequest, Folder> createFolderCallable() {
diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
index 629353b7..d0191ad4 100644
--- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
+++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java
@@ -22,6 +22,7 @@ import static com.google.storage.control.v2.StorageControlClient.ListManagedFold
 
 import com.google.api.core.ApiFunction;
 import com.google.api.core.ApiFuture;
+import com.google.api.core.BetaApi;
 import com.google.api.core.ObsoleteApi;
 import com.google.api.gax.core.GaxProperties;
 import com.google.api.gax.core.GoogleCredentialsProvider;
@@ -30,6 +31,9 @@ import com.google.api.gax.grpc.GaxGrpcProperties;
 import com.google.api.gax.grpc.GrpcTransportChannel;
 import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
 import com.google.api.gax.grpc.ProtoOperationTransformers;
+import com.google.api.gax.httpjson.GaxHttpJsonProperties;
+import com.google.api.gax.httpjson.HttpJsonTransportChannel;
+import com.google.api.gax.httpjson.InstantiatingHttpJsonChannelProvider;
 import com.google.api.gax.longrunning.OperationSnapshot;
 import com.google.api.gax.longrunning.OperationTimedPollAlgorithm;
 import com.google.api.gax.retrying.RetrySettings;
@@ -554,6 +558,11 @@ public class StorageControlStubSettings extends StubSettings<StorageControlStubS
         .equals(GrpcTransportChannel.getGrpcTransportName())) {
       return GrpcStorageControlStub.create(this);
     }
+    if (getTransportChannelProvider()
+        .getTransportName()
+        .equals(HttpJsonTransportChannel.getHttpJsonTransportName())) {
+      return HttpJsonStorageControlStub.create(this);
+    }
     throw new UnsupportedOperationException(
         String.format(
             "Transport not supported: %s", getTransportChannelProvider().getTransportName()));
@@ -593,17 +602,24 @@ public class StorageControlStubSettings extends StubSettings<StorageControlStubS
         .setUseJwtAccessWithScope(true);
   }
 
-  /** Returns a builder for the default ChannelProvider for this service. */
+  /** Returns a builder for the default gRPC ChannelProvider for this service. */
   public static InstantiatingGrpcChannelProvider.Builder defaultGrpcTransportProviderBuilder() {
     return InstantiatingGrpcChannelProvider.newBuilder()
         .setMaxInboundMessageSize(Integer.MAX_VALUE);
   }
 
+  /** Returns a builder for the default REST ChannelProvider for this service. */
+  @BetaApi
+  public static InstantiatingHttpJsonChannelProvider.Builder
+      defaultHttpJsonTransportProviderBuilder() {
+    return InstantiatingHttpJsonChannelProvider.newBuilder();
+  }
+
   public static TransportChannelProvider defaultTransportChannelProvider() {
     return defaultGrpcTransportProviderBuilder().build();
   }
 
-  public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() {
+  public static ApiClientHeaderProvider.Builder defaultGrpcApiClientHeaderProviderBuilder() {
     return ApiClientHeaderProvider.newBuilder()
         .setGeneratedLibToken(
             "gapic", GaxProperties.getLibraryVersion(StorageControlStubSettings.class))
@@ -611,11 +627,29 @@ public class StorageControlStubSettings extends StubSettings<StorageControlStubS
             GaxGrpcProperties.getGrpcTokenName(), GaxGrpcProperties.getGrpcVersion());
   }
 
-  /** Returns a new builder for this class. */
+  public static ApiClientHeaderProvider.Builder defaultHttpJsonApiClientHeaderProviderBuilder() {
+    return ApiClientHeaderProvider.newBuilder()
+        .setGeneratedLibToken(
+            "gapic", GaxProperties.getLibraryVersion(StorageControlStubSettings.class))
+        .setTransportToken(
+            GaxHttpJsonProperties.getHttpJsonTokenName(),
+            GaxHttpJsonProperties.getHttpJsonVersion());
+  }
+
+  public static ApiClientHeaderProvider.Builder defaultApiClientHeaderProviderBuilder() {
+    return StorageControlStubSettings.defaultGrpcApiClientHeaderProviderBuilder();
+  }
+
+  /** Returns a new gRPC builder for this class. */
   public static Builder newBuilder() {
     return Builder.createDefault();
   }
 
+  /** Returns a new REST builder for this class. */
+  public static Builder newHttpJsonBuilder() {
+    return Builder.createHttpJsonDefault();
+  }
+
   /** Returns a new builder for this class. */
   public static Builder newBuilder(ClientContext clientContext) {
     return new Builder(clientContext);
@@ -912,6 +946,18 @@ public class StorageControlStubSettings extends StubSettings<StorageControlStubS
       return initDefaults(builder);
     }
 
+    private static Builder createHttpJsonDefault() {
+      Builder builder = new Builder(((ClientContext) null));
+
+      builder.setTransportChannelProvider(defaultHttpJsonTransportProviderBuilder().build());
+      builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
+      builder.setInternalHeaderProvider(defaultHttpJsonApiClientHeaderProviderBuilder().build());
+      builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
+      builder.setSwitchToMtlsEndpointAllowed(true);
+
+      return initDefaults(builder);
+    }
+
     private static Builder initDefaults(Builder builder) {
       builder
           .createFolderSettings()
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 211a1993..5575ffbf 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>google-cloud-storage</artifactId>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   <packaging>jar</packaging>
   <name>Google Cloud Storage</name>
   <url>https://github.com/googleapis/java-storage</url>
@@ -12,11 +12,11 @@
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <properties>
     <site.installationModule>google-cloud-storage</site.installationModule>
-    <pubsub-proto.version>1.122.1</pubsub-proto.version>
+    <pubsub-proto.version>1.122.2</pubsub-proto.version>
   </properties>
   <dependencies>
     <dependency>
@@ -239,14 +239,14 @@
     <dependency>
       <groupId>com.google.api.grpc</groupId>
       <artifactId>proto-google-cloud-kms-v1</artifactId>
-      <version>0.158.0</version>
+      <version>0.161.0</version>
       <scope>test</scope>
     </dependency>
 
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-kms</artifactId>
-      <version>2.67.0</version>
+      <version>2.70.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -331,7 +331,7 @@
     <dependency>
       <groupId>io.github.classgraph</groupId>
       <artifactId>classgraph</artifactId>
-      <version>4.8.179</version>
+      <version>4.8.180</version>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java
index 1a3882da..9f91d3b8 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cUtility.java
@@ -19,288 +19,70 @@ package com.google.cloud.storage;
 class Crc32cUtility {
   private Crc32cUtility() {}
 
+  // Castagnoli polynomial and its degree.
+  private static final long CASTAGNOLI_POLY = 4812730177L;
+  private static final int DEGREE = 32;
+
+  // Table storing values of x^(2^k) mod CASTANOLI_POLY for all k < 31. This is sufficient since
+  // x^(2^31) = x.
+  private static final long[] X_POW_2K_TABLE = {
+    2L, 4L, 16L, 256L, 65536L, 517762881L, 984302966L,
+    408362264L, 1503875210L, 2862076957L, 3884826397L, 1324787473L, 621200174L, 1758783527L,
+    1416537776L, 1180494764L, 648569364L, 2521473789L, 994858823L, 1728245375L, 3498467999L,
+    4059169852L, 3345064394L, 2828422810L, 2429203150L, 3336788029L, 860151998L, 2102628683L,
+    1033187991L, 4243778976L, 1123580069L
+  };
+
+  // Multiplies two polynomials together modulo CASTAGNOLI_POLY.
+  private static int multiply(int p, int q) {
+    long q64 = q;
+    int result = 0;
+    long topBit = (1L << DEGREE);
+    for (int i = 0; i < DEGREE; i++) {
+      if ((p & 1) != 0) {
+        result ^= (int) q64;
+      }
+      q64 <<= 1; // Multiply by x.
+
+      // If multiplying by x gave q64 a non-zero 32nd coefficient, it no longer encodes the desired
+      // representative of that polynomial modulo CASTAGNOLI_POLY, so we subtract the generator.
+      if ((q64 & topBit) != 0) {
+        q64 ^= CASTAGNOLI_POLY;
+      }
+      p >>= 1;
+    }
+    return result;
+  }
+
+  // Given crc representing polynomial P(x), compute P(x)*x^numBits.
+  private static int extendByZeros(int crc, long numBits) {
+    // Begin by reversing the bits to most-significant coefficient first for comprehensibility.
+    crc = Integer.reverse(crc);
+    int i = 0;
+    // Iterate over the binary representation of numBits, multiplying by x^(2^k) for numBits_k = 1.
+    while (numBits != 0) {
+      if ((numBits & 1) != 0) {
+        crc = multiply(crc, (int) X_POW_2K_TABLE[i % X_POW_2K_TABLE.length]);
+      }
+      i += 1;
+      numBits >>= 1;
+    }
+    crc = Integer.reverse(crc); // Return to the standard bit-order.
+    return crc;
+  }
+
   /**
-   * Straight forward implementation to combine two crc32c values
+   * Efficiently computes CRC32C for concat(A, B) given crc(A), crc(B) and len(B).
    *
-   * <p>There is a more efficient implementation in https://github.com/google/crc32c, however for
-   * brevity we are following the byte by byte computation, implemented in:
-   * https://github.com/google/crc32c/blob/main/src/crc32c_portable.cc#L252-L257
-   *
-   * @param crc1 crc32c int of an object to combine crc2 with
-   * @param crc2 crc32c int of the second object
-   * @param crc2ObjectSize byte length of object which generated crc2
-   * @return
-   * @see <a target="_blank"
-   *     href="https://github.com/google/crc32c/blob/21fc8ef30415a635e7351ffa0e5d5367943d4a94/src/crc32c_portable.cc#L252-L257">https://github.com/google/crc32c/blob/21fc8ef30415a635e7351ffa0e5d5367943d4a94/src/crc32c_portable.cc#L252-L257</a>
+   * @param crcA A 32-bit integer representing crc(A) with least-significant coefficient first.
+   * @param crcB Same as crcA for B.
+   * @param numBytesInB Length of B in bytes.
+   * @return CRC32C for concat(A, B) PiperOrigin-RevId: 158626905
    */
-  public static int crc32cCombineGoogle(int crc1, int crc2, long crc2ObjectSize) {
-    int l = crc1;
-    // run number of 0's based on size
-    for (long i = 0; i < crc2ObjectSize; i++) {
-      l = (l >>> 8) ^ kByteExtensionTable[l & 0xff];
+  public static int concatCrc32c(int crcA, int crcB, long numBytesInB) {
+    if (numBytesInB == 0) {
+      return crcA;
     }
-    return l ^ crc2;
+    return extendByZeros(crcA, 8 * numBytesInB) ^ crcB;
   }
-
-  // Ported from:
-  // https://github.com/google/crc32c/blob/21fc8ef30415a635e7351ffa0e5d5367943d4a94/src/crc32c_portable.cc#L16-L59
-  private static final int[] kByteExtensionTable =
-      new int[] {
-        0x00000000,
-        0xf26b8303,
-        0xe13b70f7,
-        0x1350f3f4,
-        0xc79a971f,
-        0x35f1141c,
-        0x26a1e7e8,
-        0xd4ca64eb,
-        0x8ad958cf,
-        0x78b2dbcc,
-        0x6be22838,
-        0x9989ab3b,
-        0x4d43cfd0,
-        0xbf284cd3,
-        0xac78bf27,
-        0x5e133c24,
-        0x105ec76f,
-        0xe235446c,
-        0xf165b798,
-        0x030e349b,
-        0xd7c45070,
-        0x25afd373,
-        0x36ff2087,
-        0xc494a384,
-        0x9a879fa0,
-        0x68ec1ca3,
-        0x7bbcef57,
-        0x89d76c54,
-        0x5d1d08bf,
-        0xaf768bbc,
-        0xbc267848,
-        0x4e4dfb4b,
-        0x20bd8ede,
-        0xd2d60ddd,
-        0xc186fe29,
-        0x33ed7d2a,
-        0xe72719c1,
-        0x154c9ac2,
-        0x061c6936,
-        0xf477ea35,
-        0xaa64d611,
-        0x580f5512,
-        0x4b5fa6e6,
-        0xb93425e5,
-        0x6dfe410e,
-        0x9f95c20d,
-        0x8cc531f9,
-        0x7eaeb2fa,
-        0x30e349b1,
-        0xc288cab2,
-        0xd1d83946,
-        0x23b3ba45,
-        0xf779deae,
-        0x05125dad,
-        0x1642ae59,
-        0xe4292d5a,
-        0xba3a117e,
-        0x4851927d,
-        0x5b016189,
-        0xa96ae28a,
-        0x7da08661,
-        0x8fcb0562,
-        0x9c9bf696,
-        0x6ef07595,
-        0x417b1dbc,
-        0xb3109ebf,
-        0xa0406d4b,
-        0x522bee48,
-        0x86e18aa3,
-        0x748a09a0,
-        0x67dafa54,
-        0x95b17957,
-        0xcba24573,
-        0x39c9c670,
-        0x2a993584,
-        0xd8f2b687,
-        0x0c38d26c,
-        0xfe53516f,
-        0xed03a29b,
-        0x1f682198,
-        0x5125dad3,
-        0xa34e59d0,
-        0xb01eaa24,
-        0x42752927,
-        0x96bf4dcc,
-        0x64d4cecf,
-        0x77843d3b,
-        0x85efbe38,
-        0xdbfc821c,
-        0x2997011f,
-        0x3ac7f2eb,
-        0xc8ac71e8,
-        0x1c661503,
-        0xee0d9600,
-        0xfd5d65f4,
-        0x0f36e6f7,
-        0x61c69362,
-        0x93ad1061,
-        0x80fde395,
-        0x72966096,
-        0xa65c047d,
-        0x5437877e,
-        0x4767748a,
-        0xb50cf789,
-        0xeb1fcbad,
-        0x197448ae,
-        0x0a24bb5a,
-        0xf84f3859,
-        0x2c855cb2,
-        0xdeeedfb1,
-        0xcdbe2c45,
-        0x3fd5af46,
-        0x7198540d,
-        0x83f3d70e,
-        0x90a324fa,
-        0x62c8a7f9,
-        0xb602c312,
-        0x44694011,
-        0x5739b3e5,
-        0xa55230e6,
-        0xfb410cc2,
-        0x092a8fc1,
-        0x1a7a7c35,
-        0xe811ff36,
-        0x3cdb9bdd,
-        0xceb018de,
-        0xdde0eb2a,
-        0x2f8b6829,
-        0x82f63b78,
-        0x709db87b,
-        0x63cd4b8f,
-        0x91a6c88c,
-        0x456cac67,
-        0xb7072f64,
-        0xa457dc90,
-        0x563c5f93,
-        0x082f63b7,
-        0xfa44e0b4,
-        0xe9141340,
-        0x1b7f9043,
-        0xcfb5f4a8,
-        0x3dde77ab,
-        0x2e8e845f,
-        0xdce5075c,
-        0x92a8fc17,
-        0x60c37f14,
-        0x73938ce0,
-        0x81f80fe3,
-        0x55326b08,
-        0xa759e80b,
-        0xb4091bff,
-        0x466298fc,
-        0x1871a4d8,
-        0xea1a27db,
-        0xf94ad42f,
-        0x0b21572c,
-        0xdfeb33c7,
-        0x2d80b0c4,
-        0x3ed04330,
-        0xccbbc033,
-        0xa24bb5a6,
-        0x502036a5,
-        0x4370c551,
-        0xb11b4652,
-        0x65d122b9,
-        0x97baa1ba,
-        0x84ea524e,
-        0x7681d14d,
-        0x2892ed69,
-        0xdaf96e6a,
-        0xc9a99d9e,
-        0x3bc21e9d,
-        0xef087a76,
-        0x1d63f975,
-        0x0e330a81,
-        0xfc588982,
-        0xb21572c9,
-        0x407ef1ca,
-        0x532e023e,
-        0xa145813d,
-        0x758fe5d6,
-        0x87e466d5,
-        0x94b49521,
-        0x66df1622,
-        0x38cc2a06,
-        0xcaa7a905,
-        0xd9f75af1,
-        0x2b9cd9f2,
-        0xff56bd19,
-        0x0d3d3e1a,
-        0x1e6dcdee,
-        0xec064eed,
-        0xc38d26c4,
-        0x31e6a5c7,
-        0x22b65633,
-        0xd0ddd530,
-        0x0417b1db,
-        0xf67c32d8,
-        0xe52cc12c,
-        0x1747422f,
-        0x49547e0b,
-        0xbb3ffd08,
-        0xa86f0efc,
-        0x5a048dff,
-        0x8ecee914,
-        0x7ca56a17,
-        0x6ff599e3,
-        0x9d9e1ae0,
-        0xd3d3e1ab,
-        0x21b862a8,
-        0x32e8915c,
-        0xc083125f,
-        0x144976b4,
-        0xe622f5b7,
-        0xf5720643,
-        0x07198540,
-        0x590ab964,
-        0xab613a67,
-        0xb831c993,
-        0x4a5a4a90,
-        0x9e902e7b,
-        0x6cfbad78,
-        0x7fab5e8c,
-        0x8dc0dd8f,
-        0xe330a81a,
-        0x115b2b19,
-        0x020bd8ed,
-        0xf0605bee,
-        0x24aa3f05,
-        0xd6c1bc06,
-        0xc5914ff2,
-        0x37faccf1,
-        0x69e9f0d5,
-        0x9b8273d6,
-        0x88d28022,
-        0x7ab90321,
-        0xae7367ca,
-        0x5c18e4c9,
-        0x4f48173d,
-        0xbd23943e,
-        0xf36e6f75,
-        0x0105ec76,
-        0x12551f82,
-        0xe03e9c81,
-        0x34f4f86a,
-        0xc69f7b69,
-        0xd5cf889d,
-        0x27a40b9e,
-        0x79b737ba,
-        0x8bdcb4b9,
-        0x988c474d,
-        0x6ae7c44e,
-        0xbe2da0a5,
-        0x4c4623a6,
-        0x5f16d052,
-        0xad7d5351
-      };
 }
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java
index 8e1bea02..245999dd 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Crc32cValue.java
@@ -81,7 +81,7 @@ abstract class Crc32cValue<Res extends Crc32cValue<Res>> {
 
     @Override
     public Crc32cLengthUnknown concat(Crc32cLengthKnown other) {
-      int combined = Crc32cUtility.crc32cCombineGoogle(value, other.value, other.length);
+      int combined = Crc32cUtility.concatCrc32c(value, other.value, other.length);
       return new Crc32cLengthUnknown(combined);
     }
 
@@ -137,7 +137,7 @@ abstract class Crc32cValue<Res extends Crc32cValue<Res>> {
 
     @Override
     public Crc32cLengthKnown concat(Crc32cLengthKnown other) {
-      int combined = Crc32cUtility.crc32cCombineGoogle(value, other.value, other.length);
+      int combined = Crc32cUtility.concatCrc32c(value, other.value, other.length);
       return new Crc32cLengthKnown(combined, length + other.length);
     }
 
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java
index c07e51f5..7c9451f8 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/SyncAndUploadUnbufferedWritableByteChannel.java
@@ -149,7 +149,7 @@ final class SyncAndUploadUnbufferedWritableByteChannel implements UnbufferedWrit
     return sync;
   }
 
-  private WriteObjectRequest processSegment(ChunkSegment segment) {
+  private WriteObjectRequest processSegment(ChunkSegment segment, boolean updateCumulativeCrc32c) {
     WriteObjectRequest.Builder builder = writeCtx.newRequestBuilder();
     if (!first) {
       builder.clearUploadId().clearWriteObjectSpec().clearObjectChecksums();
@@ -162,9 +162,11 @@ final class SyncAndUploadUnbufferedWritableByteChannel implements UnbufferedWrit
     int contentSize = b.size();
 
     // update ctx state that tracks overall progress
-    writeCtx
-        .getCumulativeCrc32c()
-        .accumulateAndGet(crc32c, chunkSegmenter.getHasher()::nullSafeConcat);
+    if (updateCumulativeCrc32c) {
+      writeCtx
+          .getCumulativeCrc32c()
+          .accumulateAndGet(crc32c, chunkSegmenter.getHasher()::nullSafeConcat);
+    }
     // resolve current offset and set next
     long offset = writeCtx.getTotalSentBytes().getAndAdd(contentSize);
 
@@ -202,6 +204,7 @@ final class SyncAndUploadUnbufferedWritableByteChannel implements UnbufferedWrit
     return b;
   }
 
+  @SuppressWarnings("ConstantValue")
   private void doUpload(boolean closing, ChunkSegment[] segments, long goalSize) {
     AtomicBoolean recover = new AtomicBoolean(false);
     retrier.run(
@@ -211,9 +214,16 @@ final class SyncAndUploadUnbufferedWritableByteChannel implements UnbufferedWrit
             sync.close();
           }
           boolean shouldRecover = recover.getAndSet(true);
+          // each ChunkSegment will always have its checksum computed, but if a retry happens, and
+          // we need to rewind and build a new ChunkSegment, we don't want to add it to the
+          // cumulativeCrc32c value because that will make it appear as the bytes are duplicated.
+          // If we send "ABCD", get an error and find only "AB" to have been persisted, we don't
+          // want to add "CD" to the cumulative crc32c as that would be equivalent to "ABCDCD".
+          boolean updateCumulativeCrc32c = !shouldRecover;
           if (!shouldRecover) {
             for (ChunkSegment segment : segments) {
-              WriteObjectRequest writeObjectRequest = processSegment(segment);
+              WriteObjectRequest writeObjectRequest =
+                  processSegment(segment, updateCumulativeCrc32c);
               stream.onNext(writeObjectRequest);
             }
 
@@ -247,17 +257,22 @@ final class SyncAndUploadUnbufferedWritableByteChannel implements UnbufferedWrit
                 first = true;
                 writeCtx.getTotalSentBytes().set(persistedSize);
                 writeCtx.getConfirmedBytes().set(persistedSize);
-                writeCtx.getCumulativeCrc32c().set(null); // todo: can we rewind checksum?
+                // intentionally do not modify the cumulativeCrc32c value
+                // this will stay in the state in sync with what has been written to disk
+                // when we recover, checksum the individual message but not the cumulative
 
                 try (SeekableByteChannel reader = rf.reader()) {
                   reader.position(persistedSize);
                   ByteBuffer buf = copyBuffer.get();
+                  // clear before read, in case an error was thrown before
+                  buf.clear();
                   while (Buffers.fillFrom(buf, reader) != -1) {
                     buf.flip();
                     while (buf.hasRemaining()) {
                       ChunkSegment[] recoverySegments = chunkSegmenter.segmentBuffer(buf);
                       for (ChunkSegment segment : recoverySegments) {
-                        WriteObjectRequest writeObjectRequest = processSegment(segment);
+                        WriteObjectRequest writeObjectRequest =
+                            processSegment(segment, updateCumulativeCrc32c);
                         stream.onNext(writeObjectRequest);
                       }
                     }
@@ -280,7 +295,8 @@ final class SyncAndUploadUnbufferedWritableByteChannel implements UnbufferedWrit
             }
           }
           long newWritten = writeCtx.getTotalSentBytes().get();
-          Preconditions.checkState(newWritten == goalSize, "%s == %s", newWritten, goalSize);
+          Preconditions.checkState(
+              newWritten == goalSize, "newWritten == goalSize (%s == %s)", newWritten, goalSize);
           return null;
         },
         Decoder.identity());
diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml
index 088cf1b6..5c7209f4 100644
--- a/grpc-google-cloud-storage-control-v2/pom.xml
+++ b/grpc-google-cloud-storage-control-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>grpc-google-cloud-storage-control-v2</artifactId>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
   <name>grpc-google-cloud-storage-control-v2</name>
   <description>GRPC library for google-cloud-storage</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml
index ba47c074..f3591e5c 100644
--- a/grpc-google-cloud-storage-v2/pom.xml
+++ b/grpc-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>grpc-google-cloud-storage-v2</artifactId>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
   <name>grpc-google-cloud-storage-v2</name>
   <description>GRPC library for grpc-google-cloud-storage-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/pom.xml b/pom.xml
index 8549918e..62c871a6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-parent</artifactId>
   <packaging>pom</packaging>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   <name>Storage Parent</name>
   <url>https://github.com/googleapis/java-storage</url>
   <description>
@@ -14,7 +14,7 @@
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>sdk-platform-java-config</artifactId>
-    <version>3.49.2</version>
+    <version>3.50.0</version>
   </parent>
 
   <developers>
@@ -82,7 +82,7 @@
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.apis</groupId>
@@ -92,7 +92,7 @@
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-pubsub</artifactId>
-        <version>1.140.1</version>
+        <version>1.140.2</version>
         <scope>test</scope>
       </dependency>
       <dependency>
@@ -104,32 +104,32 @@
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>gapic-google-cloud-storage-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-control-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-control-v2</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage-control</artifactId>
-        <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+        <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.cloud</groupId>
diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml
index f6ad8308..a1222464 100644
--- a/proto-google-cloud-storage-control-v2/pom.xml
+++ b/proto-google-cloud-storage-control-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>proto-google-cloud-storage-control-v2</artifactId>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
   <name>proto-google-cloud-storage-control-v2</name>
   <description>Proto library for  proto-google-cloud-storage-control-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml
index 62bb3bf5..55705b7c 100644
--- a/proto-google-cloud-storage-v2/pom.xml
+++ b/proto-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>proto-google-cloud-storage-v2</artifactId>
-  <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
+  <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
   <name>proto-google-cloud-storage-v2</name>
   <description>PROTO library for proto-google-cloud-storage-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/renovate.json b/renovate.json
index 6ee6e25a..2ae8e233 100644
--- a/renovate.json
+++ b/renovate.json
@@ -20,16 +20,6 @@
       "matchStrings": ["uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v(?<currentValue>.+?)\\n"],
       "depNameTemplate": "com.google.cloud:sdk-platform-java-config",
       "datasourceTemplate": "maven"
-    },
-    {
-      "fileMatch": [
-        ".github/workflows/hermetic_library_generation.yaml"
-      ],
-      "matchStrings": [
-        "uses: googleapis/sdk-platform-java/.github/scripts@v(?<currentValue>.+?)\\n"
-      ],
-      "depNameTemplate": "com.google.api:gapic-generator-java",
-      "datasourceTemplate": "maven"
     }
   ],
   "packageRules": [
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index e503e155..c3812264 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -30,12 +30,12 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.53.1</version>
+      <version>2.53.2</version>
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage-control</artifactId>
-      <version>2.53.1</version>
+      <version>2.53.2</version>
     </dependency>
     <!-- [END storage_install_without_bom] -->
 
@@ -66,19 +66,19 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-pubsub</artifactId>
-      <version>1.140.1</version>
+      <version>1.140.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-kms</artifactId>
-      <version>2.67.0</version>
+      <version>2.70.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.53.1</version>
+      <version>2.53.2</version>
       <classifier>tests</classifier>
       <scope>test</scope>
     </dependency>
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 3c06dad2..66e26f27 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,12 +28,12 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+      <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage-control</artifactId>
-      <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+      <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
       <scope>compile</scope>
     </dependency>
 
@@ -58,19 +58,19 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-pubsub</artifactId>
-      <version>1.140.1</version>
+      <version>1.140.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-kms</artifactId>
-      <version>2.67.0</version>
+      <version>2.70.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+      <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
       <classifier>tests</classifier>
       <scope>test</scope>
     </dependency>
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 8053937d..c8949ac6 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -76,13 +76,13 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-pubsub</artifactId>
-      <version>1.140.1</version>
+      <version>1.140.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-kms</artifactId>
-      <version>2.67.0</version>
+      <version>2.70.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -99,7 +99,7 @@
       <!-- tests jars aren't in the bom, manually include the version here -->
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.53.1</version>
+      <version>2.53.2</version>
       <classifier>tests</classifier>
       <scope>test</scope>
     </dependency>
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java
index d9736906..496b4e38 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheCreate.java
@@ -32,14 +32,13 @@ public final class AnywhereCacheCreate {
       throws InterruptedException, ExecutionException, IOException {
     try (StorageControlClient storageControl = StorageControlClient.create()) {
 
-      CreateAnywhereCacheRequest request = CreateAnywhereCacheRequest.newBuilder()
-          // Set project to "_" to signify globally scoped bucket
-          .setParent(BucketName.format("_", bucketName))
-          .setAnywhereCache(AnywhereCache.newBuilder()
-              .setName(cacheName)
-              .setZone(zoneName)
-              .build())
-          .build();
+      CreateAnywhereCacheRequest request =
+          CreateAnywhereCacheRequest.newBuilder()
+              // Set project to "_" to signify globally scoped bucket
+              .setParent(BucketName.format("_", bucketName))
+              .setAnywhereCache(
+                  AnywhereCache.newBuilder().setName(cacheName).setZone(zoneName).build())
+              .build();
 
       // Start a long-running operation (LRO).
       OperationFuture<AnywhereCache, CreateAnywhereCacheMetadata> operation =
@@ -50,6 +49,5 @@ public final class AnywhereCacheCreate {
       System.out.printf("Created anywhere cache: %s%n", anywhereCache.getName());
     }
   }
-
 }
 // [END storage_control_create_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java
index c334268a..272efc91 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheDisable.java
@@ -28,15 +28,13 @@ public final class AnywhereCacheDisable {
   public static void anywhereCacheDisable(String cacheName) throws IOException {
     try (StorageControlClient storageControl = StorageControlClient.create()) {
 
-      DisableAnywhereCacheRequest request = DisableAnywhereCacheRequest.newBuilder()
-          .setName(cacheName)
-          .build();
+      DisableAnywhereCacheRequest request =
+          DisableAnywhereCacheRequest.newBuilder().setName(cacheName).build();
 
       AnywhereCache anywhereCache = storageControl.disableAnywhereCache(request);
 
       System.out.printf("Disabled anywhere cache: %s%n", anywhereCache.getName());
     }
   }
-
 }
 // [END storage_control_disable_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java
index 978d5667..917dd3f2 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheGet.java
@@ -28,15 +28,13 @@ public final class AnywhereCacheGet {
   public static void anywhereCacheGet(String cacheName) throws IOException {
     try (StorageControlClient storageControl = StorageControlClient.create()) {
 
-      GetAnywhereCacheRequest request = GetAnywhereCacheRequest.newBuilder()
-          .setName(cacheName)
-          .build();
+      GetAnywhereCacheRequest request =
+          GetAnywhereCacheRequest.newBuilder().setName(cacheName).build();
 
       AnywhereCache anywhereCache = storageControl.getAnywhereCache(request);
 
       System.out.printf("Got anywhere cache: %s%n", anywhereCache.getName());
     }
   }
-
 }
 // [END storage_control_get_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java
index 95285f26..70c0f127 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheList.java
@@ -30,9 +30,10 @@ public final class AnywhereCacheList {
   public static void anywhereCacheList(String bucketName) throws IOException {
     try (StorageControlClient storageControl = StorageControlClient.create()) {
 
-      ListAnywhereCachesRequest request = ListAnywhereCachesRequest.newBuilder()
-          .setParent(BucketName.format("_", bucketName))
-          .build();
+      ListAnywhereCachesRequest request =
+          ListAnywhereCachesRequest.newBuilder()
+              .setParent(BucketName.format("_", bucketName))
+              .build();
 
       ListAnywhereCachesPagedResponse page = storageControl.listAnywhereCaches(request);
       for (AnywhereCache anywhereCache : page.iterateAll()) {
@@ -40,6 +41,5 @@ public final class AnywhereCacheList {
       }
     }
   }
-
 }
 // [END storage_control_list_anywhere_caches]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java
index 6cea5575..bf4a20d7 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCachePause.java
@@ -28,15 +28,13 @@ public final class AnywhereCachePause {
   public static void anywhereCachePause(String cacheName) throws IOException {
     try (StorageControlClient storageControl = StorageControlClient.create()) {
 
-      PauseAnywhereCacheRequest request = PauseAnywhereCacheRequest.newBuilder()
-          .setName(cacheName)
-          .build();
+      PauseAnywhereCacheRequest request =
+          PauseAnywhereCacheRequest.newBuilder().setName(cacheName).build();
 
       AnywhereCache anywhereCache = storageControl.pauseAnywhereCache(request);
 
       System.out.printf("Paused anywhere cache: %s%n", anywhereCache.getName());
     }
   }
-
 }
 // [END storage_control_pause_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java
index 3a246746..db02a6f3 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheResume.java
@@ -28,15 +28,13 @@ public final class AnywhereCacheResume {
   public static void anywhereCacheResume(String cacheName) throws IOException {
     try (StorageControlClient storageControl = StorageControlClient.create()) {
 
-      ResumeAnywhereCacheRequest request = ResumeAnywhereCacheRequest.newBuilder()
-          .setName(cacheName)
-          .build();
+      ResumeAnywhereCacheRequest request =
+          ResumeAnywhereCacheRequest.newBuilder().setName(cacheName).build();
 
       AnywhereCache anywhereCache = storageControl.resumeAnywhereCache(request);
 
       System.out.printf("Resumed anywhere cache: %s%n", anywhereCache.getName());
     }
   }
-
 }
 // [END storage_control_resume_anywhere_cache]
diff --git a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java
index 5cb666f2..558d66db 100644
--- a/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java
+++ b/samples/snippets/src/main/java/com/example/storage/control/v2/AnywhereCacheUpdate.java
@@ -33,19 +33,14 @@ public final class AnywhereCacheUpdate {
       throws InterruptedException, ExecutionException, IOException {
     try (StorageControlClient storageControl = StorageControlClient.create()) {
 
-      AnywhereCache pendingUpdate = AnywhereCache.newBuilder()
-          .setName(cacheName)
-          .setAdmissionPolicy(admissionPolicy)
-          .build();
-
-      UpdateAnywhereCacheRequest request = UpdateAnywhereCacheRequest.newBuilder()
-          .setAnywhereCache(pendingUpdate)
-          .setUpdateMask(
-              FieldMask.newBuilder()
-                  .addPaths("admission_policy")
-                  .build()
-          )
-          .build();
+      AnywhereCache pendingUpdate =
+          AnywhereCache.newBuilder().setName(cacheName).setAdmissionPolicy(admissionPolicy).build();
+
+      UpdateAnywhereCacheRequest request =
+          UpdateAnywhereCacheRequest.newBuilder()
+              .setAnywhereCache(pendingUpdate)
+              .setUpdateMask(FieldMask.newBuilder().addPaths("admission_policy").build())
+              .build();
 
       // Start a long-running operation (LRO).
       OperationFuture<AnywhereCache, UpdateAnywhereCacheMetadata> operation =
@@ -56,6 +51,5 @@ public final class AnywhereCacheUpdate {
       System.out.printf("Updated anywhere cache: %s%n", updatedAnywhereCache.getName());
     }
   }
-
 }
 // [END storage_control_update_anywhere_cache]
diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml
index 46956cfd..ed0ec7e7 100644
--- a/storage-shared-benchmarking/pom.xml
+++ b/storage-shared-benchmarking/pom.xml
@@ -10,7 +10,7 @@
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
 
   <properties>
@@ -31,7 +31,7 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.53.2-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+      <version>2.53.3-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
       <classifier>tests</classifier>
     </dependency>
     <dependency>
diff --git a/versions.txt b/versions.txt
index c492d100..700cde1c 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
 # Format:
 # module:released-version:current-version
 
-google-cloud-storage:2.53.1:2.53.2-SNAPSHOT
-gapic-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT
-grpc-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT
-proto-google-cloud-storage-v2:2.53.1:2.53.2-SNAPSHOT
-google-cloud-storage-control:2.53.1:2.53.2-SNAPSHOT
-proto-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT
-grpc-google-cloud-storage-control-v2:2.53.1:2.53.2-SNAPSHOT
+google-cloud-storage:2.53.2:2.53.3-SNAPSHOT
+gapic-google-cloud-storage-v2:2.53.2:2.53.3-SNAPSHOT
+grpc-google-cloud-storage-v2:2.53.2:2.53.3-SNAPSHOT
+proto-google-cloud-storage-v2:2.53.2:2.53.3-SNAPSHOT
+google-cloud-storage-control:2.53.2:2.53.3-SNAPSHOT
+proto-google-cloud-storage-control-v2:2.53.2:2.53.3-SNAPSHOT
+grpc-google-cloud-storage-control-v2:2.53.2:2.53.3-SNAPSHOT


Test patch:
diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java
new file mode 100644
index 00000000..e2769bba
--- /dev/null
+++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java
@@ -0,0 +1,690 @@
+/*
+ * Copyright 2025 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
+ *
+ *      https://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.
+ */
+
+package com.google.storage.control.v2;
+
+import com.google.api.gax.core.NoCredentialsProvider;
+import com.google.api.gax.httpjson.GaxHttpJsonProperties;
+import com.google.api.gax.httpjson.testing.MockHttpService;
+import com.google.api.gax.rpc.ApiClientHeaderProvider;
+import com.google.api.gax.rpc.ApiException;
+import com.google.api.gax.rpc.ApiExceptionFactory;
+import com.google.api.gax.rpc.InvalidArgumentException;
+import com.google.api.gax.rpc.StatusCode;
+import com.google.api.gax.rpc.testing.FakeStatusCode;
+import com.google.protobuf.FieldMask;
+import com.google.protobuf.Timestamp;
+import com.google.storage.control.v2.stub.HttpJsonStorageControlStub;
+import java.io.IOException;
+import java.util.List;
+import javax.annotation.Generated;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+@Generated("by gapic-generator-java")
+public class StorageControlClientHttpJsonTest {
+  private static MockHttpService mockService;
+  private static StorageControlClient client;
+
+  @BeforeClass
+  public static void startStaticServer() throws IOException {
+    mockService =
+        new MockHttpService(
+            HttpJsonStorageControlStub.getMethodDescriptors(),
+            StorageControlSettings.getDefaultEndpoint());
+    StorageControlSettings settings =
+        StorageControlSettings.newHttpJsonBuilder()
+            .setTransportChannelProvider(
+                StorageControlSettings.defaultHttpJsonTransportProviderBuilder()
+                    .setHttpTransport(mockService)
+                    .build())
+            .setCredentialsProvider(NoCredentialsProvider.create())
+            .build();
+    client = StorageControlClient.create(settings);
+  }
+
+  @AfterClass
+  public static void stopServer() {
+    client.close();
+  }
+
+  @Before
+  public void setUp() {}
+
+  @After
+  public void tearDown() throws Exception {
+    mockService.reset();
+  }
+
+  @Test
+  public void createFolderUnsupportedMethodTest() throws Exception {
+    // The createFolder() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void deleteFolderUnsupportedMethodTest() throws Exception {
+    // The deleteFolder() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void getFolderUnsupportedMethodTest() throws Exception {
+    // The getFolder() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void listFoldersUnsupportedMethodTest() throws Exception {
+    // The listFolders() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void renameFolderUnsupportedMethodTest() throws Exception {
+    // The renameFolder() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void getStorageLayoutUnsupportedMethodTest() throws Exception {
+    // The getStorageLayout() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void createManagedFolderUnsupportedMethodTest() throws Exception {
+    // The createManagedFolder() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void deleteManagedFolderUnsupportedMethodTest() throws Exception {
+    // The deleteManagedFolder() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void getManagedFolderUnsupportedMethodTest() throws Exception {
+    // The getManagedFolder() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void listManagedFoldersUnsupportedMethodTest() throws Exception {
+    // The listManagedFolders() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void createAnywhereCacheUnsupportedMethodTest() throws Exception {
+    // The createAnywhereCache() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void updateAnywhereCacheUnsupportedMethodTest() throws Exception {
+    // The updateAnywhereCache() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void disableAnywhereCacheUnsupportedMethodTest() throws Exception {
+    // The disableAnywhereCache() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void pauseAnywhereCacheUnsupportedMethodTest() throws Exception {
+    // The pauseAnywhereCache() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void resumeAnywhereCacheUnsupportedMethodTest() throws Exception {
+    // The resumeAnywhereCache() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void getAnywhereCacheUnsupportedMethodTest() throws Exception {
+    // The getAnywhereCache() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void listAnywhereCachesUnsupportedMethodTest() throws Exception {
+    // The listAnywhereCaches() method is not supported in REST transport.
+    // This empty test is generated for technical reasons.
+  }
+
+  @Test
+  public void getProjectIntelligenceConfigTest() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    IntelligenceConfigName name =
+        IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]");
+
+    IntelligenceConfig actualResponse = client.getProjectIntelligenceConfig(name);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void getProjectIntelligenceConfigExceptionTest() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      IntelligenceConfigName name =
+          IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]");
+      client.getProjectIntelligenceConfig(name);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void getProjectIntelligenceConfigTest2() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    String name = "projects/project-8842/locations/location-8842/intelligenceConfig";
+
+    IntelligenceConfig actualResponse = client.getProjectIntelligenceConfig(name);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void getProjectIntelligenceConfigExceptionTest2() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      String name = "projects/project-8842/locations/location-8842/intelligenceConfig";
+      client.getProjectIntelligenceConfig(name);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void updateProjectIntelligenceConfigTest() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    IntelligenceConfig intelligenceConfig =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    FieldMask updateMask = FieldMask.newBuilder().build();
+
+    IntelligenceConfig actualResponse =
+        client.updateProjectIntelligenceConfig(intelligenceConfig, updateMask);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void updateProjectIntelligenceConfigExceptionTest() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      IntelligenceConfig intelligenceConfig =
+          IntelligenceConfig.newBuilder()
+              .setName(
+                  IntelligenceConfigName.ofProjectLocationName("[PROJECT]", "[LOCATION]")
+                      .toString())
+              .setUpdateTime(Timestamp.newBuilder().build())
+              .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+              .setEffectiveIntelligenceConfig(
+                  IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+              .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+              .build();
+      FieldMask updateMask = FieldMask.newBuilder().build();
+      client.updateProjectIntelligenceConfig(intelligenceConfig, updateMask);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void getFolderIntelligenceConfigTest() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    IntelligenceConfigName name =
+        IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]");
+
+    IntelligenceConfig actualResponse = client.getFolderIntelligenceConfig(name);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void getFolderIntelligenceConfigExceptionTest() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      IntelligenceConfigName name =
+          IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]");
+      client.getFolderIntelligenceConfig(name);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void getFolderIntelligenceConfigTest2() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    String name = "folders/folder-8383/locations/location-8383/intelligenceConfig";
+
+    IntelligenceConfig actualResponse = client.getFolderIntelligenceConfig(name);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void getFolderIntelligenceConfigExceptionTest2() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      String name = "folders/folder-8383/locations/location-8383/intelligenceConfig";
+      client.getFolderIntelligenceConfig(name);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void updateFolderIntelligenceConfigTest() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    IntelligenceConfig intelligenceConfig =
+        IntelligenceConfig.newBuilder()
+            .setName(
+                IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    FieldMask updateMask = FieldMask.newBuilder().build();
+
+    IntelligenceConfig actualResponse =
+        client.updateFolderIntelligenceConfig(intelligenceConfig, updateMask);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void updateFolderIntelligenceConfigExceptionTest() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      IntelligenceConfig intelligenceConfig =
+          IntelligenceConfig.newBuilder()
+              .setName(
+                  IntelligenceConfigName.ofFolderLocationName("[FOLDER]", "[LOCATION]").toString())
+              .setUpdateTime(Timestamp.newBuilder().build())
+              .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+              .setEffectiveIntelligenceConfig(
+                  IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+              .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+              .build();
+      FieldMask updateMask = FieldMask.newBuilder().build();
+      client.updateFolderIntelligenceConfig(intelligenceConfig, updateMask);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void getOrganizationIntelligenceConfigTest() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    IntelligenceConfigName name = IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]");
+
+    IntelligenceConfig actualResponse = client.getOrganizationIntelligenceConfig(name);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void getOrganizationIntelligenceConfigExceptionTest() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      IntelligenceConfigName name = IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]");
+      client.getOrganizationIntelligenceConfig(name);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void getOrganizationIntelligenceConfigTest2() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    String name = "organizations/organization-1958/locations/location-1958/intelligenceConfig";
+
+    IntelligenceConfig actualResponse = client.getOrganizationIntelligenceConfig(name);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void getOrganizationIntelligenceConfigExceptionTest2() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      String name = "organizations/organization-1958/locations/location-1958/intelligenceConfig";
+      client.getOrganizationIntelligenceConfig(name);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+
+  @Test
+  public void updateOrganizationIntelligenceConfigTest() throws Exception {
+    IntelligenceConfig expectedResponse =
+        IntelligenceConfig.newBuilder()
+            .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    mockService.addResponse(expectedResponse);
+
+    IntelligenceConfig intelligenceConfig =
+        IntelligenceConfig.newBuilder()
+            .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+            .setUpdateTime(Timestamp.newBuilder().build())
+            .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+            .setEffectiveIntelligenceConfig(
+                IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+            .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+            .build();
+    FieldMask updateMask = FieldMask.newBuilder().build();
+
+    IntelligenceConfig actualResponse =
+        client.updateOrganizationIntelligenceConfig(intelligenceConfig, updateMask);
+    Assert.assertEquals(expectedResponse, actualResponse);
+
+    List<String> actualRequests = mockService.getRequestPaths();
+    Assert.assertEquals(1, actualRequests.size());
+
+    String apiClientHeaderKey =
+        mockService
+            .getRequestHeaders()
+            .get(ApiClientHeaderProvider.getDefaultApiClientHeaderKey())
+            .iterator()
+            .next();
+    Assert.assertTrue(
+        GaxHttpJsonProperties.getDefaultApiClientHeaderPattern()
+            .matcher(apiClientHeaderKey)
+            .matches());
+  }
+
+  @Test
+  public void updateOrganizationIntelligenceConfigExceptionTest() throws Exception {
+    ApiException exception =
+        ApiExceptionFactory.createException(
+            new Exception(), FakeStatusCode.of(StatusCode.Code.INVALID_ARGUMENT), false);
+    mockService.addException(exception);
+
+    try {
+      IntelligenceConfig intelligenceConfig =
+          IntelligenceConfig.newBuilder()
+              .setName(IntelligenceConfigName.ofOrgLocationName("[ORG]", "[LOCATION]").toString())
+              .setUpdateTime(Timestamp.newBuilder().build())
+              .setFilter(IntelligenceConfig.Filter.newBuilder().build())
+              .setEffectiveIntelligenceConfig(
+                  IntelligenceConfig.EffectiveIntelligenceConfig.newBuilder().build())
+              .setTrialConfig(IntelligenceConfig.TrialConfig.newBuilder().build())
+              .build();
+      FieldMask updateMask = FieldMask.newBuilder().build();
+      client.updateOrganizationIntelligenceConfig(intelligenceConfig, updateMask);
+      Assert.fail("No exception raised");
+    } catch (InvalidArgumentException e) {
+      // Expected exception.
+    }
+  }
+}
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java
index c5c86230..23d30320 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityPropertyTest.java
@@ -29,8 +29,7 @@ public class Crc32cUtilityPropertyTest {
     int secondPartHash = Hashing.crc32c().hashBytes(secondObject).asInt();
     int expected =
         Hashing.crc32c().newHasher().putBytes(firstObject).putBytes(secondObject).hash().asInt();
-    int actual =
-        Crc32cUtility.crc32cCombineGoogle(firstPartHash, secondPartHash, secondObject.length);
+    int actual = Crc32cUtility.concatCrc32c(firstPartHash, secondPartHash, secondObject.length);
     assertThat(actual).isEqualTo(expected);
   }
 }
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java
index eb16905b..7906606e 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/Crc32cUtilityTest.java
@@ -30,7 +30,7 @@ public class Crc32cUtilityTest {
     int object2_hash = 0x31AA814E;
     // length("world") -> 5
     int object2_size = 5;
-    int combined = Crc32cUtility.crc32cCombineGoogle(object1_hash, object2_hash, object2_size);
+    int combined = Crc32cUtility.concatCrc32c(object1_hash, object2_hash, object2_size);
     Assert.assertEquals(expected, combined);
   }
 
@@ -42,7 +42,7 @@ public class Crc32cUtilityTest {
     int expected = Hashing.crc32c().hashBytes(helloWorld.getBytes()).asInt();
     int object1Hash = Hashing.crc32c().hashBytes(hello.getBytes()).asInt();
     int object2Hash = Hashing.crc32c().hashBytes(world.getBytes()).asInt();
-    int combined = Crc32cUtility.crc32cCombineGoogle(object1Hash, object2Hash, world.length());
+    int combined = Crc32cUtility.concatCrc32c(object1Hash, object2Hash, world.length());
     Assert.assertEquals(expected, combined);
   }
 }
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java
index 4ed8f25e..fd4f0fd5 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest.java
@@ -16,6 +16,7 @@
 
 package com.google.cloud.storage;
 
+import static com.google.cloud.storage.TestUtils.apiException;
 import static com.google.cloud.storage.TestUtils.assertAll;
 import static com.google.cloud.storage.TestUtils.defaultRetryingDeps;
 import static com.google.cloud.storage.TestUtils.xxd;
@@ -31,17 +32,23 @@ import com.google.api.gax.retrying.TimedAttemptSettings;
 import com.google.api.gax.rpc.ApiExceptions;
 import com.google.api.gax.rpc.UnavailableException;
 import com.google.cloud.storage.BufferedWritableByteChannelSession.BufferedWritableByteChannel;
+import com.google.cloud.storage.Conversions.Decoder;
 import com.google.cloud.storage.Retrying.DefaultRetrier;
 import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.Alg;
 import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.RequestStream;
 import com.google.cloud.storage.SyncAndUploadUnbufferedWritableByteChannel.ResponseStream;
 import com.google.cloud.storage.UnbufferedWritableByteChannelSession.UnbufferedWritableByteChannel;
 import com.google.cloud.storage.UnifiedOpts.Opts;
+import com.google.cloud.storage.it.ChecksummedTestContent;
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.primitives.Ints;
 import com.google.protobuf.ByteString;
+import com.google.protobuf.Message;
+import com.google.protobuf.TextFormat;
 import com.google.storage.v2.Object;
+import com.google.storage.v2.ObjectChecksums;
 import com.google.storage.v2.QueryWriteStatusRequest;
 import com.google.storage.v2.QueryWriteStatusResponse;
 import com.google.storage.v2.StartResumableWriteRequest;
@@ -50,10 +57,12 @@ import com.google.storage.v2.StorageClient;
 import com.google.storage.v2.StorageGrpc.StorageImplBase;
 import com.google.storage.v2.WriteObjectRequest;
 import com.google.storage.v2.WriteObjectResponse;
+import com.google.storage.v2.WriteObjectSpec;
 import io.grpc.Status;
 import io.grpc.Status.Code;
 import io.grpc.stub.StreamObserver;
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -76,6 +85,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 import net.jqwik.api.Arbitraries;
@@ -372,6 +382,204 @@ public class ITSyncAndUploadUnbufferedWritableByteChannelPropertyTest {
     }
   }
 
+  @Example
+  void multipleRetriesAgainstFakeServer() throws Exception {
+    ChecksummedTestContent content =
+        ChecksummedTestContent.of(DataGenerator.base64Characters().genBytes(17));
+
+    String uploadId = UUID.randomUUID().toString();
+    StartResumableWriteRequest reqStart =
+        StartResumableWriteRequest.newBuilder()
+            .setWriteObjectSpec(
+                WriteObjectSpec.newBuilder()
+                    .setResource(
+                        Object.newBuilder().setBucket("projects/_/buckets/b").setName("o").build())
+                    .build())
+            .build();
+    StartResumableWriteResponse resStart =
+        StartResumableWriteResponse.newBuilder().setUploadId(uploadId).build();
+    QueryWriteStatusRequest reqQuery =
+        QueryWriteStatusRequest.newBuilder().setUploadId(uploadId).build();
+    QueryWriteStatusResponse resQuery =
+        QueryWriteStatusResponse.newBuilder().setPersistedSize(8).build();
+    WriteObjectRequest reqWrite0 =
+        WriteObjectRequest.newBuilder()
+            .setUploadId(uploadId)
+            .setWriteOffset(0)
+            .setChecksummedData(content.slice(0, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite2 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(2)
+            .setChecksummedData(content.slice(2, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite4 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(4)
+            .setChecksummedData(content.slice(4, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite6 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(6)
+            .setChecksummedData(content.slice(6, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite8 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(8)
+            .setChecksummedData(content.slice(8, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite8WithUploadId = reqWrite8.toBuilder().setUploadId(uploadId).build();
+    WriteObjectRequest reqWrite10 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(10)
+            .setChecksummedData(content.slice(10, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite12 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(12)
+            .setChecksummedData(content.slice(12, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite14 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(14)
+            .setChecksummedData(content.slice(14, 2).asChecksummedData())
+            .build();
+    WriteObjectRequest reqWrite16 =
+        WriteObjectRequest.newBuilder()
+            .setWriteOffset(16)
+            .setChecksummedData(content.slice(16, 1).asChecksummedData())
+            .build();
+    WriteObjectRequest reqFinish =
+        WriteObjectRequest.newBuilder()
+            .setFinishWrite(true)
+            .setObjectChecksums(ObjectChecksums.newBuilder().setCrc32C(content.getCrc32c()).build())
+            .mergeFrom(reqWrite16)
+            .build();
+    WriteObjectResponse resFinish =
+        WriteObjectResponse.newBuilder()
+            .setResource(
+                reqStart.getWriteObjectSpec().getResource().toBuilder()
+                    .setGeneration(1)
+                    .setSize(17)
+                    .setChecksums(
+                        ObjectChecksums.newBuilder()
+                            .setCrc32C(content.getCrc32c())
+                            .setMd5Hash(content.getMd5Bytes())
+                            .build())
+                    .build())
+            .build();
+    ImmutableSet<WriteObjectRequest> allReqWrite =
+        ImmutableSet.of(
+            reqWrite0,
+            reqWrite2,
+            reqWrite4,
+            reqWrite6,
+            reqWrite8,
+            reqWrite10,
+            reqWrite12,
+            reqWrite14,
+            reqWrite16);
+
+    AtomicInteger retryCount = new AtomicInteger(0);
+    StorageImplBase service =
+        new StorageImplBase() {
+          @Override
+          public void startResumableWrite(
+              StartResumableWriteRequest req, StreamObserver<StartResumableWriteResponse> respond) {
+            if (req.equals(reqStart)) {
+              respond.onNext(resStart);
+              respond.onCompleted();
+            } else {
+              unexpected(respond, req);
+            }
+          }
+
+          @Override
+          public void queryWriteStatus(
+              QueryWriteStatusRequest req, StreamObserver<QueryWriteStatusResponse> respond) {
+            if (req.equals(reqQuery)) {
+              respond.onNext(resQuery);
+              respond.onCompleted();
+            } else {
+              unexpected(respond, req);
+            }
+          }
+
+          @Override
+          public StreamObserver<WriteObjectRequest> writeObject(
+              StreamObserver<WriteObjectResponse> respond) {
+            return new StreamObserver<WriteObjectRequest>() {
+              @Override
+              public void onNext(WriteObjectRequest value) {
+                if (value.equals(reqFinish)) {
+                  respond.onNext(resFinish);
+                  respond.onCompleted();
+                } else if (value.equals(reqWrite10)) {
+                  int i = retryCount.get();
+                  if (i < 2) {
+                    respond.onError(apiException(Code.UNAVAILABLE, "{Unavailable}"));
+                  }
+                } else if (value.equals(reqWrite8WithUploadId)) {
+                  retryCount.incrementAndGet();
+                } else if (allReqWrite.contains(value)) {
+                  // do nothing
+                } else {
+                  unexpected(respond, value);
+                }
+              }
+
+              @Override
+              public void onError(Throwable t) {}
+
+              @Override
+              public void onCompleted() {}
+            };
+          }
+
+          private void unexpected(StreamObserver<?> respond, Message msg) {
+            respond.onError(
+                apiException(
+                    Code.UNIMPLEMENTED,
+                    "Unexpected request { " + TextFormat.printer().shortDebugString(msg) + " }"));
+          }
+        };
+    try (FakeServer fakeServer = FakeServer.of(service);
+        GrpcStorageImpl storage =
+            (GrpcStorageImpl) fakeServer.getGrpcStorageOptions().getService()) {
+
+      BlobInfo info = BlobInfo.newBuilder("b", "o").build();
+      SettableApiFuture<WriteObjectResponse> resultFuture = SettableApiFuture.create();
+      BufferHandle recoverBufferHandle = BufferHandle.allocate(2);
+      SyncAndUploadUnbufferedWritableByteChannel syncAndUpload =
+          new SyncAndUploadUnbufferedWritableByteChannel(
+              storage.storageClient.writeObjectCallable(),
+              storage.storageClient.queryWriteStatusCallable(),
+              resultFuture,
+              new ChunkSegmenter(Hasher.enabled(), ByteStringStrategy.copy(), 2, 2),
+              new DefaultRetrier(UnaryOperator.identity(), storage.getOptions()),
+              StorageRetryStrategy.getDefaultStorageRetryStrategy().getIdempotentHandler(),
+              new WriteCtx<>(
+                  new ResumableWrite(
+                      reqStart,
+                      resStart,
+                      id -> reqWrite0.toBuilder().clearWriteObjectSpec().setUploadId(id).build())),
+              recoveryFileManager.newRecoveryFile(info),
+              recoverBufferHandle);
+      try (BufferedWritableByteChannel w =
+          StorageByteChannels.writable()
+              .createSynchronized(
+                  new DefaultBufferedWritableByteChannel(recoverBufferHandle, syncAndUpload))) {
+        w.write(ByteBuffer.wrap(content.getBytes()));
+      }
+
+      Decoder<WriteObjectResponse, BlobInfo> decoder =
+          Conversions.grpc().blobInfo().compose(WriteObjectResponse::getResource);
+      BlobInfo actual = decoder.decode(resultFuture.get(3, TimeUnit.SECONDS));
+      assertThat(actual.getSize()).isEqualTo(content.getBytes().length);
+      assertThat(actual.getCrc32c()).isEqualTo(content.getCrc32cBase64());
+    }
+  }
+
   static List<ByteString> dataFrames(long length, int segmentLength) {
     // todo: rethink this
     Random rand = new Random(length);
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java
index 0f40cd93..aa87e647 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ChecksummedTestContent.java
@@ -96,6 +96,10 @@ public final class ChecksummedTestContent {
         .build();
   }
 
+  public ChecksummedTestContent slice(int begin, int length) {
+    return of(bytes, begin, Math.min(length, bytes.length - begin));
+  }
+
   @Override
   public String toString() {
     return MoreObjects.toStringHelper(this)
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java
index 0f619524..5c55cb86 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/GrpcPlainRequestLoggingInterceptor.java
@@ -74,6 +74,8 @@ public final class GrpcPlainRequestLoggingInterceptor implements ClientIntercept
 
   private static final Metadata.Key<String> X_GOOG_REQUEST_PARAMS =
       Metadata.Key.of("x-goog-request-params", Metadata.ASCII_STRING_MARSHALLER);
+  private static final Metadata.Key<String> X_RETRY_TEST_ID =
+      Metadata.Key.of("x-retry-test-id", Metadata.ASCII_STRING_MARSHALLER);
 
   /**
    * Define a map of message types we want to try to unpack from an {@link Any}.
@@ -116,7 +118,7 @@ public final class GrpcPlainRequestLoggingInterceptor implements ClientIntercept
     return new SimpleForwardingClientCall<ReqT, RespT>(call) {
       @Override
       public void start(Listener<RespT> responseListener, Metadata headers) {
-        if (headers.containsKey(X_GOOG_REQUEST_PARAMS)) {
+        if (headers.containsKey(X_GOOG_REQUEST_PARAMS) || headers.containsKey(X_RETRY_TEST_ID)) {
           LOGGER.atDebug().log(() -> String.format(">>> headers = %s", headers));
         }
         SimpleForwardingClientCallListener<RespT> listener =
@@ -187,10 +189,10 @@ public final class GrpcPlainRequestLoggingInterceptor implements ClientIntercept
         ByteString trim = snipBytes(content);
         b.getChecksummedDataBuilder().setContent(trim);
 
-        return b.build().toString();
+        return fmtProto((MessageOrBuilder) b.build());
       }
     }
-    return msg.toString();
+    return fmtProto((MessageOrBuilder) msg);
   }
 
   @NonNull
@@ -202,10 +204,10 @@ public final class GrpcPlainRequestLoggingInterceptor implements ClientIntercept
         ByteString trim = snipBytes(content);
         b.getChecksummedDataBuilder().setContent(trim);
 
-        return b.build().toString();
+        return fmtProto((MessageOrBuilder) b.build());
       }
     }
-    return msg.toString();
+    return fmtProto((MessageOrBuilder) msg);
   }
 
   @NonNull
@@ -217,7 +219,7 @@ public final class GrpcPlainRequestLoggingInterceptor implements ClientIntercept
         ByteString trim = snipBytes(content);
         b.getChecksummedDataBuilder().setContent(trim);
 
-        return b.build().toString();
+        return fmtProto((MessageOrBuilder) b.build());
       }
     }
     return msg.toString();
@@ -243,9 +245,9 @@ public final class GrpcPlainRequestLoggingInterceptor implements ClientIntercept
       }
       BidiReadObjectResponse snipped =
           msg.toBuilder().clearObjectDataRanges().addAllObjectDataRanges(snips).build();
-      return snipped.toString();
+      return fmtProto((MessageOrBuilder) snipped);
     }
-    return msg.toString();
+    return fmtProto((MessageOrBuilder) msg);
   }
 
   private static ByteString snipBytes(ByteString content) {