[DRAFT] googleapis
diff --git a/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/MODULE.bazel b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/MODULE.bazel
new file mode 100644
index 0000000..928ce75
--- /dev/null
+++ b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/MODULE.bazel
@@ -0,0 +1,12 @@
+module(
+    name = "googleapis",
+    version = "0.0.0-20240326-1c8d509c5.bcr.1",
+    compatibility_level = 1,
+    repo_name = "com_google_googleapis",
+)
+
+bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf")
+bazel_dep(name = "rules_proto", version = "5.3.0-21.7")
+
+injections = use_extension("//:injections.bzl", "injections")
+use_repo(injections, "com_google_googleapis_imports")
diff --git a/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/MODULE.bazel b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/MODULE.bazel
new file mode 120000
index 0000000..9b599e3
--- /dev/null
+++ b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/MODULE.bazel
@@ -0,0 +1 @@
+../MODULE.bazel
\ No newline at end of file
diff --git a/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/dev_dep_imports.bzl b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/dev_dep_imports.bzl
new file mode 100644
index 0000000..2b524e4
--- /dev/null
+++ b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/dev_dep_imports.bzl
@@ -0,0 +1,125 @@
+"""Contains forwarding declarations to rules that should only ever be used by
+`googleapis` itself (i.e. these rules come from dev-dependencies).
+
+Do NOT directly load from this file. Always use `@com_google_googleapis_imports//:imports.bzl`
+instead!
+"""
+
+load(
+    "@rules_gapic//:gapic.bzl",
+    _proto_library_with_info = "proto_library_with_info",
+    _moved_proto_library = "moved_proto_library",
+)
+load(
+    "@gapic_generator_java//rules_java_gapic:java_gapic.bzl",
+    _java_gapic_library = "java_gapic_library",
+    _java_gapic_test = "java_gapic_test",
+)
+load(
+    "@gapic_generator_java//rules_java_gapic:java_gapic_pkg.bzl",
+    _java_gapic_assembly_gradle_pkg = "java_gapic_assembly_gradle_pkg",
+)
+load(
+    "@gapic_generator_python//rules_python_gapic:py_gapic.bzl",
+    _py_gapic_library = "py_gapic_library",
+)
+load(
+    "@gapic_generator_python//rules_python_gapic:py_gapic_pkg.bzl",
+    _py_gapic_assembly_pkg = "py_gapic_assembly_pkg",
+)
+load(
+    "@com_googleapis_gapic_generator_go//rules_go_gapic:go_gapic.bzl",
+    _go_gapic_library = "go_gapic_library",
+)
+load(
+    "@com_googleapis_gapic_generator_go//rules_go_gapic:go_gapic_pkg.bzl",
+    _go_gapic_assembly_pkg = "go_gapic_assembly_pkg",
+)
+load(
+    "@gapic_generator_php//rules_php_gapic:php_gapic.bzl",
+    _php_proto_library = "php_proto_library",
+    _php_grpc_library = "php_grpc_library",
+    _php_gapic_library = "php_gapic_library",
+)
+load(
+    "@gapic_generator_php//rules_php_gapic:php_gapic_pkg.bzl",
+    _php_gapic_assembly_pkg = "php_gapic_assembly_pkg",
+)
+load(
+    "@gapic_generator_typescript//rules_typescript_gapic:typescript_gapic.bzl",
+    _typescript_gapic_library = "typescript_gapic_library",
+)
+load(
+    "@gapic_generator_typescript//rules_typescript_gapic:typescript_gapic_pkg.bzl",
+    _typescript_gapic_assembly_pkg = "typescript_gapic_assembly_pkg",
+)
+load(
+    "@gapic_generator_ruby//rules_ruby_gapic:ruby_gapic.bzl",
+    _ruby_proto_library = "ruby_proto_library",
+    _ruby_grpc_library = "ruby_grpc_library",
+    _ruby_ads_gapic_library = "ruby_ads_gapic_library",
+    _ruby_cloud_gapic_library = "ruby_cloud_gapic_library",
+)
+load(
+    "@gapic_generator_ruby//rules_ruby_gapic:ruby_gapic_pkg.bzl",
+    _ruby_gapic_assembly_pkg = "ruby_gapic_assembly_pkg",
+)
+load(
+    "@rules_gapic//csharp:csharp_gapic.bzl",
+    _csharp_proto_library = "csharp_proto_library",
+    _csharp_grpc_library = "csharp_grpc_library",
+)
+load(
+    "@gapic_generator_csharp//rules_csharp_gapic:csharp_gapic.bzl",
+    _csharp_gapic_library = "csharp_gapic_library",
+)
+load(
+    "@gapic_generator_csharp//rules_csharp_gapic:csharp_gapic_pkg.bzl",
+    _csharp_gapic_assembly_pkg = "csharp_gapic_assembly_pkg",
+)
+
+# Common
+proto_library_with_info = _proto_library_with_info
+moved_proto_library = _moved_proto_library
+
+# Java
+java_gapic_library = _java_gapic_library
+java_gapic_test = _java_gapic_test
+java_gapic_assembly_gradle_pkg = _java_gapic_assembly_gradle_pkg
+
+# Python
+py_gapic_library = _py_gapic_library
+py_test = native.py_test
+py_gapic_assembly_pkg = _py_gapic_assembly_pkg
+
+# Go
+def go_test(**kwargs): pass
+go_gapic_library = _go_gapic_library
+go_gapic_assembly_pkg = _go_gapic_assembly_pkg
+
+# C++
+def cc_gapic_library(**kwargs): pass
+
+# PHP
+php_proto_library = _php_proto_library
+php_grpc_library = _php_grpc_library
+php_gapic_library = _php_gapic_library
+php_gapic_assembly_pkg = _php_gapic_assembly_pkg
+
+# Node.js
+nodejs_gapic_library = _typescript_gapic_library
+nodejs_gapic_assembly_pkg = _typescript_gapic_assembly_pkg
+
+# Ruby
+ruby_proto_library = _ruby_proto_library
+ruby_grpc_library = _ruby_grpc_library
+ruby_ads_gapic_library = _ruby_ads_gapic_library
+ruby_cloud_gapic_library = _ruby_cloud_gapic_library
+ruby_gapic_assembly_pkg = _ruby_gapic_assembly_pkg
+
+# C#
+csharp_proto_library = _csharp_proto_library
+csharp_grpc_library = _csharp_grpc_library
+csharp_gapic_library = _csharp_gapic_library
+csharp_gapic_assembly_pkg = _csharp_gapic_assembly_pkg
+
diff --git a/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/injections.bzl b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/injections.bzl
new file mode 100644
index 0000000..05efcea
--- /dev/null
+++ b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/overlay/injections.bzl
@@ -0,0 +1,118 @@
+_INJECT_ATTRS = {
+    "rules_cc": attr.label(),
+    "rules_java": attr.label(),
+    "rules_python": attr.label(),
+    "rules_go": attr.label(),
+    "grpc": attr.label(),
+    "grpc_java": attr.label(),
+}
+
+_NATIVE = "native"
+_DEV_DEP = "dev_dep"
+
+_INJECTABLE_RULES = {
+    # Common
+    "proto_library_with_info": _DEV_DEP,
+    "moved_proto_library": _DEV_DEP,
+    # Java
+    "java_proto_library": _NATIVE,
+    "java_grpc_library": ("grpc_java", "//:java_grpc_library.bzl"),
+    "java_gapic_library": _DEV_DEP,
+    "java_gapic_test": _DEV_DEP,
+    "java_gapic_assembly_gradle_pkg": _DEV_DEP,
+    # Python
+    "py_proto_library": ("grpc", "//bazel:python_rules.bzl"),
+    "py_grpc_library": ("grpc", "//bazel:python_rules.bzl"),
+    "py_gapic_library": _DEV_DEP,
+    "py_test": _DEV_DEP,
+    "py_gapic_assembly_pkg": _DEV_DEP,
+    "py_import": ("rules_python", "//python:defs.bzl"),
+    # Go
+    "go_proto_library": ("rules_go", "//proto:def.bzl"),
+    "go_grpc_library": ("rules_go", "//proto:def.bzl"),
+    "go_library": ("rules_go", "//go:def.bzl"),
+    "go_test": _DEV_DEP,
+    "go_gapic_library": _DEV_DEP,
+    "go_gapic_assembly_pkg": _DEV_DEP,
+    # C++
+    "cc_proto_library": _NATIVE,
+    "cc_grpc_library": ("grpc", "//bazel:cc_grpc_library.bzl"),
+    "cc_gapic_library": _DEV_DEP,
+    # PHP
+    "php_proto_library": _DEV_DEP,
+    "php_grpc_library": _DEV_DEP,
+    "php_gapic_library": _DEV_DEP,
+    "php_gapic_assembly_pkg": _DEV_DEP,
+    # Node.js
+    "nodejs_gapic_library": _DEV_DEP,
+    "nodejs_gapic_assembly_pkg": _DEV_DEP,
+    # Ruby
+    "ruby_proto_library": _DEV_DEP,
+    "ruby_grpc_library": _DEV_DEP,
+    "ruby_ads_gapic_library": _DEV_DEP,
+    "ruby_cloud_gapic_library": _DEV_DEP,
+    "ruby_gapic_assembly_pkg": _DEV_DEP,
+    # C#
+    "csharp_proto_library": _DEV_DEP,
+    "csharp_grpc_library": _DEV_DEP,
+    "csharp_gapic_library": _DEV_DEP,
+    "csharp_gapic_assembly_pkg": _DEV_DEP,
+}
+
+def _imports_repo_impl(rctx):
+    loads = []
+    rules = []
+
+    for rule_name, source in _INJECTABLE_RULES.items():
+        if source == _NATIVE:
+            rules.append("%s = native.%s" % (rule_name, rule_name))
+        elif source == _DEV_DEP:
+            if rctx.attr.inject_dev_deps:
+                loads.append("load('@com_google_googleapis//:dev_dep_imports.bzl', _%s='%s')" % (rule_name, rule_name))
+                rules.append("%s = _%s" % (rule_name, rule_name))
+            else:
+                rules.append("def %s(**kwargs): pass" % rule_name)
+        else:
+            repo, label_remainder = source
+            injected_label = getattr(rctx.attr, repo)
+            if injected_label == None:
+                rules.append("def %s(**kwargs): pass" % rule_name)
+            else:
+                loads.append("load('@@%s%s', _%s='%s')" % (injected_label.repo_name, label_remainder, rule_name, rule_name))
+                rules.append("%s = _%s" % (rule_name, rule_name))
+
+    rctx.file("BUILD.bazel")
+    rctx.file("imports.bzl", "\n".join(loads + rules))
+
+imports_repo = repository_rule(
+    implementation = _imports_repo_impl,
+    attrs = _INJECT_ATTRS | {
+        "inject_dev_deps": attr.bool(),
+    },
+)
+
+def _injections_impl(mctx):
+    attrs = {k: None for k in _INJECT_ATTRS}
+    inject_dev_deps = False
+
+    for module in mctx.modules:
+        if module.is_root and module.name == "googleapis":
+            inject_dev_deps = True
+        if len(module.tags.inject) == 0:
+            continue
+        if len(module.tags.inject) > 1:
+            fail("Multiple `inject` tags set by the module %s@%s. Only one `inject` tag may be set by each module." % (module.name, module.version))
+        attrs = {k: v or getattr(module.tags.inject[0], k, None) for k, v in attrs.items()}
+
+    imports_repo(
+        name = "com_google_googleapis_imports",
+        inject_dev_deps = inject_dev_deps,
+        **attrs,
+    )
+
+    return mctx.extension_metadata(reproducible = True)
+
+injections = module_extension(
+    implementation = _injections_impl,
+    tag_classes = {"inject": tag_class(attrs = _INJECT_ATTRS)},
+)
diff --git a/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/presubmit.yml b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/presubmit.yml
new file mode 100644
index 0000000..5579de0
--- /dev/null
+++ b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/presubmit.yml
@@ -0,0 +1,9 @@
+matrix:
+  platform: ["debian10", "macos", "ubuntu2004", "windows"]
+  bazel: ["7.x"]
+tasks:
+  verify_targets:
+    platform: ${{ platform }}
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@googleapis//google/devtools/source/v1:source_proto'
diff --git a/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/source.json b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/source.json
new file mode 100644
index 0000000..64755bb
--- /dev/null
+++ b/modules/googleapis/0.0.0-20240326-1c8d509c5.bcr.1/source.json
@@ -0,0 +1,10 @@
+{
+    "integrity": "sha256-uFSuF925M8JJUw90PbjXjfgJBd+0JoElVWSh0ZId/Dw=",
+    "strip_prefix": "googleapis-1c8d509c574aeab7478be1bfd4f2e8f0931cfead",
+    "url": "https://github.com/googleapis/googleapis/archive/1c8d509c574aeab7478be1bfd4f2e8f0931cfead.tar.gz",
+    "overlay": {
+        "MODULE.bazel": "sha256-JfstIx1z0DQKpgl0V+W2o+ABEGN73CBvzENVKOQTjsI=",
+        "dev_dep_imports.bzl": "sha256-oGTkJ4OizMjKiD+gmpJqvTm8WS/3qC/fqU+ZVODoiGk=",
+        "injections.bzl": "sha256-Z8M/rugI0sy+i8b/ZYB9PJouUCy86hTUiXXlPJKSZp0="
+    }
+}
diff --git a/modules/googleapis/metadata.json b/modules/googleapis/metadata.json
index 9ce0da1..63e4313 100644
--- a/modules/googleapis/metadata.json
+++ b/modules/googleapis/metadata.json
@@ -1,16 +1,17 @@
 {
-  "homepage": "https://github.com/googleapis/googleapis",
-  "maintainers": [
-    {
-      "email": "bcr-maintainers@bazel.build",
-      "name": "No Maintainer Specified"
-    }
-  ],
-  "repository": [
-    "github:googleapis/googleapis"
-  ],
-  "versions": [
-    "0.0.0-20240326-1c8d509c5"
-  ],
-  "yanked_versions": {}
+    "homepage": "https://github.com/googleapis/googleapis",
+    "maintainers": [
+        {
+            "email": "bcr-maintainers@bazel.build",
+            "name": "No Maintainer Specified"
+        }
+    ],
+    "repository": [
+        "github:googleapis/googleapis"
+    ],
+    "versions": [
+        "0.0.0-20240326-1c8d509c5",
+        "0.0.0-20240326-1c8d509c5.bcr.1"
+    ],
+    "yanked_versions": {}
 }
diff --git a/modules/grpc-java/1.64.0.bcr.1/MODULE.bazel b/modules/grpc-java/1.64.0.bcr.1/MODULE.bazel
new file mode 100644
index 0000000..1a1df9b
--- /dev/null
+++ b/modules/grpc-java/1.64.0.bcr.1/MODULE.bazel
@@ -0,0 +1,204 @@
+module(
+    name = "grpc-java",
+    compatibility_level = 0,
+    repo_name = "io_grpc_grpc_java",
+    version = "1.64.0.bcr.1",
+)
+
+# GRPC_DEPS_START
+IO_GRPC_GRPC_JAVA_ARTIFACTS = [
+    "com.google.android:annotations:4.1.1.4",
+    "com.google.api.grpc:proto-google-common-protos:2.29.0",
+    "com.google.auth:google-auth-library-credentials:1.22.0",
+    "com.google.auth:google-auth-library-oauth2-http:1.22.0",
+    "com.google.auto.value:auto-value-annotations:1.10.4",
+    "com.google.auto.value:auto-value:1.10.4",
+    "com.google.code.findbugs:jsr305:3.0.2",
+    "com.google.code.gson:gson:2.10.1",
+    "com.google.errorprone:error_prone_annotations:2.23.0",
+    "com.google.guava:failureaccess:1.0.1",
+    "com.google.guava:guava:32.1.3-android",
+    "com.google.j2objc:j2objc-annotations:1.3",
+    "com.google.re2j:re2j:1.7",
+    "com.google.truth:truth:1.1.5",
+    "com.squareup.okhttp:okhttp:2.7.5",
+    "com.squareup.okio:okio:2.10.0",  # 3.0+ needs swapping to -jvm; need work to avoid flag-day
+    "io.netty:netty-buffer:4.1.100.Final",
+    "io.netty:netty-codec-http2:4.1.100.Final",
+    "io.netty:netty-codec-http:4.1.100.Final",
+    "io.netty:netty-codec-socks:4.1.100.Final",
+    "io.netty:netty-codec:4.1.100.Final",
+    "io.netty:netty-common:4.1.100.Final",
+    "io.netty:netty-handler-proxy:4.1.100.Final",
+    "io.netty:netty-handler:4.1.100.Final",
+    "io.netty:netty-resolver:4.1.100.Final",
+    "io.netty:netty-tcnative-boringssl-static:2.0.61.Final",
+    "io.netty:netty-tcnative-classes:2.0.61.Final",
+    "io.netty:netty-transport-native-epoll:jar:linux-x86_64:4.1.100.Final",
+    "io.netty:netty-transport-native-unix-common:4.1.100.Final",
+    "io.netty:netty-transport:4.1.100.Final",
+    "io.opencensus:opencensus-api:0.31.0",
+    "io.opencensus:opencensus-contrib-grpc-metrics:0.31.0",
+    "io.perfmark:perfmark-api:0.26.0",
+    "junit:junit:4.13.2",
+    "org.apache.tomcat:annotations-api:6.0.53",
+    "org.codehaus.mojo:animal-sniffer-annotations:1.23",
+]
+# GRPC_DEPS_END
+
+bazel_dep(name = "googleapis", repo_name = "com_google_googleapis", version = "0.0.0-20240326-1c8d509c5.bcr.1")
+bazel_dep(name = "grpc", repo_name = "com_github_grpc_grpc", version = "1.65.0.bcr.1")
+bazel_dep(name = "protobuf", repo_name = "com_google_protobuf", version = "23.1")
+bazel_dep(name = "rules_cc", version = "0.0.9")
+bazel_dep(name = "rules_java", version = "5.3.5")
+bazel_dep(name = "rules_go", repo_name = "io_bazel_rules_go", version = "0.46.0")
+bazel_dep(name = "rules_jvm_external", version = "6.0")
+bazel_dep(name = "rules_proto", version = "5.3.0-21.7")
+
+non_module_deps = use_extension("//:repositories.bzl", "grpc_java_repositories_extension")
+
+use_repo(
+    non_module_deps,
+    "com_github_cncf_xds",
+    "envoy_api",
+    "io_grpc_grpc_proto",
+)
+
+grpc_repo_deps_ext = use_extension("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_repo_deps_ext")
+
+use_repo(
+    grpc_repo_deps_ext,
+    "com_envoyproxy_protoc_gen_validate",
+    "com_github_cncf_udpa",
+    "opencensus_proto",
+)
+
+maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
+
+maven.install(
+    artifacts = IO_GRPC_GRPC_JAVA_ARTIFACTS,
+    repositories = [
+        "https://repo.maven.apache.org/maven2/",
+    ],
+    strict_visibility = True,
+)
+
+use_repo(maven, "maven")
+
+maven.override(
+    coordinates = "com.google.protobuf:protobuf-java",
+    target = "@com_google_protobuf//:protobuf_java",
+)
+
+maven.override(
+    coordinates = "com.google.protobuf:protobuf-java-util",
+    target = "@com_google_protobuf//:protobuf_java_util",
+)
+
+maven.override(
+    coordinates = "com.google.protobuf:protobuf-javalite",
+    target = "@com_google_protobuf//:protobuf_javalite",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-alts",
+    target = "@io_grpc_grpc_java//alts",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-api",
+    target = "@io_grpc_grpc_java//api",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-auth",
+    target = "@io_grpc_grpc_java//auth",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-census",
+    target = "@io_grpc_grpc_java//census",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-context",
+    target = "@io_grpc_grpc_java//context",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-core",
+    target = "@io_grpc_grpc_java//core:core_maven",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-googleapis",
+    target = "@io_grpc_grpc_java//googleapis",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-grpclb",
+    target = "@io_grpc_grpc_java//grpclb",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-inprocess",
+    target = "@io_grpc_grpc_java//inprocess",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-netty",
+    target = "@io_grpc_grpc_java//netty",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-netty-shaded",
+    target = "@io_grpc_grpc_java//netty:shaded_maven",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-okhttp",
+    target = "@io_grpc_grpc_java//okhttp",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-protobuf",
+    target = "@io_grpc_grpc_java//protobuf",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-protobuf-lite",
+    target = "@io_grpc_grpc_java//protobuf-lite",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-rls",
+    target = "@io_grpc_grpc_java//rls",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-services",
+    target = "@io_grpc_grpc_java//services:services_maven",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-stub",
+    target = "@io_grpc_grpc_java//stub",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-testing",
+    target = "@io_grpc_grpc_java//testing",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-xds",
+    target = "@io_grpc_grpc_java//xds:xds_maven",
+)
+
+maven.override(
+    coordinates = "io.grpc:grpc-util",
+    target = "@io_grpc_grpc_java//util",
+)
+
+googleapis_injections = use_extension("@com_google_googleapis//:injections.bzl", "injections")
+googleapis_injections.inject(grpc_java = "@io_grpc_grpc_java")
diff --git a/modules/grpc-java/1.64.0.bcr.1/patches/module_dot_bazel.patch b/modules/grpc-java/1.64.0.bcr.1/patches/module_dot_bazel.patch
new file mode 100644
index 0000000..7ecafaa
--- /dev/null
+++ b/modules/grpc-java/1.64.0.bcr.1/patches/module_dot_bazel.patch
@@ -0,0 +1,40 @@
+--- MODULE.bazel
++++ MODULE.bazel
+@@ -2,7 +2,7 @@
+     name = "grpc-java",
+     compatibility_level = 0,
+     repo_name = "io_grpc_grpc_java",
+-    version = "0",
++    version = "1.64.0.bcr.1",
+ )
+
+ # GRPC_DEPS_START
+@@ -18,6 +18,7 @@ IO_GRPC_GRPC_JAVA_ARTIFACTS = [
+     "com.google.errorprone:error_prone_annotations:2.23.0",
+     "com.google.guava:failureaccess:1.0.1",
+     "com.google.guava:guava:32.1.3-android",
++    "com.google.j2objc:j2objc-annotations:1.3",
+     "com.google.re2j:re2j:1.7",
+     "com.google.truth:truth:1.1.5",
+     "com.squareup.okhttp:okhttp:2.7.5",
+@@ -45,7 +46,7 @@
+ ]
+ # GRPC_DEPS_END
+
+-bazel_dep(name = "googleapis", repo_name = "com_google_googleapis", version = "0.0.0-20240326-1c8d509c5")
+-bazel_dep(name = "grpc", repo_name = "com_github_grpc_grpc", version = "1.56.3.bcr.1")
++bazel_dep(name = "googleapis", repo_name = "com_google_googleapis", version = "0.0.0-20240326-1c8d509c5.bcr.1")
++bazel_dep(name = "grpc", repo_name = "com_github_grpc_grpc", version = "1.65.0.bcr.1")
+ bazel_dep(name = "protobuf", repo_name = "com_google_protobuf", version = "23.1")
+ bazel_dep(name = "rules_cc", version = "0.0.9")
+@@ -199,8 +200,5 @@
+     target = "@io_grpc_grpc_java//util",
+ )
+
+-switched_rules = use_extension("@com_google_googleapis//:extensions.bzl", "switched_rules")
+-
+-switched_rules.use_languages(java = True)
+-
+-use_repo(switched_rules, "com_google_googleapis_imports")
++googleapis_injections = use_extension("@com_google_googleapis//:injections.bzl", "injections")
++googleapis_injections.inject(grpc_java = "@io_grpc_grpc_java")
diff --git a/modules/grpc-java/1.64.0.bcr.1/presubmit.yml b/modules/grpc-java/1.64.0.bcr.1/presubmit.yml
new file mode 100644
index 0000000..777eadc
--- /dev/null
+++ b/modules/grpc-java/1.64.0.bcr.1/presubmit.yml
@@ -0,0 +1,9 @@
+matrix:
+  platform: ["debian10", "macos", "ubuntu2004", "windows"]
+  bazel: ["7.x"]
+tasks:
+  verify_targets:
+    platform: ${{ platform }}
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@grpc-java//:java_grpc_library__external_repo_test'
diff --git a/modules/grpc-java/1.64.0.bcr.1/source.json b/modules/grpc-java/1.64.0.bcr.1/source.json
new file mode 100644
index 0000000..0dd8c06
--- /dev/null
+++ b/modules/grpc-java/1.64.0.bcr.1/source.json
@@ -0,0 +1,9 @@
+{
+    "integrity": "sha256-hiaqXiASPlVBCDb6k5u3k4RZTv3UW5eeiDZC2szK36E=",
+    "strip_prefix": "grpc-java-1.64.0",
+    "url": "https://github.com/grpc/grpc-java/archive/refs/tags/v1.64.0.tar.gz",
+    "patch_strip": 0,
+    "patches": {
+        "module_dot_bazel.patch": "sha256-M/LxC1Q7SCuEiJWVu3JRqagGW//jlmQCLJYGue1Zmec="
+    }
+}
diff --git a/modules/grpc-java/metadata.json b/modules/grpc-java/metadata.json
index 3d1d589..915cda9 100644
--- a/modules/grpc-java/metadata.json
+++ b/modules/grpc-java/metadata.json
@@ -1,17 +1,18 @@
 {
-  "homepage": "https://github.com/grpc/grpc-java",
-  "maintainers": [
-    {
-      "email": "bcr-maintainers@bazel.build",
-      "name": "No Maintainer Specified"
-    }
-  ],
-  "repository": [
-    "github:grpc/grpc-java"
-  ],
-  "versions": [
-    "1.62.2",
-    "1.64.0"
-  ],
-  "yanked_versions": {}
+    "homepage": "https://github.com/grpc/grpc-java",
+    "maintainers": [
+        {
+            "email": "bcr-maintainers@bazel.build",
+            "name": "No Maintainer Specified"
+        }
+    ],
+    "repository": [
+        "github:grpc/grpc-java"
+    ],
+    "versions": [
+        "1.62.2",
+        "1.64.0",
+        "1.64.0.bcr.1"
+    ],
+    "yanked_versions": {}
 }
diff --git a/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/MODULE.bazel b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/MODULE.bazel
new file mode 100644
index 0000000..32e7326
--- /dev/null
+++ b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/MODULE.bazel
@@ -0,0 +1,9 @@
+module(
+    name = "grpc-proto",
+    version = "0.0.0-20240627-ec30f58.bcr.1",
+    repo_name = "io_grpc_grpc_proto",
+)
+
+bazel_dep(name = "googleapis", version = "0.0.0-20240326-1c8d509c5.bcr.1", repo_name = "com_google_googleapis")
+bazel_dep(name = "rules_proto", version = "4.0.0")
+bazel_dep(name = "protobuf", version = "23.1", repo_name = "com_google_protobuf")
diff --git a/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/overlay/MODULE.bazel b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/overlay/MODULE.bazel
new file mode 120000
index 0000000..9b599e3
--- /dev/null
+++ b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/overlay/MODULE.bazel
@@ -0,0 +1 @@
+../MODULE.bazel
\ No newline at end of file
diff --git a/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/presubmit.yml b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/presubmit.yml
new file mode 100644
index 0000000..6e571d7
--- /dev/null
+++ b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/presubmit.yml
@@ -0,0 +1,16 @@
+matrix:
+  platform:
+  - debian10
+  - ubuntu2004
+  - macos
+  - macos_arm64
+  - windows
+  bazel:
+  - 7.x
+tasks:
+  verify_targets:
+    name: Verify build targets
+    platform: ${{ platform }}
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@grpc-proto//...'
diff --git a/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/source.json b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/source.json
new file mode 100644
index 0000000..4f91a2b
--- /dev/null
+++ b/modules/grpc-proto/0.0.0-20240627-ec30f58.bcr.1/source.json
@@ -0,0 +1,8 @@
+{
+    "url": "https://github.com/grpc/grpc-proto/archive/ec30f589e2519d595688b9a42f88a91bdd6b733f.tar.gz",
+    "integrity": "sha256-XptSCyKvvVOmYswpAXBkviU8Hfpt+JWHOFlOf+xq3jM=",
+    "strip_prefix": "grpc-proto-ec30f589e2519d595688b9a42f88a91bdd6b733f",
+    "overlay": {
+        "MODULE.bazel": "sha256-XtMiaWVdXEyzPPiYDXZmXUFEW4liI/qjg9Rkw8t/QD8="
+    }
+}
diff --git a/modules/grpc-proto/metadata.json b/modules/grpc-proto/metadata.json
index c8df55d..150bfda 100644
--- a/modules/grpc-proto/metadata.json
+++ b/modules/grpc-proto/metadata.json
@@ -10,7 +10,8 @@
         "github:grpc/grpc-proto"
     ],
     "versions": [
-        "0.0.0-20240627-ec30f58"
+        "0.0.0-20240627-ec30f58",
+        "0.0.0-20240627-ec30f58.bcr.1"
     ],
     "yanked_versions": {}
 }
diff --git a/modules/grpc/1.65.0.bcr.1/MODULE.bazel b/modules/grpc/1.65.0.bcr.1/MODULE.bazel
new file mode 100644
index 0000000..554a102
--- /dev/null
+++ b/modules/grpc/1.65.0.bcr.1/MODULE.bazel
@@ -0,0 +1,77 @@
+module(
+    name = "grpc",
+    version = "1.65.0.bcr.1",
+    compatibility_level = 1,
+    repo_name = "com_github_grpc_grpc",
+)
+
+bazel_dep(name = "abseil-cpp", version = "20240116.0", repo_name = "com_google_absl")
+bazel_dep(name = "apple_support", version = "1.15.1", repo_name = "build_bazel_apple_support")
+bazel_dep(name = "bazel_skylib", version = "1.5.0")
+bazel_dep(name = "boringssl", version = "0.0.0-20230215-5c22014")
+bazel_dep(name = "c-ares", version = "1.15.0", repo_name = "com_github_cares_cares")
+bazel_dep(name = "gazelle", version = "0.36.0", repo_name = "bazel_gazelle")
+bazel_dep(name = "google_benchmark", version = "1.8.4", repo_name = "com_github_google_benchmark")
+bazel_dep(name = "googleapis", version = "0.0.0-20240326-1c8d509c5.bcr.1", repo_name = "com_google_googleapis")
+bazel_dep(name = "googletest", version = "1.14.0.bcr.1", repo_name = "com_google_googletest")
+bazel_dep(name = "opentelemetry-cpp", version = "1.14.2", repo_name = "io_opentelemetry_cpp")
+bazel_dep(name = "platforms", version = "0.0.10")
+bazel_dep(name = "prometheus-cpp", version = "1.2.4", repo_name = "com_github_jupp0r_prometheus_cpp")
+bazel_dep(name = "protobuf", version = "26.0.bcr.2", repo_name = "com_google_protobuf")
+bazel_dep(name = "re2", version = "2023-09-01", repo_name = "com_googlesource_code_re2")
+bazel_dep(name = "rules_apple", version = "3.5.1", repo_name = "build_bazel_rules_apple")
+bazel_dep(name = "rules_cc", version = "0.0.9")
+bazel_dep(name = "rules_go", version = "0.48.0", repo_name = "io_bazel_rules_go")
+bazel_dep(name = "rules_java", version = "7.4.0")
+bazel_dep(name = "rules_proto", version = "6.0.0")
+bazel_dep(name = "zlib", version = "1.3.1.bcr.1")
+
+grpc_repo_deps_ext = use_extension("//bazel:grpc_deps.bzl", "grpc_repo_deps_ext")
+use_repo(
+    grpc_repo_deps_ext,
+    "com_envoyproxy_protoc_gen_validate",
+    "com_github_cncf_udpa",
+    "com_github_cncf_xds",
+    "envoy_api",
+    "google_cloud_cpp",
+    "io_opencensus_cpp",
+)
+
+googleapis_injections = use_extension("@com_google_googleapis//:injections.bzl", "injections")
+googleapis_injections.inject(grpc = "@com_github_grpc_grpc")
+
+bazel_dep(name = "rules_python", version = "0.31.0")
+
+PYTHON_VERSIONS = [
+    "3.8",
+    "3.9",
+    "3.10",
+    "3.11",
+    "3.12",
+]
+
+python = use_extension("@rules_python//python/extensions:python.bzl", "python")
+
+[
+    python.toolchain(
+        is_default = python_version == PYTHON_VERSIONS[-1],
+        python_version = python_version,
+    )
+    for python_version in PYTHON_VERSIONS
+]
+
+pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
+
+[
+    pip.parse(
+        hub_name = "grpc_python_dependencies",
+        python_version = python_version,
+        requirements_lock = "//:requirements.bazel.txt",
+    )
+    for python_version in PYTHON_VERSIONS
+]
+
+use_repo(pip, "grpc_python_dependencies")
+
+grpc_python_deps_ext = use_extension("//bazel:grpc_python_deps.bzl", "grpc_python_deps_ext")
+use_repo(grpc_python_deps_ext, "cython")
diff --git a/modules/grpc/1.65.0.bcr.1/overlay/MODULE.bazel b/modules/grpc/1.65.0.bcr.1/overlay/MODULE.bazel
new file mode 120000
index 0000000..9b599e3
--- /dev/null
+++ b/modules/grpc/1.65.0.bcr.1/overlay/MODULE.bazel
@@ -0,0 +1 @@
+../MODULE.bazel
\ No newline at end of file
diff --git a/modules/grpc/1.65.0.bcr.1/patches/adopt_bzlmod.patch b/modules/grpc/1.65.0.bcr.1/patches/adopt_bzlmod.patch
new file mode 100644
index 0000000..362c86f
--- /dev/null
+++ b/modules/grpc/1.65.0.bcr.1/patches/adopt_bzlmod.patch
@@ -0,0 +1,364 @@
+diff --git a/bazel/cython_library.bzl b/bazel/cython_library.bzl
+index dc2ef7a890..fd2881ed8c 100644
+--- a/bazel/cython_library.bzl
++++ b/bazel/cython_library.bzl
+@@ -72,7 +72,7 @@ def pyx_library(name, deps = [], py_deps = [], srcs = [], **kwargs):
+         native.cc_binary(
+             name = shared_object_name,
+             srcs = [stem + ".cpp"],
+-            deps = deps + ["@local_config_python//:python_headers"],
++            deps = deps + ["@rules_python//python/cc:current_py_cc_headers"],
+             defines = defines,
+             linkshared = 1,
+         )
+diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl
+index b9d5fe47c9..257beb26e0 100644
+--- a/bazel/grpc_deps.bzl
++++ b/bazel/grpc_deps.bzl
+@@ -19,172 +19,6 @@ load("//bazel:grpc_python_deps.bzl", "grpc_python_deps")
+ # buildifier: disable=unnamed-macro
+ def grpc_deps():
+     """Loads dependencies need to compile and test the grpc library."""
+-
+-    if "platforms" not in native.existing_rules():
+-        http_archive(
+-            name = "platforms",
+-            sha256 = "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz",
+-                "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz",
+-            ],
+-        )
+-
+-    if "boringssl" not in native.existing_rules():
+-        http_archive(
+-            name = "boringssl",
+-            # Use github mirror instead of https://boringssl.googlesource.com/boringssl
+-            # to obtain a boringssl archive with consistent sha256
+-            sha256 = "9f441d72fccb9a3faf96470478c8ccfaaeb8db1cffd4d78b698f782124dad1b0",
+-            strip_prefix = "boringssl-b8a2bffc598f230484ff48a247526a9820facfc2",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/b8a2bffc598f230484ff48a247526a9820facfc2.tar.gz",
+-                "https://github.com/google/boringssl/archive/b8a2bffc598f230484ff48a247526a9820facfc2.tar.gz",
+-            ],
+-        )
+-
+-    if "zlib" not in native.existing_rules():
+-        http_archive(
+-            name = "zlib",
+-            build_file = "@com_github_grpc_grpc//third_party:zlib.BUILD",
+-            sha256 = "18337cdb32562003c39d9f7322b9a166ad4abfb2b909566428e11f96d2385586",
+-            strip_prefix = "zlib-09155eaa2f9270dc4ed1fa13e2b4b2613e6e4851",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/madler/zlib/archive/09155eaa2f9270dc4ed1fa13e2b4b2613e6e4851.tar.gz",
+-                "https://github.com/madler/zlib/archive/09155eaa2f9270dc4ed1fa13e2b4b2613e6e4851.tar.gz",
+-            ],
+-        )
+-
+-    if "com_google_protobuf" not in native.existing_rules():
+-        http_archive(
+-            name = "com_google_protobuf",
+-            sha256 = "387478260190c540388839a3449c635a69708d92fc38ea6e2364b1196db90ea5",
+-            strip_prefix = "protobuf-2434ef2adf0c74149b9d547ac5fb545a1ff8b6b5",
+-            urls = [
+-                # https://github.com/protocolbuffers/protobuf/commits/v26.1
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/protocolbuffers/protobuf/archive/2434ef2adf0c74149b9d547ac5fb545a1ff8b6b5.tar.gz",
+-                "https://github.com/protocolbuffers/protobuf/archive/2434ef2adf0c74149b9d547ac5fb545a1ff8b6b5.tar.gz",
+-            ],
+-            patches = [
+-                "@com_github_grpc_grpc//third_party:protobuf.patch",
+-                "@com_github_grpc_grpc//third_party:protobuf.10007.patch",
+-            ],
+-            patch_args = ["-p1"],
+-        )
+-
+-    if "com_google_googletest" not in native.existing_rules():
+-        http_archive(
+-            name = "com_google_googletest",
+-            sha256 = "31bf78bd91b96dd5e24fab3bb1d7f3f7453ccbaceec9afb86d6e4816a15ab109",
+-            strip_prefix = "googletest-2dd1c131950043a8ad5ab0d2dda0e0970596586a",
+-            urls = [
+-                # 2023-10-09
+-                "https://github.com/google/googletest/archive/2dd1c131950043a8ad5ab0d2dda0e0970596586a.tar.gz",
+-            ],
+-        )
+-
+-    if "com_google_fuzztest" not in native.existing_rules():
+-        # when updating this remember to run:
+-        # bazel run @com_google_fuzztest//bazel:setup_configs > tools/fuzztest.bazelrc
+-        http_archive(
+-            name = "com_google_fuzztest",
+-            sha256 = "cdf8d8cd3cdc77280a7c59b310edf234e489a96b6e727cb271e7dfbeb9bcca8d",
+-            strip_prefix = "fuzztest-4ecaeb5084a061a862af8f86789ee184cd3d3f18",
+-            urls = [
+-                # 2023-05-16
+-                "https://github.com/google/fuzztest/archive/4ecaeb5084a061a862af8f86789ee184cd3d3f18.tar.gz",
+-            ],
+-        )
+-
+-    if "rules_cc" not in native.existing_rules():
+-        http_archive(
+-            name = "rules_cc",
+-            sha256 = "2037875b9a4456dce4a79d112a8ae885bbc4aad968e6587dca6e64f3a0900cdf",
+-            strip_prefix = "rules_cc-0.0.9",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz",
+-                "https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz",
+-            ],
+-        )
+-
+-    if "com_github_google_benchmark" not in native.existing_rules():
+-        http_archive(
+-            name = "com_github_google_benchmark",
+-            sha256 = "8e7b955f04bc6984e4f14074d0d191474f76a6c8e849e04a9dced49bc975f2d4",
+-            strip_prefix = "benchmark-344117638c8ff7e239044fd0fa7085839fc03021",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/benchmark/archive/344117638c8ff7e239044fd0fa7085839fc03021.tar.gz",
+-                "https://github.com/google/benchmark/archive/344117638c8ff7e239044fd0fa7085839fc03021.tar.gz",
+-            ],
+-        )
+-
+-    if "com_googlesource_code_re2" not in native.existing_rules():
+-        http_archive(
+-            name = "com_googlesource_code_re2",
+-            sha256 = "1ae8ccfdb1066a731bba6ee0881baad5efd2cd661acd9569b689f2586e1a50e9",
+-            strip_prefix = "re2-2022-04-01",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/re2/archive/2022-04-01.tar.gz",
+-                "https://github.com/google/re2/archive/2022-04-01.tar.gz",
+-            ],
+-        )
+-
+-    if "com_github_cares_cares" not in native.existing_rules():
+-        http_archive(
+-            name = "com_github_cares_cares",
+-            build_file = "@com_github_grpc_grpc//third_party:cares/cares.BUILD",
+-            sha256 = "bf26e5b25e259911914a85ae847b6d723488adb5af4f8bdeb9d0871a318476e3",
+-            strip_prefix = "c-ares-6360e96b5cf8e5980c887ce58ef727e53d77243a",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/c-ares/c-ares/archive/6360e96b5cf8e5980c887ce58ef727e53d77243a.tar.gz",
+-                "https://github.com/c-ares/c-ares/archive/6360e96b5cf8e5980c887ce58ef727e53d77243a.tar.gz",
+-            ],
+-        )
+-
+-    if "com_google_absl" not in native.existing_rules():
+-        http_archive(
+-            name = "com_google_absl",
+-            sha256 = "338420448b140f0dfd1a1ea3c3ce71b3bc172071f24f4d9a57d59b45037da440",
+-            strip_prefix = "abseil-cpp-20240116.0",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/abseil/abseil-cpp/archive/20240116.0.tar.gz",
+-                "https://github.com/abseil/abseil-cpp/archive/20240116.0.tar.gz",
+-            ],
+-        )
+-
+-    if "bazel_toolchains" not in native.existing_rules():
+-        # list of releases is at https://github.com/bazelbuild/bazel-toolchains/releases
+-        http_archive(
+-            name = "bazel_toolchains",
+-            sha256 = "179ec02f809e86abf56356d8898c8bd74069f1bd7c56044050c2cd3d79d0e024",
+-            strip_prefix = "bazel-toolchains-4.1.0",
+-            urls = [
+-                "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/releases/download/4.1.0/bazel-toolchains-4.1.0.tar.gz",
+-                "https://github.com/bazelbuild/bazel-toolchains/releases/download/4.1.0/bazel-toolchains-4.1.0.tar.gz",
+-            ],
+-        )
+-
+-    if "bazel_skylib" not in native.existing_rules():
+-        http_archive(
+-            name = "bazel_skylib",
+-            urls = [
+-                "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.3/bazel-skylib-1.0.3.tar.gz",
+-                "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.3/bazel-skylib-1.0.3.tar.gz",
+-            ],
+-            sha256 = "1c531376ac7e5a180e0237938a2536de0c54d93f5c278634818e0efc952dd56c",
+-        )
+-
+-    if "bazel_compdb" not in native.existing_rules():
+-        http_archive(
+-            name = "bazel_compdb",
+-            sha256 = "bcecfd622c4ef272fd4ba42726a52e140b961c4eac23025f18b346c968a8cfb4",
+-            strip_prefix = "bazel-compilation-database-0.4.5",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/grailbio/bazel-compilation-database/archive/0.4.5.tar.gz",
+-                "https://github.com/grailbio/bazel-compilation-database/archive/0.4.5.tar.gz",
+-            ],
+-        )
+-
+     if "io_opencensus_cpp" not in native.existing_rules():
+         http_archive(
+             name = "io_opencensus_cpp",
+@@ -207,58 +41,6 @@ def grpc_deps():
+             ],
+         )
+ 
+-    if "io_bazel_rules_go" not in native.existing_rules():
+-        http_archive(
+-            name = "io_bazel_rules_go",
+-            sha256 = "69de5c704a05ff37862f7e0f5534d4f479418afc21806c887db544a316f3cb6b",
+-            urls = [
+-                "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.27.0/rules_go-v0.27.0.tar.gz",
+-                "https://github.com/bazelbuild/rules_go/releases/download/v0.27.0/rules_go-v0.27.0.tar.gz",
+-            ],
+-        )
+-
+-    if "build_bazel_rules_apple" not in native.existing_rules():
+-        http_archive(
+-            name = "build_bazel_rules_apple",
+-            sha256 = "34c41bfb59cdaea29ac2df5a2fa79e5add609c71bb303b2ebb10985f93fa20e7",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_apple/releases/download/3.1.1/rules_apple.3.1.1.tar.gz",
+-                "https://github.com/bazelbuild/rules_apple/releases/download/3.1.1/rules_apple.3.1.1.tar.gz",
+-            ],
+-        )
+-
+-    if "build_bazel_apple_support" not in native.existing_rules():
+-        http_archive(
+-            name = "build_bazel_apple_support",
+-            sha256 = "cf4d63f39c7ba9059f70e995bf5fe1019267d3f77379c2028561a5d7645ef67c",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/apple_support/releases/download/1.11.1/apple_support.1.11.1.tar.gz",
+-                "https://github.com/bazelbuild/apple_support/releases/download/1.11.1/apple_support.1.11.1.tar.gz",
+-            ],
+-        )
+-
+-    if "com_google_googleapis" not in native.existing_rules():
+-        http_archive(
+-            name = "com_google_googleapis",
+-            sha256 = "5bb6b0253ccf64b53d6c7249625a7e3f6c3bc6402abd52d3778bfa48258703a0",
+-            strip_prefix = "googleapis-2f9af297c84c55c8b871ba4495e01ade42476c92",
+-            build_file = Label("//bazel:googleapis.BUILD"),
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/googleapis/googleapis/archive/2f9af297c84c55c8b871ba4495e01ade42476c92.tar.gz",
+-                "https://github.com/googleapis/googleapis/archive/2f9af297c84c55c8b871ba4495e01ade42476c92.tar.gz",
+-            ],
+-        )
+-
+-    if "bazel_gazelle" not in native.existing_rules():
+-        http_archive(
+-            name = "bazel_gazelle",
+-            sha256 = "d76bf7a60fd8b050444090dfa2837a4eaf9829e1165618ee35dceca5cbdf58d5",
+-            urls = [
+-                "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz",
+-                "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz",
+-            ],
+-        )
+-
+     if "opencensus_proto" not in native.existing_rules():
+         http_archive(
+             name = "opencensus_proto",
+@@ -293,34 +75,6 @@ def grpc_deps():
+             ],
+         )
+ 
+-    # TODO(stanleycheung): remove this when prometheus-cpp AND
+-    #   opentelemetry-cpp cut a new release
+-    # This override is needed because this fix
+-    #   https://github.com/jupp0r/prometheus-cpp/pull/626
+-    #   has not been included in the latest prometheus-cpp release yet.
+-    # We also need opentelemetry-cpp to update their dependency on
+-    #   prometheus-cpp after that fix is released.
+-    # Without the fix, we cannot build the prometheus exporter with bazel 6
+-    if "com_github_jupp0r_prometheus_cpp" not in native.existing_rules():
+-        http_archive(
+-            name = "com_github_jupp0r_prometheus_cpp",
+-            strip_prefix = "prometheus-cpp-b1234816facfdda29845c46696a02998a4af115a",
+-            urls = [
+-                "https://github.com/jupp0r/prometheus-cpp/archive/b123481.zip",
+-            ],
+-        )
+-
+-    if "io_opentelemetry_cpp" not in native.existing_rules():
+-        http_archive(
+-            name = "io_opentelemetry_cpp",
+-            sha256 = "ed681d20a684b7d485a49288e7cfb2d182bf882e5c112c5f2fa3f9e9da2278fc",
+-            strip_prefix = "opentelemetry-cpp-4bd64c9a336fd438d6c4c9dad2e6b61b0585311f",
+-            urls = [
+-                "https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/4bd64c9a336fd438d6c4c9dad2e6b61b0585311f.tar.gz",
+-                "https://github.com/open-telemetry/opentelemetry-cpp/archive/4bd64c9a336fd438d6c4c9dad2e6b61b0585311f.tar.gz",
+-            ],
+-        )
+-
+     if "google_cloud_cpp" not in native.existing_rules():
+         http_archive(
+             name = "google_cloud_cpp",
+@@ -331,8 +85,15 @@ def grpc_deps():
+                 "https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.16.0.tar.gz",
+             ],
+         )
+-
+-    grpc_python_deps()
++    http_archive(
++        name = "com_github_cncf_udpa",
++        sha256 = "0d33b83f8c6368954e72e7785539f0d272a8aba2f6e2e336ed15fd1514bc9899",
++        strip_prefix = "xds-e9ce68804cb4e64cab5a52e3c8baf840d4ff87b7",
++        urls = [
++            "https://storage.googleapis.com/grpc-bazel-mirror/github.com/cncf/xds/archive/e9ce68804cb4e64cab5a52e3c8baf840d4ff87b7.tar.gz",
++            "https://github.com/cncf/xds/archive/e9ce68804cb4e64cab5a52e3c8baf840d4ff87b7.tar.gz",
++        ],
++    )
+ 
+ # TODO: move some dependencies from "grpc_deps" here?
+ # buildifier: disable=unnamed-macro
+@@ -413,3 +174,5 @@ def grpc_test_only_deps():
+             strip_prefix = "libprotobuf-mutator-1f95f8083066f5b38fd2db172e7e7f9aa7c49d2d",
+             build_file = "@com_github_grpc_grpc//third_party:libprotobuf_mutator.BUILD",
+         )
++
++grpc_repo_deps_ext = module_extension(implementation = lambda ctx: grpc_deps())
+diff --git a/bazel/grpc_python_deps.bzl b/bazel/grpc_python_deps.bzl
+index dbfff526a1..8948fc573d 100644
+--- a/bazel/grpc_python_deps.bzl
++++ b/bazel/grpc_python_deps.bzl
+@@ -16,6 +16,18 @@
+ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+ load("@com_github_grpc_grpc//third_party/py:python_configure.bzl", "python_configure")
+ 
++# buildifier: disable=unnamed-macro
++def cython():
++    http_archive(
++        name = "cython",
++        build_file = "@com_github_grpc_grpc//third_party:cython.BUILD",
++        sha256 = "a2da56cc22be823acf49741b9aa3aa116d4f07fa8e8b35a3cb08b8447b37c607",
++        strip_prefix = "cython-0.29.35",
++        urls = [
++            "https://github.com/cython/cython/archive/0.29.35.tar.gz",
++        ],
++    )
++
+ # buildifier: disable=unnamed-macro
+ def grpc_python_deps():
+     """Loads dependencies for gRPC Python."""
+@@ -35,12 +47,6 @@ def grpc_python_deps():
+     )
+ 
+     if "cython" not in native.existing_rules():
+-        http_archive(
+-            name = "cython",
+-            build_file = "@com_github_grpc_grpc//third_party:cython.BUILD",
+-            sha256 = "a2da56cc22be823acf49741b9aa3aa116d4f07fa8e8b35a3cb08b8447b37c607",
+-            strip_prefix = "cython-0.29.35",
+-            urls = [
+-                "https://github.com/cython/cython/archive/0.29.35.tar.gz",
+-            ],
+-        )
++        cython()
++
++grpc_python_deps_ext = module_extension(implementation = lambda ctx: cython())
+diff --git a/bazel/python_rules.bzl b/bazel/python_rules.bzl
+index e195d2790b..5924fd5b5e 100644
+--- a/bazel/python_rules.bzl
++++ b/bazel/python_rules.bzl
+@@ -190,11 +190,7 @@ def _generate_pb2_grpc_src_impl(context):
+     arguments = []
+     tools = [context.executable._protoc, context.executable._grpc_plugin]
+     out_dir = get_out_dir(protos, context)
+-    if out_dir.import_path:
+-        # is virtual imports
+-        out_path = out_dir.path
+-    else:
+-        out_path = context.genfiles_dir.path
++    out_path = out_dir.path
+     arguments += get_plugin_args(
+         context.executable._grpc_plugin,
+         plugin_flags,
diff --git a/modules/grpc/1.65.0.bcr.1/patches/bzlmod-fixes.patch b/modules/grpc/1.65.0.bcr.1/patches/bzlmod-fixes.patch
new file mode 100644
index 0000000..cb8e3db
--- /dev/null
+++ b/modules/grpc/1.65.0.bcr.1/patches/bzlmod-fixes.patch
@@ -0,0 +1,21 @@
+diff --git a/bazel/cc_grpc_library.bzl b/bazel/cc_grpc_library.bzl
+index 55ea11cd53..8177bf864c 100644
+--- a/bazel/cc_grpc_library.bzl
++++ b/bazel/cc_grpc_library.bzl
+@@ -102,7 +102,7 @@ def cc_grpc_library(
+         generate_cc(
+             name = codegen_grpc_target,
+             srcs = proto_targets,
+-            plugin = "@com_github_grpc_grpc//src/compiler:grpc_cpp_plugin",
++            plugin = Label("//src/compiler:grpc_cpp_plugin"),
+             well_known_protos = well_known_protos,
+             generate_mocks = generate_mocks,
+             **kwargs
+@@ -114,6 +114,6 @@ def cc_grpc_library(
+             hdrs = [":" + codegen_grpc_target],
+             deps = deps +
+                    extra_deps +
+-                   ["@com_github_grpc_grpc//:grpc++_codegen_proto"],
++                   [Label("//:grpc++_codegen_proto")],
+             **kwargs
+         )
diff --git a/modules/grpc/1.65.0.bcr.1/patches/disable-layering-check.patch b/modules/grpc/1.65.0.bcr.1/patches/disable-layering-check.patch
new file mode 100644
index 0000000..e6de461
--- /dev/null
+++ b/modules/grpc/1.65.0.bcr.1/patches/disable-layering-check.patch
@@ -0,0 +1,13 @@
+diff --git a/src/core/BUILD b/src/core/BUILD
+index 757aaad95b..de60930421 100644
+--- a/src/core/BUILD
++++ b/src/core/BUILD
+@@ -25,7 +25,7 @@ licenses(["reciprocal"])
+ package(
+     default_visibility = ["//:__subpackages__"],
+     features = [
+-        "layering_check",
++        "-layering_check",
+     ],
+ )
+ 
diff --git a/modules/grpc/1.65.0.bcr.1/presubmit.yml b/modules/grpc/1.65.0.bcr.1/presubmit.yml
new file mode 100644
index 0000000..b7b9f33
--- /dev/null
+++ b/modules/grpc/1.65.0.bcr.1/presubmit.yml
@@ -0,0 +1,33 @@
+matrix:
+  platform: ["debian10", "ubuntu2004"]
+  bazel:
+  - 7.x
+
+tasks:
+  verify_targets:
+    platform: ${{ platform }}
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@grpc//:grpc'
+    - '@grpc//:grpc_unsecure'
+    - '@grpc//:grpc++'
+    - '@grpc//:grpc++_unsecure'
+    - '@grpc//examples/protos/...'
+
+  verify_windows:
+    platform: windows
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@grpc//:grpc'
+    - '@grpc//:grpc_unsecure'
+    - '@grpc//:grpc++'
+    - '@grpc//:grpc++_unsecure'
+
+  verify_macos:
+    platform: macos
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@grpc//:grpc'
+    - '@grpc//:grpc_unsecure'
+    - '@grpc//:grpc++'
+    - '@grpc//:grpc++_unsecure'
diff --git a/modules/grpc/1.65.0.bcr.1/source.json b/modules/grpc/1.65.0.bcr.1/source.json
new file mode 100644
index 0000000..f4af46c
--- /dev/null
+++ b/modules/grpc/1.65.0.bcr.1/source.json
@@ -0,0 +1,14 @@
+{
+    "integrity": "sha256-68Os/ecM+uP08EuNu3IllUDLHcQnvjYlafvCYH2r/jk=",
+    "strip_prefix": "grpc-1.65.0",
+    "url": "https://github.com/grpc/grpc/archive/refs/tags/v1.65.0.tar.gz",
+    "patch_strip": 1,
+    "patches": {
+        "adopt_bzlmod.patch": "sha256-xj3GrXJKe+M3L/Jukz8a4eRTcnSuKIIwh8BnyTomNRw=",
+        "disable-layering-check.patch": "sha256-v3IG7eZiEgWJ7hoaE1zRvXdSEjxbfPFIEIZrTEwt4IU=",
+        "bzlmod-fixes.patch": "sha256-zb2k52jkldXmDIcMBmnrOEDcLZD+LilSPLFBQTHDcsY="
+    },
+    "overlay": {
+        "MODULE.bazel": "sha256-+dYsROvSdbAOUFbATT7GkDcS5mYboT+3fTPkpYunZt8="
+    }
+}
diff --git a/modules/grpc/metadata.json b/modules/grpc/metadata.json
index b106ed6..c166176 100644
--- a/modules/grpc/metadata.json
+++ b/modules/grpc/metadata.json
@@ -23,7 +23,8 @@
         "1.62.1.bcr.2",
         "1.63.1",
         "1.63.1.bcr.1",
-        "1.65.0"
+        "1.65.0",
+        "1.65.0.bcr.1"
     ],
     "yanked_versions": {}
 }
diff --git a/modules/xds/0.0.0-20240423-555b57e.bcr.1/MODULE.bazel b/modules/xds/0.0.0-20240423-555b57e.bcr.1/MODULE.bazel
new file mode 100644
index 0000000..f511ba4
--- /dev/null
+++ b/modules/xds/0.0.0-20240423-555b57e.bcr.1/MODULE.bazel
@@ -0,0 +1,28 @@
+module(
+    name = "xds",
+    version = "0.0.0-20240423-555b57e.bcr.1",
+)
+
+bazel_dep(name = "bazel_skylib", version = "1.5.0")
+bazel_dep(name = "cel-spec", version = "0.15.0", repo_name = "dev_cel")
+bazel_dep(name = "gazelle", version = "0.36.0", repo_name = "bazel_gazelle")
+bazel_dep(name = "googleapis", version = "0.0.0-20240326-1c8d509c5.bcr.1", repo_name = "com_google_googleapis")
+bazel_dep(name = "grpc", version = "1.65.0.bcr.1", repo_name = "com_github_grpc_grpc")
+bazel_dep(name = "protobuf", version = "27.0-rc2", repo_name = "com_google_protobuf")
+bazel_dep(name = "protoc-gen-validate", version = "1.0.4", repo_name = "com_envoyproxy_protoc_gen_validate")
+bazel_dep(name = "re2", version = "2024-05-01", repo_name = "com_googlesource_code_re2")
+bazel_dep(name = "rules_go", version = "0.48.0", repo_name = "io_bazel_rules_go")
+bazel_dep(name = "rules_proto", version = "6.0.0")
+
+go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk")
+go_sdk.download(version = "1.20.2")
+
+go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps")
+go_deps.from_file(go_mod = "//go:go.mod")
+use_repo(
+    go_deps,
+    "org_golang_google_genproto_googleapis_api",
+    "org_golang_google_genproto_googleapis_rpc",
+    "org_golang_google_grpc",
+    "org_golang_google_protobuf",
+)
diff --git a/modules/xds/0.0.0-20240423-555b57e.bcr.1/patches/bzlmod.patch b/modules/xds/0.0.0-20240423-555b57e.bcr.1/patches/bzlmod.patch
new file mode 100644
index 0000000..dcbe3f1
--- /dev/null
+++ b/modules/xds/0.0.0-20240423-555b57e.bcr.1/patches/bzlmod.patch
@@ -0,0 +1,41 @@
+--- /dev/null
++++ b/MODULE.bazel
+@@ -0,0 +1,28 @@
++module(
++    name = "xds",
++    version = "0.0.0-20240423-555b57e.bcr.1",
++)
++
++bazel_dep(name = "bazel_skylib", version = "1.5.0")
++bazel_dep(name = "cel-spec", version = "0.15.0", repo_name = "dev_cel")
++bazel_dep(name = "gazelle", version = "0.36.0", repo_name = "bazel_gazelle")
++bazel_dep(name = "googleapis", version = "0.0.0-20240326-1c8d509c5.bcr.1", repo_name = "com_google_googleapis")
++bazel_dep(name = "grpc", version = "1.65.0.bcr.1", repo_name = "com_github_grpc_grpc")
++bazel_dep(name = "protobuf", version = "27.0-rc2", repo_name = "com_google_protobuf")
++bazel_dep(name = "protoc-gen-validate", version = "1.0.4", repo_name = "com_envoyproxy_protoc_gen_validate")
++bazel_dep(name = "re2", version = "2024-05-01", repo_name = "com_googlesource_code_re2")
++bazel_dep(name = "rules_go", version = "0.48.0", repo_name = "io_bazel_rules_go")
++bazel_dep(name = "rules_proto", version = "6.0.0")
++
++go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk")
++go_sdk.download(version = "1.20.2")
++
++go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps")
++go_deps.from_file(go_mod = "//go:go.mod")
++use_repo(
++    go_deps,
++    "org_golang_google_genproto_googleapis_api",
++    "org_golang_google_genproto_googleapis_rpc",
++    "org_golang_google_grpc",
++    "org_golang_google_protobuf",
++)
+
+--- /dev/null
++++ b/go/BUILD
+@@ -0,0 +1 @@
++# Empty package
+
+--- /dev/null
++++ b/WORKSPACE.bzlmod
+@@ -0,0 +1 @@
++# Empty
diff --git a/modules/xds/0.0.0-20240423-555b57e.bcr.1/presubmit.yml b/modules/xds/0.0.0-20240423-555b57e.bcr.1/presubmit.yml
new file mode 100644
index 0000000..9d0c5ea
--- /dev/null
+++ b/modules/xds/0.0.0-20240423-555b57e.bcr.1/presubmit.yml
@@ -0,0 +1,32 @@
+matrix:
+  platform: ["macos", "ubuntu2004"]
+  bazel: ["7.x"]
+tasks:
+  verify_targets:
+    platform: ${{ platform }}
+    bazel: ${{ bazel }}
+    build_targets:
+    - '@xds//xds/type/v3:pkg'
+    build_flags:
+    - '--host_cxxopt=-Wno-error'
+    - '--cxxopt=-Wno-error'
+    - '--cxxopt=-Wno-deprecated-declarations'
+bcr_test_module:
+  module_path: "."
+  matrix:
+    platform:
+      - macos
+      - ubuntu2004
+    bazel:
+      - 7.x
+  tasks:
+    run_test_module:
+      name: Run test module
+      platform: ${{ platform }}
+      bazel: ${{ bazel }}
+      test_targets:
+        - //...
+      build_flags:
+      - '--host_cxxopt=-Wno-error'
+      - '--cxxopt=-Wno-error'
+      - '--cxxopt=-Wno-deprecated-declarations'
diff --git a/modules/xds/0.0.0-20240423-555b57e.bcr.1/source.json b/modules/xds/0.0.0-20240423-555b57e.bcr.1/source.json
new file mode 100644
index 0000000..8429b46
--- /dev/null
+++ b/modules/xds/0.0.0-20240423-555b57e.bcr.1/source.json
@@ -0,0 +1,9 @@
+{
+    "integrity": "sha256-DIxPD2f+2We1EEn31eLKepvUM5cKKciOJyyGZTKBcvU=",
+    "strip_prefix": "xds-555b57ec207be86f811fb0c04752db6f85e3d7e2",
+    "url": "https://github.com/cncf/xds/archive/555b57ec207be86f811fb0c04752db6f85e3d7e2.tar.gz",
+    "patch_strip": 1,
+    "patches": {
+        "bzlmod.patch": "sha256-iOL43welk+BAwwvrZtnynm8Z7HJPmfeUtAt9cmklWw8="
+    }
+}
diff --git a/modules/xds/metadata.json b/modules/xds/metadata.json
index 030888c..33bab9c 100644
--- a/modules/xds/metadata.json
+++ b/modules/xds/metadata.json
@@ -1,16 +1,17 @@
 {
-  "homepage": "https://github.com/cncf/xds",
-  "maintainers": [
-    {
-      "email": "bcr-maintainers@bazel.build",
-      "name": "No Maintainer Specified"
-    }
-  ],
-  "repository": [
-    "github:cncf/xds"
-  ],
-  "versions": [
-    "0.0.0-20240423-555b57e"
-  ],
-  "yanked_versions": {}
+    "homepage": "https://github.com/cncf/xds",
+    "maintainers": [
+        {
+            "email": "bcr-maintainers@bazel.build",
+            "name": "No Maintainer Specified"
+        }
+    ],
+    "repository": [
+        "github:cncf/xds"
+    ],
+    "versions": [
+        "0.0.0-20240423-555b57e",
+        "0.0.0-20240423-555b57e.bcr.1"
+    ],
+    "yanked_versions": {}
 }