Remove all autotools usage (#10132)

* Bazelfying conformance tests

Adding infrastructure to "Bazelify" languages other than Java and C++

* Delete benchmarks for languages supported by other repositories

* Bazelfying benchmark tests

* Bazelfying python

Use upb's system python rule instead of branching tensorflow

* Bazelfying Ruby

* Bazelfying C#

* Bazelfying Objective-c

* Bazelfying Kokoro mac builds

* Bazelfying Kokoro linux builds

* Deleting all deprecated files from autotools cleanup

This boils down to Makefile.am and tests.sh and all of their remaining references

* Cleanup after PR reorganizing

- Enable 32 bit tests
- Move conformance tests back
- Use select statements to select alternate runtimes
- Add internal prefixes to proto library macros

* Updating READMEs to use bazel instead of autotools.

* Bazelfying Kokoro release builds

* First round of review fixes

* Second round of review fixes

* Third round of review fixes

* Filtering out conformance tests from Bazel on Windows (b/241484899)

* Add version metadata that was previously scraped from configure.ac

* fixing typo from previous fix

* Adding ruby version tests

* Bumping pinned upb version, and adding tests to python CI
diff --git a/.gitignore b/.gitignore
index cc881f3..ea95cc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,24 +1,3 @@
-# autogen.sh-generated files
-Makefile.in
-src/Makefile.in
-config.guess
-config.h.in
-config.sub
-configure
-depcomp
-install-sh
-ltmain.sh
-missing
-configure~
-
-aclocal.m4
-m4/libtool.m4
-m4/ltoptions.m4
-m4/ltsugar.m4
-m4/ltversion.m4
-m4/lt~obsolete.m4
-autom4te.cache
-
 # CMake-generated files
 .ninja_deps
 .ninja_logs
@@ -40,8 +19,6 @@
 /gmock
 
 # in-tree configure-generated files
-Makefile
-src/Makefile
 /config.h
 config.log
 config.status
@@ -56,7 +33,6 @@
 *.o
 *.lo
 *.la
-src/.libs
 *.so
 *.a
 
@@ -79,8 +55,6 @@
 python/docs/_build/
 
 src/js_embed
-src/protoc
-src/unittest_proto_middleman
 
 # vim generated
 *.swp
diff --git a/BUILD.bazel b/BUILD.bazel
index a14476a..3734b49 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -6,7 +6,7 @@
 load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain", "proto_library")
 load("@rules_java//java:defs.bzl", "java_binary", "java_lite_proto_library", "java_proto_library")
 load("//build_defs:cpp_opts.bzl", "COPTS", "LINK_OPTS", "PROTOC_LINK_OPTS")
-load(":protobuf.bzl", "py_proto_library")
+load(":protobuf.bzl", "internal_py_proto_library", "internal_php_proto_library", "internal_ruby_proto_library", "internal_objc_proto_library")
 
 licenses(["notice"])
 
@@ -145,6 +145,16 @@
     visibility = ["//visibility:public"],
 )
 
+internal_ruby_proto_library(
+    name = "well_known_ruby_protos",
+    srcs = [":well_known_protos"],
+    includes = ["src"],
+    visibility = [
+        "//conformance:__pkg__",
+        "//ruby:__subpackages__",
+    ],
+)
+
 ################################################################################
 # Protocol Buffers Compiler
 ################################################################################
@@ -302,6 +312,10 @@
     visibility = ["//visibility:public"],
 )
 
+################################################################################
+# Objective-C support
+################################################################################
+
 alias(
     name = "objectivec",
     actual = "//objectivec",
@@ -355,7 +369,7 @@
     deps = ["//src/google/protobuf:generic_test_protos"],
 )
 
-py_proto_library(
+internal_py_proto_library(
     name = "generated_protos_py",
     testonly = 1,
     srcs = [":generated_protos"],
@@ -368,22 +382,22 @@
 # Conformance tests
 ################################################################################
 
-alias(
-    name = "conformance_test_runner",
-    actual = "//conformance:conformance_test_runner",
-    visibility = ["//visibility:public"],
+cc_proto_library(
+    name = "test_messages_proto2_cc_proto",
+    visibility = [
+        "//conformance:__pkg__",
+        "//src:__subpackages__",
+    ],
+    deps = ["//src/google/protobuf:test_messages_proto2_proto"],
 )
 
-alias(
-    name = "test_messages_proto2_proto",
-    actual = "//src/google/protobuf:test_messages_proto2_proto",  # proto_library
-    visibility = ["//visibility:public"],
-)
-
-alias(
-    name = "test_messages_proto3_proto",
-    actual = "//src/google/protobuf:test_messages_proto3_proto",  # proto_library
-    visibility = ["//visibility:public"],
+cc_proto_library(
+    name = "test_messages_proto3_cc_proto",
+    visibility = [
+        "//conformance:__pkg__",
+        "//src:__subpackages__",
+    ],
+    deps = ["//src/google/protobuf:test_messages_proto3_proto"],
 )
 
 java_proto_library(
@@ -392,7 +406,7 @@
         "//conformance:__pkg__",
         "//java:__subpackages__",
     ],
-    deps = [":test_messages_proto2_proto"],
+    deps = ["//src/google/protobuf:test_messages_proto2_proto"],
 )
 
 java_proto_library(
@@ -401,7 +415,7 @@
         "//conformance:__pkg__",
         "//java:__subpackages__",
     ],
-    deps = [":test_messages_proto3_proto"],
+    deps = ["//src/google/protobuf:test_messages_proto3_proto"],
 )
 
 java_lite_proto_library(
@@ -410,7 +424,7 @@
         "//conformance:__pkg__",
         "//java:__subpackages__",
     ],
-    deps = [":test_messages_proto2_proto"],
+    deps = ["//src/google/protobuf:test_messages_proto2_proto"],
 )
 
 java_lite_proto_library(
@@ -419,7 +433,77 @@
         "//conformance:__pkg__",
         "//java:__subpackages__",
     ],
-    deps = [":test_messages_proto3_proto"],
+    deps = ["//src/google/protobuf:test_messages_proto3_proto"],
+)
+
+internal_objc_proto_library(
+    name = "test_messages_proto2_objc_proto",
+    srcs = ["//src/google/protobuf:test_messages_proto2.proto"],
+    includes = ["src/google/protobuf"],
+    testonly = 1,
+    visibility = [
+        "//conformance:__pkg__",
+        "//objectivec:__subpackages__",
+    ],
+)
+
+internal_objc_proto_library(
+    name = "test_messages_proto3_objc_proto",
+    srcs = ["//src/google/protobuf:test_messages_proto3.proto"],
+    proto_deps = [":well_known_protos"],
+    includes = ["src/google/protobuf", "src"],
+    testonly = 1,
+    visibility = [
+        "//conformance:__pkg__",
+        "//objectivec:__subpackages__",
+    ],
+)
+
+internal_php_proto_library(
+    name = "test_messages_proto3_php_proto",
+    srcs = ["//src/google/protobuf:test_messages_proto3.proto"],
+    proto_deps = [":well_known_protos"],
+    includes = ["src/google/protobuf", "src"],
+    outs = [
+        "Protobuf_test_messages/Proto3/EnumOnlyProto3.php",
+        "Protobuf_test_messages/Proto3/EnumOnlyProto3/PBBool.php",
+        "Protobuf_test_messages/Proto3/ForeignEnum.php",
+        "Protobuf_test_messages/Proto3/ForeignMessage.php",
+        "Protobuf_test_messages/Proto3/NullHypothesisProto3.php",
+        "Protobuf_test_messages/Proto3/TestAllTypesProto3.php",
+        "Protobuf_test_messages/Proto3/TestAllTypesProto3/AliasedEnum.php",
+        "Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php",
+        "Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php",
+        "GPBMetadata/TestMessagesProto3.php",
+    ],
+    testonly = 1,
+    visibility = [
+        "//conformance:__pkg__",
+        "//php:__subpackages__",
+    ],
+)
+
+internal_ruby_proto_library(
+    name = "test_messages_proto2_ruby_proto",
+    srcs = ["//src/google/protobuf:test_messages_proto2.proto"],
+    includes = ["src/google/protobuf"],
+    testonly = 1,
+    visibility = [
+        "//conformance:__pkg__",
+        "//ruby:__subpackages__",
+    ],
+)
+
+internal_ruby_proto_library(
+    name = "test_messages_proto3_ruby_proto",
+    srcs = ["//src/google/protobuf:test_messages_proto3.proto"],
+    proto_deps = [":well_known_protos"],
+    includes = ["src/google/protobuf", "src"],
+    testonly = 1,
+    visibility = [
+        "//conformance:__pkg__",
+        "//ruby:__subpackages__",
+    ],
 )
 
 filegroup(
@@ -441,22 +525,6 @@
             "cmake/*.cmake",
             "cmake/*.in",
             "editors/*",
-
-            # Several of these files are generated by autogen.sh, so using
-            # glob() lets us ignore them if they are missing. (This is not good
-            # practice, though.)
-            "Makefile.in",
-            "aclocal.m4",
-            "ar-lib",
-            "compile",
-            "config*",
-            "depcomp",
-            "install-sh",
-            "ltmain.sh",
-            "m4/*.m4",
-            "missing",
-            "protobuf*.pc.in",
-            "test-driver",
         ],
         allow_empty = True,
     ) + [
@@ -465,10 +533,8 @@
         "CMakeLists.txt",
         "CONTRIBUTORS.txt",
         "LICENSE",
-        "Makefile.am",
         "README.md",
         "WORKSPACE",
-        "autogen.sh",
         "cmake/CMakeLists.txt",
         "cmake/README.md",
         "cmake/update_file_lists.sh",
@@ -476,7 +542,6 @@
         "maven_install.json",
         "//third_party:BUILD.bazel",
         "//third_party:zlib.BUILD",
-        "//util/python:BUILD.bazel",
     ],
     strip_prefix = strip_prefix.from_root(""),
     visibility = ["//pkg:__pkg__"],
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d5d2009..345d7d0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -79,6 +79,11 @@
 # User options
 include(${protobuf_SOURCE_DIR}/cmake/protobuf-options.cmake)
 
+# Version metadata
+set(protobuf_VERSION_STRING "3.21.4")
+set(protobuf_DESCRIPTION "Protocol Buffers")
+set(protobuf_CONTACT "protobuf@googlegroups.com")
+
 # Overrides for option dependencies
 if (protobuf_BUILD_PROTOC_BINARIES OR protobuf_BUILD_TESTS)
   set(protobuf_BUILD_LIBPROTOC ON)
@@ -86,23 +91,6 @@
 if (NOT protobuf_BUILD_PROTOBUF_BINARIES)
   set(protobuf_INSTALL OFF)
 endif()
-# Path to main configure script
-set(protobuf_CONFIGURE_SCRIPT "${protobuf_SOURCE_DIR}/configure.ac")
-
-# Parse configure script
-set(protobuf_AC_INIT_REGEX
-  "^AC_INIT\\(\\[([^]]+)\\],\\[([^]]+)\\],\\[([^]]+)\\],\\[([^]]+)\\]\\)$")
-file(STRINGS "${protobuf_CONFIGURE_SCRIPT}" protobuf_AC_INIT_LINE
-  LIMIT_COUNT 1 REGEX "^AC_INIT")
-# Description
-string(REGEX REPLACE        "${protobuf_AC_INIT_REGEX}" "\\1"
-    protobuf_DESCRIPTION    "${protobuf_AC_INIT_LINE}")
-# Version
-string(REGEX REPLACE        "${protobuf_AC_INIT_REGEX}" "\\2"
-    protobuf_VERSION_STRING "${protobuf_AC_INIT_LINE}")
-# Contact
-string(REGEX REPLACE        "${protobuf_AC_INIT_REGEX}" "\\3"
-    protobuf_CONTACT        "${protobuf_AC_INIT_LINE}")
 # Parse version tweaks
 set(protobuf_VERSION_REGEX "^([0-9]+)\\.([0-9]+)\\.([0-9]+)([-]rc[-]|\\.)?([0-9]*)$")
 string(REGEX REPLACE     "${protobuf_VERSION_REGEX}" "\\1"
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100644
index acc72c2..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,1294 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-ACLOCAL_AMFLAGS = -I m4
-
-AUTOMAKE_OPTIONS = foreign
-
-# Build . before src so that our all-local and clean-local hooks kicks in at
-# the right time.
-SUBDIRS = . src
-
-# Always include third_party directories in distributions.
-#
-# Note that distribution artifacts will be produced by Bazel in the future.
-# See pkg/BUILD.bazel for overall definitions.
-DIST_SUBDIRS = src conformance benchmarks third_party/googletest
-
-# Build gmock before we build protobuf tests.  We don't add gmock to SUBDIRS
-# because then "make check" would also build and run all of gmock's own tests,
-# which takes a lot of time and is generally not useful to us.  Also, we don't
-# want "make install" to recurse into gmock since we don't want to overwrite
-# the installed version of gmock if there is one.
-check-local:
-	@echo "Making lib/libgmock.a lib/libgmock_main.a in gmock"
-	@cd third_party/googletest/googletest && $(MAKE) $(AM_MAKEFLAGS) lib/libgtest.la lib/libgtest_main.la
-	@cd third_party/googletest/googlemock && $(MAKE) $(AM_MAKEFLAGS) lib/libgmock.la lib/libgmock_main.la
-
-# We would like to clean gmock when "make clean" is invoked.  But we have to
-# be careful because clean-local is also invoked during "make distclean", but
-# "make distclean" already recurses into gmock because it's listed among the
-# DIST_SUBDIRS.  distclean will delete gmock/Makefile, so if we then try to
-# cd to the directory again and "make clean" it will fail.  So, check that the
-# Makefile exists before recursing.
-clean-local:
-	@if test -e third_party/googletest/Makefile; then \
-	  echo "Making clean in googletest"; \
-	  cd third_party/googletest && $(MAKE) $(AM_MAKEFLAGS) clean; \
-	fi; \
-	if test -e conformance/Makefile; then \
-	  echo "Making clean in conformance"; \
-	  cd conformance && $(MAKE) $(AM_MAKEFLAGS) clean; \
-	fi; \
-	if test -e benchmarks/Makefile; then \
-	  echo "Making clean in benchmarks"; \
-	  cd benchmarks && $(MAKE) $(AM_MAKEFLAGS) clean; \
-	fi; \
-	if test -e objectivec/DevTools; then \
-	  echo "Cleaning any ObjC pyc files"; \
-	  rm -f objectivec/DevTools/*.pyc; \
-	fi
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = protobuf.pc protobuf-lite.pc
-
-# Note: please keep this in sync with the dist_files rule in csharp/BUILD.bazel.
-csharp_EXTRA_DIST=                                                           \
-  global.json                                                                \
-  csharp/.editorconfig                                                       \
-  csharp/.gitignore                                                          \
-  csharp/CHANGES.txt                                                         \
-  csharp/Google.Protobuf.Tools.targets                                       \
-  csharp/Google.Protobuf.Tools.nuspec                                        \
-  csharp/NuGet.Config                                                        \
-  csharp/README.md                                                           \
-  csharp/build_packages.bat                                                  \
-  csharp/build_release.sh                                                    \
-  csharp/build_tools.sh                                                      \
-  csharp/buildall.bat                                                        \
-  csharp/buildall.sh                                                         \
-  csharp/generate_protos.sh                                                  \
-  csharp/install_dotnet_sdk.ps1                                              \
-  csharp/keys/Google.Protobuf.public.snk                                     \
-  csharp/keys/Google.Protobuf.snk                                            \
-  csharp/keys/README.md                                                      \
-  csharp/protos/README.md                                                    \
-  csharp/protos/map_unittest_proto3.proto                                    \
-  csharp/protos/old_extensions1.proto                                        \
-  csharp/protos/old_extensions2.proto                                        \
-  csharp/protos/unittest_issue6936_a.proto                                   \
-  csharp/protos/unittest_issue6936_b.proto                                   \
-  csharp/protos/unittest_issue6936_c.proto                                   \
-  csharp/protos/unittest_custom_options_proto3.proto                         \
-  csharp/protos/unittest_import_public_proto3.proto                          \
-  csharp/protos/unittest_import_public.proto                                 \
-  csharp/protos/unittest_import_proto3.proto                                 \
-  csharp/protos/unittest_import.proto                                        \
-  csharp/protos/unittest_issues.proto                                        \
-  csharp/protos/unittest_proto3.proto                                        \
-  csharp/protos/unittest_selfreferential_options.proto                       \
-  csharp/protos/unittest.proto                                               \
-  csharp/src/AddressBook/AddPerson.cs                                        \
-  csharp/src/AddressBook/Addressbook.cs                                      \
-  csharp/src/AddressBook/AddressBook.csproj                                  \
-  csharp/src/AddressBook/ListPeople.cs                                       \
-  csharp/src/AddressBook/Program.cs                                          \
-  csharp/src/AddressBook/SampleUsage.cs                                      \
-  csharp/src/Directory.Build.props                                           \
-  csharp/src/Google.Protobuf.Benchmarks/BenchmarkDatasetConfig.cs            \
-  csharp/src/Google.Protobuf.Benchmarks/BenchmarkMessage1Proto3.cs           \
-  csharp/src/Google.Protobuf.Benchmarks/Benchmarks.cs                        \
-  csharp/src/Google.Protobuf.Benchmarks/ByteStringBenchmark.cs               \
-  csharp/src/Google.Protobuf.Benchmarks/Google.Protobuf.Benchmarks.csproj    \
-  csharp/src/Google.Protobuf.Benchmarks/GoogleMessageBenchmark.cs            \
-  csharp/src/Google.Protobuf.Benchmarks/ParseMessagesBenchmark.cs            \
-  csharp/src/Google.Protobuf.Benchmarks/ParseRawPrimitivesBenchmark.cs       \
-  csharp/src/Google.Protobuf.Benchmarks/Program.cs                           \
-  csharp/src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto     \
-  csharp/src/Google.Protobuf.Benchmarks/WrapperBenchmarkMessages.cs          \
-  csharp/src/Google.Protobuf.Benchmarks/WriteMessagesBenchmark.cs            \
-  csharp/src/Google.Protobuf.Benchmarks/WriteRawPrimitivesBenchmark.cs       \
-  csharp/src/Google.Protobuf.Conformance/Conformance.cs                      \
-  csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj  \
-  csharp/src/Google.Protobuf.Conformance/Program.cs                          \
-  csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj        \
-  csharp/src/Google.Protobuf.JsonDump/Program.cs                             \
-  csharp/src/Google.Protobuf.Test/Buffers/ArrayBufferWriter.cs               \
-  csharp/src/Google.Protobuf.Test/ByteStringTest.cs                          \
-  csharp/src/Google.Protobuf.Test/CodedInputStreamExtensions.cs              \
-  csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs                    \
-  csharp/src/Google.Protobuf.Test/CodedOutputStreamTest.cs                   \
-  csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs                \
-  csharp/src/Google.Protobuf.Test/Collections/ProtobufEqualityComparersTest.cs \
-  csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs           \
-  csharp/src/Google.Protobuf.Test/Compatibility/PropertyInfoExtensionsTest.cs \
-  csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs        \
-  csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs                    \
-  csharp/src/Google.Protobuf.Test/EqualityTester.cs                          \
-  csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs                        \
-  csharp/src/Google.Protobuf.Test/FieldCodecTest.cs                          \
-  csharp/src/Google.Protobuf.Test/FieldMaskTreeTest.cs                       \
-  csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs                    \
-  csharp/src/Google.Protobuf.Test/GeneratedMessageTest.Proto2.cs             \
-  csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj                \
-  csharp/src/Google.Protobuf.Test/IssuesTest.cs                              \
-  csharp/src/Google.Protobuf.Test/JsonFormatterSettingsTest.cs               \
-  csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs                       \
-  csharp/src/Google.Protobuf.Test/JsonParserTest.cs                          \
-  csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs                       \
-  csharp/src/Google.Protobuf.Test/LegacyGeneratedCodeTest.cs                 \
-  csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs                   \
-  csharp/src/Google.Protobuf.Test/ParsingPrimitivesTest.cs                   \
-  csharp/src/Google.Protobuf.Test/Proto3OptionalTest.cs                      \
-  csharp/src/Google.Protobuf.Test/ReadOnlySequenceFactory.cs                 \
-  csharp/src/Google.Protobuf.Test/RefStructCompatibilityTest.cs              \
-  csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs            \
-  csharp/src/Google.Protobuf.Test/Reflection/DescriptorDeclarationTest.cs    \
-  csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs              \
-  csharp/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs              \
-  csharp/src/Google.Protobuf.Test/Reflection/TypeRegistryTest.cs             \
-  csharp/src/Google.Protobuf.Test/SampleEnum.cs                              \
-  csharp/src/Google.Protobuf.Test/SampleMessages.cs                          \
-  csharp/src/Google.Protobuf.Test/SampleNaNs.cs                              \
-  csharp/src/Google.Protobuf.Test/TestCornerCases.cs                         \
-  csharp/src/Google.Protobuf.Test.TestProtos/Google.Protobuf.Test.TestProtos.csproj \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936A.cs              \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936B.cs              \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssue6936C.cs              \
-  csharp/src/Google.Protobuf.Test.TestProtos/ForeignMessagePartial.cs           \
-  csharp/src/Google.Protobuf.Test.TestProtos/MapUnittestProto3.cs               \
-  csharp/src/Google.Protobuf.Test.TestProtos/OldExtensions1.cs                  \
-  csharp/src/Google.Protobuf.Test.TestProtos/OldExtensions2.cs                  \
-  csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto2.cs              \
-  csharp/src/Google.Protobuf.Test.TestProtos/TestMessagesProto3.cs              \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestCustomOptionsProto3.cs     \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportProto3.cs            \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportPublicProto3.cs      \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestImportPublic.cs            \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestImport.cs                  \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestIssues.cs                  \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestProto3.cs                  \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestProto3Optional.cs          \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestSelfreferentialOptions.cs  \
-  csharp/src/Google.Protobuf.Test.TestProtos/UnittestWellKnownTypes.cs          \
-  csharp/src/Google.Protobuf.Test.TestProtos/Unittest.cs                        \
-  csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs                  \
-  csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs             \
-  csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs            \
-  csharp/src/Google.Protobuf.Test/WellKnownTypes/TimestampTest.cs            \
-  csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs             \
-  csharp/src/Google.Protobuf.Test/WritingPrimitivesTest.cs                   \
-  csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs                     \
-  csharp/src/Google.Protobuf.Test/testprotos.pb                              \
-  csharp/src/Google.Protobuf.sln                                             \
-  csharp/src/Google.Protobuf/ByteArray.cs                                    \
-  csharp/src/Google.Protobuf/ByteString.cs                                   \
-  csharp/src/Google.Protobuf/ByteStringAsync.cs                              \
-  csharp/src/Google.Protobuf/CodedInputStream.cs                             \
-  csharp/src/Google.Protobuf/CodedOutputStream.ComputeSize.cs                \
-  csharp/src/Google.Protobuf/CodedOutputStream.cs                            \
-  csharp/src/Google.Protobuf/Collections/Lists.cs                            \
-  csharp/src/Google.Protobuf/Collections/MapField.cs                         \
-  csharp/src/Google.Protobuf/Collections/ProtobufEqualityComparers.cs        \
-  csharp/src/Google.Protobuf/Collections/RepeatedField.cs                    \
-  csharp/src/Google.Protobuf/Compatibility/DynamicallyAccessedMembersAttribute.cs \
-  csharp/src/Google.Protobuf/Compatibility/DynamicallyAccessedMemberTypes.cs \
-  csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs         \
-  csharp/src/Google.Protobuf/Compatibility/RequiresUnreferencedCodeAttribute.cs \
-  csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs                 \
-  csharp/src/Google.Protobuf/Compatibility/UnconditionalSuppressMessageAttribute.cs \
-  csharp/src/Google.Protobuf/Compiler/Plugin.cs                              \
-  csharp/src/Google.Protobuf/Extension.cs                                    \
-  csharp/src/Google.Protobuf/ExtensionRegistry.cs                            \
-  csharp/src/Google.Protobuf/ExtensionSet.cs                                 \
-  csharp/src/Google.Protobuf/ExtensionValue.cs                               \
-  csharp/src/Google.Protobuf/FieldCodec.cs                                   \
-  csharp/src/Google.Protobuf/FieldMaskTree.cs                                \
-  csharp/src/Google.Protobuf/FrameworkPortability.cs                         \
-  csharp/src/Google.Protobuf/Google.Protobuf.csproj                          \
-  csharp/src/Google.Protobuf/IBufferMessage.cs                               \
-  csharp/src/Google.Protobuf/ICustomDiagnosticMessage.cs                     \
-  csharp/src/Google.Protobuf/IDeepCloneable.cs                               \
-  csharp/src/Google.Protobuf/IExtendableMessage.cs                           \
-  csharp/src/Google.Protobuf/IMessage.cs                                     \
-  csharp/src/Google.Protobuf/InvalidJsonException.cs                         \
-  csharp/src/Google.Protobuf/InvalidProtocolBufferException.cs               \
-  csharp/src/Google.Protobuf/JsonFormatter.cs                                \
-  csharp/src/Google.Protobuf/JsonParser.cs                                   \
-  csharp/src/Google.Protobuf/JsonToken.cs                                    \
-  csharp/src/Google.Protobuf/JsonTokenizer.cs                                \
-  csharp/src/Google.Protobuf/LimitedInputStream.cs                           \
-  csharp/src/Google.Protobuf/MessageExtensions.cs                            \
-  csharp/src/Google.Protobuf/MessageParser.cs                                \
-  csharp/src/Google.Protobuf/ObjectIntPair.cs                                \
-  csharp/src/Google.Protobuf/ParseContext.cs                                 \
-  csharp/src/Google.Protobuf/ParserInternalState.cs                          \
-  csharp/src/Google.Protobuf/ParsingPrimitives.cs                            \
-  csharp/src/Google.Protobuf/ParsingPrimitivesMessages.cs                    \
-  csharp/src/Google.Protobuf/ParsingPrimitivesWrappers.cs                    \
-  csharp/src/Google.Protobuf/ProtoPreconditions.cs                           \
-  csharp/src/Google.Protobuf/SegmentedBufferHelper.cs                        \
-  csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs                      \
-  csharp/src/Google.Protobuf/Reflection/CustomOptions.cs                     \
-  csharp/src/Google.Protobuf/Reflection/Descriptor.cs                        \
-  csharp/src/Google.Protobuf/Reflection/DescriptorBase.cs                    \
-  csharp/src/Google.Protobuf/Reflection/DescriptorDeclaration.cs             \
-  csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs                    \
-  csharp/src/Google.Protobuf/Reflection/DescriptorUtil.cs                    \
-  csharp/src/Google.Protobuf/Reflection/DescriptorValidationException.cs     \
-  csharp/src/Google.Protobuf/Reflection/EnumDescriptor.cs                    \
-  csharp/src/Google.Protobuf/Reflection/EnumValueDescriptor.cs               \
-  csharp/src/Google.Protobuf/Reflection/ExtensionAccessor.cs                 \
-  csharp/src/Google.Protobuf/Reflection/ExtensionCollection.cs               \
-  csharp/src/Google.Protobuf/Reflection/FieldAccessorBase.cs                 \
-  csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs                   \
-  csharp/src/Google.Protobuf/Reflection/FieldType.cs                         \
-  csharp/src/Google.Protobuf/Reflection/FileDescriptor.cs                    \
-  csharp/src/Google.Protobuf/Reflection/GeneratedClrTypeInfo.cs              \
-  csharp/src/Google.Protobuf/Reflection/IDescriptor.cs                       \
-  csharp/src/Google.Protobuf/Reflection/IFieldAccessor.cs                    \
-  csharp/src/Google.Protobuf/Reflection/MapFieldAccessor.cs                  \
-  csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs                 \
-  csharp/src/Google.Protobuf/Reflection/MethodDescriptor.cs                  \
-  csharp/src/Google.Protobuf/Reflection/OneofAccessor.cs                     \
-  csharp/src/Google.Protobuf/Reflection/OneofDescriptor.cs                   \
-  csharp/src/Google.Protobuf/Reflection/OriginalNameAttribute.cs             \
-  csharp/src/Google.Protobuf/Reflection/PackageDescriptor.cs                 \
-  csharp/src/Google.Protobuf/Reflection/ReflectionUtil.cs                    \
-  csharp/src/Google.Protobuf/Reflection/RepeatedFieldAccessor.cs             \
-  csharp/src/Google.Protobuf/Reflection/ServiceDescriptor.cs                 \
-  csharp/src/Google.Protobuf/Reflection/SingleFieldAccessor.cs               \
-  csharp/src/Google.Protobuf/Reflection/TypeRegistry.cs                      \
-  csharp/src/Google.Protobuf/WellKnownTypes/Any.cs                           \
-  csharp/src/Google.Protobuf/WellKnownTypes/AnyPartial.cs                    \
-  csharp/src/Google.Protobuf/WellKnownTypes/Api.cs                           \
-  csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs                      \
-  csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs               \
-  csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs                         \
-  csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs                     \
-  csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs              \
-  csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs                 \
-  csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs                        \
-  csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs                \
-  csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs                     \
-  csharp/src/Google.Protobuf/WellKnownTypes/TimestampPartial.cs              \
-  csharp/src/Google.Protobuf/WellKnownTypes/Type.cs                          \
-  csharp/src/Google.Protobuf/WellKnownTypes/ValuePartial.cs                  \
-  csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs                      \
-  csharp/src/Google.Protobuf/WellKnownTypes/WrappersPartial.cs               \
-  csharp/src/Google.Protobuf/WireFormat.cs                                   \
-  csharp/src/Google.Protobuf/WritingPrimitivesMessages.cs                    \
-  csharp/src/Google.Protobuf/WritingPrimitives.cs                            \
-  csharp/src/Google.Protobuf/WriterInternalState.cs                          \
-  csharp/src/Google.Protobuf/WriteContext.cs                                 \
-  csharp/src/Google.Protobuf/WriteBufferHelper.cs                            \
-  csharp/src/Google.Protobuf/UnknownField.cs                                 \
-  csharp/src/Google.Protobuf/UnknownFieldSet.cs                              \
-  csharp/src/Google.Protobuf/UnsafeByteOperations.cs
-
-# Note: please keep this in sync with the dist_files rules under java/.../BUILD.bazel.
-java_EXTRA_DIST=                                                                   \
-  java/README.md                                                                   \
-  java/bom/pom.xml                                                                 \
-  java/core/BUILD.bazel                                                            \
-  java/core/generate-sources-build.xml                                             \
-  java/core/generate-test-sources-build.xml                                        \
-  java/core/pom.xml                                                                \
-  java/core/pom_template.xml                                                       \
-  java/core/src/main/java/com/google/protobuf/AbstractMessage.java                 \
-  java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java             \
-  java/core/src/main/java/com/google/protobuf/AbstractParser.java                  \
-  java/core/src/main/java/com/google/protobuf/AbstractProtobufList.java            \
-  java/core/src/main/java/com/google/protobuf/AllocatedBuffer.java                 \
-  java/core/src/main/java/com/google/protobuf/Android.java                         \
-  java/core/src/main/java/com/google/protobuf/ArrayDecoders.java                   \
-  java/core/src/main/java/com/google/protobuf/BinaryReader.java                    \
-  java/core/src/main/java/com/google/protobuf/BinaryWriter.java                    \
-  java/core/src/main/java/com/google/protobuf/BlockingRpcChannel.java              \
-  java/core/src/main/java/com/google/protobuf/BlockingService.java                 \
-  java/core/src/main/java/com/google/protobuf/BooleanArrayList.java                \
-  java/core/src/main/java/com/google/protobuf/BufferAllocator.java                 \
-  java/core/src/main/java/com/google/protobuf/ByteBufferWriter.java                \
-  java/core/src/main/java/com/google/protobuf/ByteOutput.java                      \
-  java/core/src/main/java/com/google/protobuf/ByteString.java                      \
-  java/core/src/main/java/com/google/protobuf/CanIgnoreReturnValue.java            \
-  java/core/src/main/java/com/google/protobuf/CheckReturnValue.java                \
-  java/core/src/main/java/com/google/protobuf/CodedInputStream.java                \
-  java/core/src/main/java/com/google/protobuf/CodedInputStreamReader.java          \
-  java/core/src/main/java/com/google/protobuf/CodedOutputStream.java               \
-  java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java         \
-  java/core/src/main/java/com/google/protobuf/CompileTimeConstant.java             \
-  java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java    \
-  java/core/src/main/java/com/google/protobuf/Descriptors.java                     \
-  java/core/src/main/java/com/google/protobuf/DiscardUnknownFieldsParser.java      \
-  java/core/src/main/java/com/google/protobuf/DoubleArrayList.java                 \
-  java/core/src/main/java/com/google/protobuf/DynamicMessage.java                  \
-  java/core/src/main/java/com/google/protobuf/ExperimentalApi.java                 \
-  java/core/src/main/java/com/google/protobuf/Extension.java                       \
-  java/core/src/main/java/com/google/protobuf/ExtensionLite.java                   \
-  java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java               \
-  java/core/src/main/java/com/google/protobuf/ExtensionRegistryFactory.java        \
-  java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java           \
-  java/core/src/main/java/com/google/protobuf/ExtensionSchema.java                 \
-  java/core/src/main/java/com/google/protobuf/ExtensionSchemaFull.java             \
-  java/core/src/main/java/com/google/protobuf/ExtensionSchemaLite.java             \
-  java/core/src/main/java/com/google/protobuf/ExtensionSchemas.java                \
-  java/core/src/main/java/com/google/protobuf/FieldInfo.java                       \
-  java/core/src/main/java/com/google/protobuf/FieldSet.java                        \
-  java/core/src/main/java/com/google/protobuf/FieldType.java                       \
-  java/core/src/main/java/com/google/protobuf/FloatArrayList.java                  \
-  java/core/src/main/java/com/google/protobuf/GeneratedMessage.java                \
-  java/core/src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java     \
-  java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java            \
-  java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java              \
-  java/core/src/main/java/com/google/protobuf/InlineMe.java                        \
-  java/core/src/main/java/com/google/protobuf/IntArrayList.java                    \
-  java/core/src/main/java/com/google/protobuf/Internal.java                        \
-  java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java  \
-  java/core/src/main/java/com/google/protobuf/IterableByteBufferInputStream.java   \
-  java/core/src/main/java/com/google/protobuf/JavaType.java                        \
-  java/core/src/main/java/com/google/protobuf/LazyField.java                       \
-  java/core/src/main/java/com/google/protobuf/LazyFieldLite.java                   \
-  java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java             \
-  java/core/src/main/java/com/google/protobuf/LazyStringList.java                  \
-  java/core/src/main/java/com/google/protobuf/ListFieldSchema.java                 \
-  java/core/src/main/java/com/google/protobuf/LongArrayList.java                   \
-  java/core/src/main/java/com/google/protobuf/ManifestSchemaFactory.java           \
-  java/core/src/main/java/com/google/protobuf/MapEntry.java                        \
-  java/core/src/main/java/com/google/protobuf/MapEntryLite.java                    \
-  java/core/src/main/java/com/google/protobuf/MapField.java                        \
-  java/core/src/main/java/com/google/protobuf/MapFieldLite.java                    \
-  java/core/src/main/java/com/google/protobuf/MapFieldSchema.java                  \
-  java/core/src/main/java/com/google/protobuf/MapFieldSchemaFull.java              \
-  java/core/src/main/java/com/google/protobuf/MapFieldSchemaLite.java              \
-  java/core/src/main/java/com/google/protobuf/MapFieldSchemas.java                 \
-  java/core/src/main/java/com/google/protobuf/Message.java                         \
-  java/core/src/main/java/com/google/protobuf/MessageInfo.java                     \
-  java/core/src/main/java/com/google/protobuf/MessageInfoFactory.java              \
-  java/core/src/main/java/com/google/protobuf/MessageLite.java                     \
-  java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java            \
-  java/core/src/main/java/com/google/protobuf/MessageLiteToString.java             \
-  java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java                \
-  java/core/src/main/java/com/google/protobuf/MessageReflection.java               \
-  java/core/src/main/java/com/google/protobuf/MessageSchema.java                   \
-  java/core/src/main/java/com/google/protobuf/MessageSetSchema.java                \
-  java/core/src/main/java/com/google/protobuf/MutabilityOracle.java                \
-  java/core/src/main/java/com/google/protobuf/NewInstanceSchema.java               \
-  java/core/src/main/java/com/google/protobuf/NewInstanceSchemaFull.java           \
-  java/core/src/main/java/com/google/protobuf/NewInstanceSchemaLite.java           \
-  java/core/src/main/java/com/google/protobuf/NewInstanceSchemas.java              \
-  java/core/src/main/java/com/google/protobuf/NioByteString.java                   \
-  java/core/src/main/java/com/google/protobuf/OneofInfo.java                       \
-  java/core/src/main/java/com/google/protobuf/Parser.java                          \
-  java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java    \
-  java/core/src/main/java/com/google/protobuf/ProtoSyntax.java                     \
-  java/core/src/main/java/com/google/protobuf/Protobuf.java                        \
-  java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java               \
-  java/core/src/main/java/com/google/protobuf/ProtobufLists.java                   \
-  java/core/src/main/java/com/google/protobuf/ProtocolMessageEnum.java             \
-  java/core/src/main/java/com/google/protobuf/ProtocolStringList.java              \
-  java/core/src/main/java/com/google/protobuf/RawMessageInfo.java                  \
-  java/core/src/main/java/com/google/protobuf/Reader.java                          \
-  java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java            \
-  java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java          \
-  java/core/src/main/java/com/google/protobuf/RopeByteString.java                  \
-  java/core/src/main/java/com/google/protobuf/RpcCallback.java                     \
-  java/core/src/main/java/com/google/protobuf/RpcChannel.java                      \
-  java/core/src/main/java/com/google/protobuf/RpcController.java                   \
-  java/core/src/main/java/com/google/protobuf/RpcUtil.java                         \
-  java/core/src/main/java/com/google/protobuf/Schema.java                          \
-  java/core/src/main/java/com/google/protobuf/SchemaFactory.java                   \
-  java/core/src/main/java/com/google/protobuf/SchemaUtil.java                      \
-  java/core/src/main/java/com/google/protobuf/Service.java                         \
-  java/core/src/main/java/com/google/protobuf/ServiceException.java                \
-  java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java              \
-  java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java            \
-  java/core/src/main/java/com/google/protobuf/SmallSortedMap.java                  \
-  java/core/src/main/java/com/google/protobuf/StructuralMessageInfo.java           \
-  java/core/src/main/java/com/google/protobuf/TextFormat.java                      \
-  java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java               \
-  java/core/src/main/java/com/google/protobuf/TextFormatParseInfoTree.java         \
-  java/core/src/main/java/com/google/protobuf/TextFormatParseLocation.java         \
-  java/core/src/main/java/com/google/protobuf/TypeRegistry.java                    \
-  java/core/src/main/java/com/google/protobuf/UninitializedMessageException.java   \
-  java/core/src/main/java/com/google/protobuf/UnknownFieldSchema.java              \
-  java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java                 \
-  java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java             \
-  java/core/src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java       \
-  java/core/src/main/java/com/google/protobuf/UnknownFieldSetSchema.java           \
-  java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java      \
-  java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java            \
-  java/core/src/main/java/com/google/protobuf/UnsafeUtil.java                      \
-  java/core/src/main/java/com/google/protobuf/Utf8.java                            \
-  java/core/src/main/java/com/google/protobuf/WireFormat.java                      \
-  java/core/src/main/java/com/google/protobuf/Writer.java                          \
-  java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java             \
-  java/core/src/test/java/com/google/protobuf/AbstractProto2LiteSchemaTest.java    \
-  java/core/src/test/java/com/google/protobuf/AbstractProto2SchemaTest.java        \
-  java/core/src/test/java/com/google/protobuf/AbstractProto3LiteSchemaTest.java    \
-  java/core/src/test/java/com/google/protobuf/AbstractProto3SchemaTest.java        \
-  java/core/src/test/java/com/google/protobuf/AbstractSchemaTest.java              \
-  java/core/src/test/java/com/google/protobuf/AnyTest.java                         \
-  java/core/src/test/java/com/google/protobuf/ArrayDecodersTest.java               \
-  java/core/src/test/java/com/google/protobuf/BinaryProtocolTest.java              \
-  java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java            \
-  java/core/src/test/java/com/google/protobuf/BoundedByteStringTest.java           \
-  java/core/src/test/java/com/google/protobuf/ByteBufferWriterTest.java            \
-  java/core/src/test/java/com/google/protobuf/ByteStringTest.java                  \
-  java/core/src/test/java/com/google/protobuf/CachedFieldSizeTest.java             \
-  java/core/src/test/java/com/google/protobuf/CheckUtf8Test.java                   \
-  java/core/src/test/java/com/google/protobuf/CodedAdapterTest.java                \
-  java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java            \
-  java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java           \
-  java/core/src/test/java/com/google/protobuf/DecodeUtf8Test.java                  \
-  java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java             \
-  java/core/src/test/java/com/google/protobuf/DescriptorsTest.java                 \
-  java/core/src/test/java/com/google/protobuf/DiscardUnknownFieldsTest.java        \
-  java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java             \
-  java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java              \
-  java/core/src/test/java/com/google/protobuf/EnumTest.java                        \
-  java/core/src/test/java/com/google/protobuf/ExperimentalMessageFactory.java      \
-  java/core/src/test/java/com/google/protobuf/ExperimentalSerializationUtil.java   \
-  java/core/src/test/java/com/google/protobuf/ExperimentalTestDataProvider.java    \
-  java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java    \
-  java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java               \
-  java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java              \
-  java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java            \
-  java/core/src/test/java/com/google/protobuf/IntArrayListTest.java                \
-  java/core/src/test/java/com/google/protobuf/InvalidProtocolBufferExceptionTest.java \
-  java/core/src/test/java/com/google/protobuf/IsValidUtf8Test.java                 \
-  java/core/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java             \
-  java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java               \
-  java/core/src/test/java/com/google/protobuf/LazyFieldTest.java                   \
-  java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java             \
-  java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java         \
-  java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java          \
-  java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java           \
-  java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java           \
-  java/core/src/test/java/com/google/protobuf/LongArrayListTest.java               \
-  java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java            \
-  java/core/src/test/java/com/google/protobuf/MapForProto2Test.java                \
-  java/core/src/test/java/com/google/protobuf/MapLiteTest.java                     \
-  java/core/src/test/java/com/google/protobuf/MapTest.java                         \
-  java/core/src/test/java/com/google/protobuf/MessageTest.java                     \
-  java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java              \
-  java/core/src/test/java/com/google/protobuf/NioByteStringTest.java               \
-  java/core/src/test/java/com/google/protobuf/PackedFieldTest.java                 \
-  java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java             \
-  java/core/src/test/java/com/google/protobuf/ParserLiteTest.java                  \
-  java/core/src/test/java/com/google/protobuf/ParserTest.java                      \
-  java/core/src/test/java/com/google/protobuf/Proto2ExtensionLookupSchemaTest.java \
-  java/core/src/test/java/com/google/protobuf/Proto2LiteSchemaTest.java            \
-  java/core/src/test/java/com/google/protobuf/Proto2MessageFactory.java            \
-  java/core/src/test/java/com/google/protobuf/Proto2MessageLiteFactory.java        \
-  java/core/src/test/java/com/google/protobuf/Proto2SchemaTest.java                \
-  java/core/src/test/java/com/google/protobuf/Proto2UnknownEnumValueTest.java      \
-  java/core/src/test/java/com/google/protobuf/Proto3LiteSchemaTest.java            \
-  java/core/src/test/java/com/google/protobuf/Proto3MessageFactory.java            \
-  java/core/src/test/java/com/google/protobuf/Proto3MessageLiteFactory.java        \
-  java/core/src/test/java/com/google/protobuf/Proto3SchemaTest.java                \
-  java/core/src/test/java/com/google/protobuf/ProtobufArrayListTest.java           \
-  java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java      \
-  java/core/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java     \
-  java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java              \
-  java/core/src/test/java/com/google/protobuf/ServiceTest.java                     \
-  java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java        \
-  java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java              \
-  java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java              \
-  java/core/src/test/java/com/google/protobuf/TestBadIdentifiersLite.java          \
-  java/core/src/test/java/com/google/protobuf/TestSchemas.java                     \
-  java/core/src/test/java/com/google/protobuf/TestSchemasLite.java                 \
-  java/core/src/test/java/com/google/protobuf/TestUtil.java                        \
-  java/core/src/test/java/com/google/protobuf/TestUtilLite.java                    \
-  java/core/src/test/java/com/google/protobuf/TextFormatParseInfoTreeTest.java     \
-  java/core/src/test/java/com/google/protobuf/TextFormatParseLocationTest.java     \
-  java/core/src/test/java/com/google/protobuf/TextFormatTest.java                  \
-  java/core/src/test/java/com/google/protobuf/TypeRegistryTest.java                \
-  java/core/src/test/java/com/google/protobuf/UnknownEnumValueTest.java            \
-  java/core/src/test/java/com/google/protobuf/UnknownFieldSetTest.java             \
-  java/core/src/test/java/com/google/protobuf/UnknownFieldSetPerformanceTest.java             \
-  java/core/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java  \
-  java/core/src/test/java/com/google/protobuf/Utf8Test.java                        \
-  java/core/src/test/java/com/google/protobuf/WellKnownTypesTest.java              \
-  java/core/src/test/java/com/google/protobuf/WireFormatLiteTest.java              \
-  java/core/src/test/java/com/google/protobuf/WireFormatTest.java                  \
-  java/core/src/test/java/com/google/protobuf/WrappersLiteOfMethodTest.java        \
-  java/core/src/test/java/com/google/protobuf/WrappersOfMethodTest.java            \
-  java/core/src/test/proto/com/google/protobuf/any_test.proto                      \
-  java/core/src/test/proto/com/google/protobuf/cached_field_size_test.proto        \
-  java/core/src/test/proto/com/google/protobuf/deprecated_file.proto               \
-  java/core/src/test/proto/com/google/protobuf/dynamic_message_test.proto          \
-  java/core/src/test/proto/com/google/protobuf/field_presence_test.proto           \
-  java/core/src/test/proto/com/google/protobuf/lazy_fields_lite.proto              \
-  java/core/src/test/proto/com/google/protobuf/lite_equals_and_hash.proto          \
-  java/core/src/test/proto/com/google/protobuf/map_for_proto2_lite_test.proto      \
-  java/core/src/test/proto/com/google/protobuf/map_for_proto2_test.proto           \
-  java/core/src/test/proto/com/google/protobuf/map_initialization_order_test.proto \
-  java/core/src/test/proto/com/google/protobuf/map_lite_test.proto                 \
-  java/core/src/test/proto/com/google/protobuf/map_test.proto                      \
-  java/core/src/test/proto/com/google/protobuf/multiple_files_test.proto           \
-  java/core/src/test/proto/com/google/protobuf/nested_builders_test.proto          \
-  java/core/src/test/proto/com/google/protobuf/nested_extension.proto              \
-  java/core/src/test/proto/com/google/protobuf/nested_extension_lite.proto         \
-  java/core/src/test/proto/com/google/protobuf/non_nested_extension.proto          \
-  java/core/src/test/proto/com/google/protobuf/non_nested_extension_lite.proto     \
-  java/core/src/test/proto/com/google/protobuf/outer_class_name_test.proto         \
-  java/core/src/test/proto/com/google/protobuf/outer_class_name_test2.proto        \
-  java/core/src/test/proto/com/google/protobuf/outer_class_name_test3.proto        \
-  java/core/src/test/proto/com/google/protobuf/packed_field_test.proto             \
-  java/core/src/test/proto/com/google/protobuf/proto2_message.proto                \
-  java/core/src/test/proto/com/google/protobuf/proto2_message_lite.proto           \
-  java/core/src/test/proto/com/google/protobuf/proto2_unknown_enum_values.proto    \
-  java/core/src/test/proto/com/google/protobuf/proto3_message.proto                \
-  java/core/src/test/proto/com/google/protobuf/proto3_message_lite.proto           \
-  java/core/src/test/proto/com/google/protobuf/test_bad_identifiers.proto          \
-  java/core/src/test/proto/com/google/protobuf/test_check_utf8.proto               \
-  java/core/src/test/proto/com/google/protobuf/test_check_utf8_size.proto          \
-  java/core/src/test/proto/com/google/protobuf/test_custom_options.proto           \
-  java/core/src/test/proto/com/google/protobuf/wrappers_test.proto                 \
-  java/internal/BUILD.bazel                                                        \
-  java/internal/testing.bzl                                                        \
-  java/kotlin/BUILD.bazel                                                          \
-  java/kotlin/generate-sources-build.xml                                           \
-  java/kotlin/generate-test-sources-build.xml                                      \
-  java/kotlin/pom.xml                                                              \
-  java/kotlin/pom_template.xml                                                     \
-  java/kotlin/src/main/kotlin/com/google/protobuf/Anies.kt                         \
-  java/kotlin/src/main/kotlin/com/google/protobuf/ByteStrings.kt                   \
-  java/kotlin/src/main/kotlin/com/google/protobuf/DslList.kt                       \
-  java/kotlin/src/main/kotlin/com/google/protobuf/DslMap.kt                        \
-  java/kotlin/src/main/kotlin/com/google/protobuf/DslProxy.kt                      \
-  java/kotlin/src/main/kotlin/com/google/protobuf/ExtendableMessageExtensions.kt   \
-  java/kotlin/src/main/kotlin/com/google/protobuf/ExtensionList.kt                 \
-  java/kotlin/src/main/kotlin/com/google/protobuf/OnlyForUseByGeneratedProtoCode.kt\
-  java/kotlin/src/main/kotlin/com/google/protobuf/ProtoDslMarker.kt                \
-  java/kotlin/src/main/kotlin/com/google/protobuf/UnmodifiableCollections.kt       \
-  java/kotlin/src/test/kotlin/com/google/protobuf/AniesTest.kt                     \
-  java/kotlin/src/test/kotlin/com/google/protobuf/ByteStringsTest.kt               \
-  java/kotlin/src/test/kotlin/com/google/protobuf/DslListTest.kt                   \
-  java/kotlin/src/test/kotlin/com/google/protobuf/DslMapTest.kt                    \
-  java/kotlin/src/test/kotlin/com/google/protobuf/ExtendableMessageExtensionsTest.kt\
-  java/kotlin/src/test/kotlin/com/google/protobuf/ExtensionListTest.kt             \
-  java/kotlin/src/test/kotlin/com/google/protobuf/Proto2Test.kt                    \
-  java/kotlin/src/test/kotlin/com/google/protobuf/Proto3Test.kt                    \
-  java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto2.proto           \
-  java/kotlin/src/test/proto/com/google/protobuf/evil_names_proto3.proto           \
-  java/kotlin/src/test/proto/com/google/protobuf/example_extensible_message.proto  \
-  java/kotlin/src/test/proto/com/google/protobuf/multiple_files_proto3.proto       \
-  java/kotlin-lite/BUILD.bazel                                                     \
-  java/kotlin-lite/generate-sources-build.xml                                      \
-  java/kotlin-lite/generate-test-sources-build.xml                                 \
-  java/kotlin-lite/lite.awk                                                        \
-  java/kotlin-lite/pom.xml                                                         \
-  java/kotlin-lite/pom_template.xml                                                \
-  java/kotlin-lite/process-lite-sources-build.xml                                  \
-  java/kotlin-lite/src/main/kotlin/com/google/protobuf/ExtendableMessageLiteExtensions.kt\
-  java/kotlin-lite/src/test/kotlin/com/google/protobuf/ExtendableMessageLiteExtensionsTest.kt\
-  java/kotlin-lite/src/test/kotlin/com/google/protobuf/Proto2LiteTest.kt           \
-  java/lite.md                                                                     \
-  java/lite/BUILD.bazel                                                            \
-  java/lite/generate-sources-build.xml                                             \
-  java/lite/generate-test-sources-build.xml                                        \
-  java/lite/lite.awk                                                               \
-  java/lite/pom.xml                                                                \
-  java/lite/pom_template.xml                                                       \
-  java/lite/process-lite-sources-build.xml                                         \
-  java/lite/src/test/java/com/google/protobuf/LiteTest.java                        \
-  java/BUILD.bazel                                                                 \
-  java/pom.xml                                                                     \
-  java/protoc/pom.xml                                                              \
-  java/util/BUILD.bazel                                                            \
-  java/util/pom.xml                                                                \
-  java/util/pom_template.xml                                                       \
-  java/util/src/main/java/com/google/protobuf/util/Durations.java                  \
-  java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java              \
-  java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java              \
-  java/util/src/main/java/com/google/protobuf/util/JsonFormat.java                 \
-  java/util/src/main/java/com/google/protobuf/util/Structs.java                    \
-  java/util/src/main/java/com/google/protobuf/util/Timestamps.java                 \
-  java/util/src/main/java/com/google/protobuf/util/Values.java                     \
-  java/util/src/test/java/com/google/protobuf/util/DurationsTest.java              \
-  java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java          \
-  java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java          \
-  java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java             \
-  java/util/src/test/java/com/google/protobuf/util/StructsTest.java                \
-  java/util/src/test/java/com/google/protobuf/util/TimestampsTest.java             \
-  java/util/src/test/java/com/google/protobuf/util/ValuesTest.java                 \
-  java/util/src/test/proto/com/google/protobuf/util/json_test.proto
-
-# Note: please keep this in sync with the dist_files rule in objectivec/BUILD.bazel.
-objectivec_EXTRA_DIST=                                                       \
-  objectivec/.clang-format                                                   \
-  objectivec/BUILD.bazel                                                     \
-  objectivec/DevTools/check_version_stamps.sh                                \
-  objectivec/DevTools/compile_testing_protos.sh                              \
-  objectivec/DevTools/full_mac_build.sh                                      \
-  objectivec/DevTools/pddm.py                                                \
-  objectivec/DevTools/pddm_tests.py                                          \
-  objectivec/generate_well_known_types.sh                                    \
-  objectivec/google/protobuf/Any.pbobjc.h                                    \
-  objectivec/google/protobuf/Api.pbobjc.h                                    \
-  objectivec/google/protobuf/Duration.pbobjc.h                               \
-  objectivec/google/protobuf/Empty.pbobjc.h                                  \
-  objectivec/google/protobuf/FieldMask.pbobjc.h                              \
-  objectivec/google/protobuf/SourceContext.pbobjc.h                          \
-  objectivec/google/protobuf/Struct.pbobjc.h                                 \
-  objectivec/google/protobuf/Timestamp.pbobjc.h                              \
-  objectivec/google/protobuf/Type.pbobjc.h                                   \
-  objectivec/google/protobuf/Wrappers.pbobjc.h                               \
-  objectivec/GPBAny.pbobjc.h                                                 \
-  objectivec/GPBAny.pbobjc.m                                                 \
-  objectivec/GPBApi.pbobjc.h                                                 \
-  objectivec/GPBApi.pbobjc.m                                                 \
-  objectivec/GPBArray.h                                                      \
-  objectivec/GPBArray.m                                                      \
-  objectivec/GPBArray_PackagePrivate.h                                       \
-  objectivec/GPBBootstrap.h                                                  \
-  objectivec/GPBCodedInputStream.h                                           \
-  objectivec/GPBCodedInputStream.m                                           \
-  objectivec/GPBCodedInputStream_PackagePrivate.h                            \
-  objectivec/GPBCodedOutputStream.h                                          \
-  objectivec/GPBCodedOutputStream.m                                          \
-  objectivec/GPBCodedOutputStream_PackagePrivate.h                           \
-  objectivec/GPBDescriptor.h                                                 \
-  objectivec/GPBDescriptor.m                                                 \
-  objectivec/GPBDescriptor_PackagePrivate.h                                  \
-  objectivec/GPBDictionary.h                                                 \
-  objectivec/GPBDictionary.m                                                 \
-  objectivec/GPBDictionary_PackagePrivate.h                                  \
-  objectivec/GPBDuration.pbobjc.h                                            \
-  objectivec/GPBDuration.pbobjc.m                                            \
-  objectivec/GPBEmpty.pbobjc.h                                               \
-  objectivec/GPBEmpty.pbobjc.m                                               \
-  objectivec/GPBExtensionInternals.h                                         \
-  objectivec/GPBExtensionInternals.m                                         \
-  objectivec/GPBExtensionRegistry.h                                          \
-  objectivec/GPBExtensionRegistry.m                                          \
-  objectivec/GPBFieldMask.pbobjc.h                                           \
-  objectivec/GPBFieldMask.pbobjc.m                                           \
-  objectivec/GPBMessage.h                                                    \
-  objectivec/GPBMessage.m                                                    \
-  objectivec/GPBMessage_PackagePrivate.h                                     \
-  objectivec/GPBProtocolBuffers.h                                            \
-  objectivec/GPBProtocolBuffers.m                                            \
-  objectivec/GPBProtocolBuffers_RuntimeSupport.h                             \
-  objectivec/GPBRootObject.h                                                 \
-  objectivec/GPBRootObject.m                                                 \
-  objectivec/GPBRootObject_PackagePrivate.h                                  \
-  objectivec/GPBRuntimeTypes.h                                               \
-  objectivec/GPBSourceContext.pbobjc.h                                       \
-  objectivec/GPBSourceContext.pbobjc.m                                       \
-  objectivec/GPBStruct.pbobjc.h                                              \
-  objectivec/GPBStruct.pbobjc.m                                              \
-  objectivec/GPBTimestamp.pbobjc.h                                           \
-  objectivec/GPBTimestamp.pbobjc.m                                           \
-  objectivec/GPBType.pbobjc.h                                                \
-  objectivec/GPBType.pbobjc.m                                                \
-  objectivec/GPBUnknownField.h                                               \
-  objectivec/GPBUnknownField.m                                               \
-  objectivec/GPBUnknownField_PackagePrivate.h                                \
-  objectivec/GPBUnknownFieldSet.h                                            \
-  objectivec/GPBUnknownFieldSet.m                                            \
-  objectivec/GPBUnknownFieldSet_PackagePrivate.h                             \
-  objectivec/GPBUtilities.h                                                  \
-  objectivec/GPBUtilities.m                                                  \
-  objectivec/GPBUtilities_PackagePrivate.h                                   \
-  objectivec/GPBWellKnownTypes.h                                             \
-  objectivec/GPBWellKnownTypes.m                                             \
-  objectivec/GPBWireFormat.h                                                 \
-  objectivec/GPBWireFormat.m                                                 \
-  objectivec/GPBWrappers.pbobjc.h                                            \
-  objectivec/GPBWrappers.pbobjc.m                                            \
-  objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj                   \
-  objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
-  objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist \
-  objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
-  objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
-  objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
-  objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj                   \
-  objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
-  objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist \
-  objectivec/ProtocolBuffers_OSX.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
-  objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
-  objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
-  objectivec/ProtocolBuffers_tvOS.xcodeproj/project.pbxproj                  \
-  objectivec/ProtocolBuffers_tvOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
-  objectivec/ProtocolBuffers_tvOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist \
-  objectivec/ProtocolBuffers_tvOS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
-  objectivec/ProtocolBuffers_tvOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
-  objectivec/ProtocolBuffers_tvOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
-  objectivec/README.md                                                       \
-  objectivec/Tests/golden_message                                            \
-  objectivec/Tests/golden_packed_fields_message                              \
-  objectivec/Tests/GPBARCUnittestProtos.m                                    \
-  objectivec/Tests/GPBArrayTests.m                                           \
-  objectivec/Tests/GPBCodedInputStreamTests.m                                \
-  objectivec/Tests/GPBCodedOuputStreamTests.m                                \
-  objectivec/Tests/GPBCompileTest01.m                                        \
-  objectivec/Tests/GPBCompileTest02.m                                        \
-  objectivec/Tests/GPBCompileTest03.m                                        \
-  objectivec/Tests/GPBCompileTest04.m                                        \
-  objectivec/Tests/GPBCompileTest05.m                                        \
-  objectivec/Tests/GPBCompileTest06.m                                        \
-  objectivec/Tests/GPBCompileTest07.m                                        \
-  objectivec/Tests/GPBCompileTest08.m                                        \
-  objectivec/Tests/GPBCompileTest09.m                                        \
-  objectivec/Tests/GPBCompileTest10.m                                        \
-  objectivec/Tests/GPBCompileTest11.m                                        \
-  objectivec/Tests/GPBCompileTest12.m                                        \
-  objectivec/Tests/GPBCompileTest13.m                                        \
-  objectivec/Tests/GPBCompileTest14.m                                        \
-  objectivec/Tests/GPBCompileTest15.m                                        \
-  objectivec/Tests/GPBCompileTest16.m                                        \
-  objectivec/Tests/GPBCompileTest17.m                                        \
-  objectivec/Tests/GPBCompileTest18.m                                        \
-  objectivec/Tests/GPBCompileTest19.m                                        \
-  objectivec/Tests/GPBCompileTest20.m                                        \
-  objectivec/Tests/GPBCompileTest21.m                                        \
-  objectivec/Tests/GPBCompileTest22.m                                        \
-  objectivec/Tests/GPBCompileTest23.m                                        \
-  objectivec/Tests/GPBCompileTest24.m                                        \
-  objectivec/Tests/GPBCompileTest25.m                                        \
-  objectivec/Tests/GPBConcurrencyTests.m                                     \
-  objectivec/Tests/GPBDescriptorTests.m                                      \
-  objectivec/Tests/GPBDictionaryTests+Bool.m                                 \
-  objectivec/Tests/GPBDictionaryTests+Int32.m                                \
-  objectivec/Tests/GPBDictionaryTests+Int64.m                                \
-  objectivec/Tests/GPBDictionaryTests+String.m                               \
-  objectivec/Tests/GPBDictionaryTests+UInt32.m                               \
-  objectivec/Tests/GPBDictionaryTests+UInt64.m                               \
-  objectivec/Tests/GPBDictionaryTests.m                                      \
-  objectivec/Tests/GPBDictionaryTests.pddm                                   \
-  objectivec/Tests/GPBExtensionRegistryTest.m                                \
-  objectivec/Tests/GPBMessageTests+ClassNames.m                              \
-  objectivec/Tests/GPBMessageTests+Merge.m                                   \
-  objectivec/Tests/GPBMessageTests+Runtime.m                                 \
-  objectivec/Tests/GPBMessageTests+Serialization.m                           \
-  objectivec/Tests/GPBMessageTests.m                                         \
-  objectivec/Tests/GPBObjectiveCPlusPlusTest.mm                              \
-  objectivec/Tests/GPBPerfTests.m                                            \
-  objectivec/Tests/GPBSwiftTests.swift                                       \
-  objectivec/Tests/GPBTestUtilities.h                                        \
-  objectivec/Tests/GPBTestUtilities.m                                        \
-  objectivec/Tests/GPBUnittestProtos.m                                       \
-  objectivec/Tests/GPBUnittestProtos2.m                                      \
-  objectivec/Tests/GPBUnknownFieldSetTest.m                                  \
-  objectivec/Tests/GPBUtilitiesTests.m                                       \
-  objectivec/Tests/GPBWellKnownTypesTest.m                                   \
-  objectivec/Tests/GPBWireFormatTests.m                                      \
-  objectivec/Tests/text_format_extensions_unittest_data.txt                   \
-  objectivec/Tests/text_format_map_unittest_data.txt                          \
-  objectivec/Tests/text_format_unittest_data.txt                              \
-  objectivec/Tests/unittest_cycle.proto                                       \
-  objectivec/Tests/unittest_deprecated.proto                                  \
-  objectivec/Tests/unittest_deprecated_file.proto                             \
-  objectivec/Tests/unittest_extension_chain_a.proto                           \
-  objectivec/Tests/unittest_extension_chain_b.proto                           \
-  objectivec/Tests/unittest_extension_chain_c.proto                           \
-  objectivec/Tests/unittest_extension_chain_d.proto                           \
-  objectivec/Tests/unittest_extension_chain_e.proto                           \
-  objectivec/Tests/unittest_extension_chain_f.proto                           \
-  objectivec/Tests/unittest_extension_chain_g.proto                           \
-  objectivec/Tests/unittest_objc.proto                                        \
-  objectivec/Tests/unittest_objc_options.proto                                \
-  objectivec/Tests/unittest_objc_startup.proto                                \
-  objectivec/Tests/unittest_runtime_proto2.proto                              \
-  objectivec/Tests/unittest_runtime_proto3.proto                              \
-  objectivec/Tests/UnitTests-Bridging-Header.h                                \
-  objectivec/Tests/UnitTests-Info.plist                                       \
-  Protobuf.podspec
-
-# Note: please keep this in sync with the dist_files rule in php/BUILD.bazel.
-php_EXTRA_DIST=                                                       \
-  php/README.md                                                       \
-  php/REFCOUNTING.md                                                  \
-  php/composer.json                                                   \
-  php/composer.json.dist                                              \
-  php/ext/google/protobuf/arena.c                                     \
-  php/ext/google/protobuf/arena.h                                     \
-  php/ext/google/protobuf/array.c                                     \
-  php/ext/google/protobuf/array.h                                     \
-  php/ext/google/protobuf/config.m4                                   \
-  php/ext/google/protobuf/convert.c                                   \
-  php/ext/google/protobuf/convert.h                                   \
-  php/ext/google/protobuf/def.c                                       \
-  php/ext/google/protobuf/def.h                                       \
-  php/ext/google/protobuf/map.c                                       \
-  php/ext/google/protobuf/map.h                                       \
-  php/ext/google/protobuf/message.c                                   \
-  php/ext/google/protobuf/message.h                                   \
-  php/ext/google/protobuf/names.c                                     \
-  php/ext/google/protobuf/names.h                                     \
-  php/ext/google/protobuf/package.xml                                 \
-  php/ext/google/protobuf/php-upb.c                                   \
-  php/ext/google/protobuf/php-upb.h                                   \
-  php/ext/google/protobuf/php_protobuf.h                              \
-  php/ext/google/protobuf/protobuf.c                                  \
-  php/ext/google/protobuf/protobuf.h                                  \
-  php/ext/google/protobuf/wkt.inc                                     \
-  php/ext/google/protobuf/tests/unnecessary_zval.phpt                 \
-  php/generate_descriptor_protos.sh                                   \
-  php/generate_test_protos.sh                                         \
-  php/release.sh                                                      \
-  php/src/GPBMetadata/Google/Protobuf/Any.php                         \
-  php/src/GPBMetadata/Google/Protobuf/Api.php                         \
-  php/src/GPBMetadata/Google/Protobuf/Duration.php                    \
-  php/src/GPBMetadata/Google/Protobuf/FieldMask.php                   \
-  php/src/GPBMetadata/Google/Protobuf/GPBEmpty.php                    \
-  php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php         \
-  php/src/GPBMetadata/Google/Protobuf/SourceContext.php               \
-  php/src/GPBMetadata/Google/Protobuf/Struct.php                      \
-  php/src/GPBMetadata/Google/Protobuf/Timestamp.php                   \
-  php/src/GPBMetadata/Google/Protobuf/Type.php                        \
-  php/src/GPBMetadata/Google/Protobuf/Wrappers.php                    \
-  php/src/Google/Protobuf/Any.php                                     \
-  php/src/Google/Protobuf/Api.php                                     \
-  php/src/Google/Protobuf/BoolValue.php                               \
-  php/src/Google/Protobuf/BytesValue.php                              \
-  php/src/Google/Protobuf/Descriptor.php                              \
-  php/src/Google/Protobuf/DescriptorPool.php                          \
-  php/src/Google/Protobuf/DoubleValue.php                             \
-  php/src/Google/Protobuf/Duration.php                                \
-  php/src/Google/Protobuf/Enum.php                                    \
-  php/src/Google/Protobuf/EnumDescriptor.php                          \
-  php/src/Google/Protobuf/EnumValue.php                               \
-  php/src/Google/Protobuf/EnumValueDescriptor.php                     \
-  php/src/Google/Protobuf/Field.php                                   \
-  php/src/Google/Protobuf/FieldDescriptor.php                         \
-  php/src/Google/Protobuf/FieldMask.php                               \
-  php/src/Google/Protobuf/Field/Cardinality.php                       \
-  php/src/Google/Protobuf/Field_Cardinality.php                       \
-  php/src/Google/Protobuf/Field/Kind.php                              \
-  php/src/Google/Protobuf/Field_Kind.php                              \
-  php/src/Google/Protobuf/FloatValue.php                              \
-  php/src/Google/Protobuf/GPBEmpty.php                                \
-  php/src/Google/Protobuf/Int32Value.php                              \
-  php/src/Google/Protobuf/Int64Value.php                              \
-  php/src/Google/Protobuf/Internal/AnyBase.php                        \
-  php/src/Google/Protobuf/Internal/CodedInputStream.php               \
-  php/src/Google/Protobuf/Internal/CodedOutputStream.php              \
-  php/src/Google/Protobuf/Internal/Descriptor.php                     \
-  php/src/Google/Protobuf/Internal/DescriptorPool.php                 \
-  php/src/Google/Protobuf/Internal/DescriptorProto.php                \
-  php/src/Google/Protobuf/Internal/DescriptorProto/ExtensionRange.php \
-  php/src/Google/Protobuf/Internal/DescriptorProto/ReservedRange.php  \
-  php/src/Google/Protobuf/Internal/EnumBuilderContext.php             \
-  php/src/Google/Protobuf/Internal/EnumDescriptor.php                 \
-  php/src/Google/Protobuf/Internal/EnumDescriptorProto.php            \
-  php/src/Google/Protobuf/Internal/EnumDescriptorProto/EnumReservedRange.php \
-  php/src/Google/Protobuf/Internal/EnumOptions.php                    \
-  php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php       \
-  php/src/Google/Protobuf/Internal/EnumValueOptions.php               \
-  php/src/Google/Protobuf/Internal/ExtensionRangeOptions.php          \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto.php           \
-  php/src/Google/Protobuf/Internal/FieldDescriptor.php                \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto.php           \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto/Label.php     \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto/Type.php      \
-  php/src/Google/Protobuf/Internal/FieldOptions.php                   \
-  php/src/Google/Protobuf/Internal/FieldOptions/CType.php             \
-  php/src/Google/Protobuf/Internal/FieldOptions/JSType.php            \
-  php/src/Google/Protobuf/Internal/FileDescriptor.php                 \
-  php/src/Google/Protobuf/Internal/FileDescriptorProto.php            \
-  php/src/Google/Protobuf/Internal/FileDescriptorSet.php              \
-  php/src/Google/Protobuf/Internal/FileOptions.php                    \
-  php/src/Google/Protobuf/Internal/FileOptions/OptimizeMode.php       \
-  php/src/Google/Protobuf/Internal/GPBDecodeException.php             \
-  php/src/Google/Protobuf/Internal/GPBJsonWire.php                    \
-  php/src/Google/Protobuf/Internal/GPBLabel.php                       \
-  php/src/Google/Protobuf/Internal/GPBType.php                        \
-  php/src/Google/Protobuf/Internal/GPBUtil.php                        \
-  php/src/Google/Protobuf/Internal/GPBWire.php                        \
-  php/src/Google/Protobuf/Internal/GPBWireType.php                    \
-  php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php              \
-  php/src/Google/Protobuf/Internal/GeneratedCodeInfo/Annotation.php   \
-  php/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php       \
-  php/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php       \
-  php/src/Google/Protobuf/Internal/MapEntry.php                       \
-  php/src/Google/Protobuf/Internal/MapField.php                       \
-  php/src/Google/Protobuf/Internal/MapFieldIter.php                   \
-  php/src/Google/Protobuf/Internal/Message.php                        \
-  php/src/Google/Protobuf/Internal/MessageBuilderContext.php          \
-  php/src/Google/Protobuf/Internal/MessageOptions.php                 \
-  php/src/Google/Protobuf/Internal/MethodDescriptorProto.php          \
-  php/src/Google/Protobuf/Internal/MethodOptions.php                  \
-  php/src/Google/Protobuf/Internal/MethodOptions/IdempotencyLevel.php \
-  php/src/Google/Protobuf/Internal/OneofDescriptor.php                \
-  php/src/Google/Protobuf/Internal/OneofDescriptorProto.php           \
-  php/src/Google/Protobuf/Internal/OneofField.php                     \
-  php/src/Google/Protobuf/Internal/OneofOptions.php                   \
-  php/src/Google/Protobuf/Internal/RawInputStream.php                 \
-  php/src/Google/Protobuf/Internal/RepeatedField.php                  \
-  php/src/Google/Protobuf/Internal/RepeatedFieldIter.php              \
-  php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php         \
-  php/src/Google/Protobuf/Internal/ServiceOptions.php                 \
-  php/src/Google/Protobuf/Internal/SourceCodeInfo.php                 \
-  php/src/Google/Protobuf/Internal/SourceCodeInfo/Location.php        \
-  php/src/Google/Protobuf/Internal/TimestampBase.php                  \
-  php/src/Google/Protobuf/Internal/UninterpretedOption.php            \
-  php/src/Google/Protobuf/Internal/UninterpretedOption/NamePart.php   \
-  php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php \
-  php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php  \
-  php/src/Google/Protobuf/Internal/EnumDescriptorProto_EnumReservedRange.php \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php     \
-  php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php      \
-  php/src/Google/Protobuf/Internal/FieldOptions_CType.php             \
-  php/src/Google/Protobuf/Internal/FieldOptions_JSType.php            \
-  php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php       \
-  php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php   \
-  php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php \
-  php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php        \
-  php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php   \
-  php/src/Google/Protobuf/ListValue.php                               \
-  php/src/Google/Protobuf/Method.php                                  \
-  php/src/Google/Protobuf/Mixin.php                                   \
-  php/src/Google/Protobuf/NullValue.php                               \
-  php/src/Google/Protobuf/OneofDescriptor.php                         \
-  php/src/Google/Protobuf/Option.php                                  \
-  php/src/Google/Protobuf/SourceContext.php                           \
-  php/src/Google/Protobuf/StringValue.php                             \
-  php/src/Google/Protobuf/Struct.php                                  \
-  php/src/Google/Protobuf/Syntax.php                                  \
-  php/src/Google/Protobuf/Timestamp.php                               \
-  php/src/Google/Protobuf/Type.php                                    \
-  php/src/Google/Protobuf/UInt32Value.php                             \
-  php/src/Google/Protobuf/UInt64Value.php                             \
-  php/src/Google/Protobuf/Value.php                                   \
-  php/src/phpdoc.dist.xml                                             \
-  php/tests/ArrayTest.php                                             \
-  php/tests/compatibility_test.sh                                     \
-  php/tests/compile_extension.sh                                      \
-  php/tests/DescriptorsTest.php                                       \
-  php/tests/EncodeDecodeTest.php                                      \
-  php/tests/force_c_ext.php                                           \
-  php/tests/gdb_test.sh                                               \
-  php/tests/generated_previous/GPBMetadata/ProtoPrevious/TestPreviouslyUnreservedMessage.php \
-  php/tests/generated_previous/Previous/readonly.php                  \
-  php/tests/GeneratedClassTest.php                                    \
-  php/tests/GeneratedPhpdocTest.php                                   \
-  php/tests/GeneratedServiceTest.php                                  \
-  php/tests/MapFieldTest.php                                          \
-  php/tests/memory_leak_test.php                                      \
-  php/tests/memory_leak_test.sh                                       \
-  php/tests/multirequest.php                                          \
-  php/tests/multirequest.sh                                           \
-  php/tests/PhpImplementationTest.php                                 \
-  php/tests/PreviouslyGeneratedClassTest.php                          \
-  php/tests/proto/empty/echo.proto                                    \
-  php/tests/proto/test.proto                                          \
-  php/tests/proto/test_descriptors.proto                              \
-  php/tests/proto/test_empty_php_namespace.proto                      \
-  php/tests/proto/test_import_descriptor_proto.proto                  \
-  php/tests/proto/test_include.proto                                  \
-  php/tests/proto/test_no_namespace.proto                             \
-  php/tests/proto/test_php_namespace.proto                            \
-  php/tests/proto/test_prefix.proto                                   \
-  php/tests/proto/test_reserved_enum_lower.proto                      \
-  php/tests/proto/test_reserved_enum_upper.proto                      \
-  php/tests/proto/test_reserved_enum_value_lower.proto                \
-  php/tests/proto/test_reserved_enum_value_upper.proto                \
-  php/tests/proto/test_reserved_message_lower.proto                   \
-  php/tests/proto/test_reserved_message_upper.proto                   \
-  php/tests/proto/test_service.proto                                  \
-  php/tests/proto/test_service_namespace.proto                        \
-  php/tests/proto/test_wrapper_type_setters.proto                     \
-  php/tests/proto_previous/test_previously_unreserved_message.proto   \
-  php/tests/test_base.php                                             \
-  php/tests/test_util.php                                             \
-  php/tests/valgrind.supp                                             \
-  php/tests/WellKnownTest.php                                         \
-  php/tests/WrapperTypeSettersTest.php
-
-# Note: please keep this in sync with the python_dist_files rule in BUILD.bazel.
-python_EXTRA_DIST=                                                           \
-  python/BUILD.bazel                                                         \
-  python/MANIFEST.in                                                         \
-  python/google/__init__.py                                                  \
-  python/google/protobuf/__init__.py                                         \
-  python/google/protobuf/compiler/__init__.py                                \
-  python/google/protobuf/descriptor.py                                       \
-  python/google/protobuf/descriptor_database.py                              \
-  python/google/protobuf/descriptor_pool.py                                  \
-  python/google/protobuf/internal/__init__.py                                \
-  python/google/protobuf/internal/_parameterized.py                          \
-  python/google/protobuf/internal/any_test.proto                             \
-  python/google/protobuf/internal/any_test.proto                             \
-  python/google/protobuf/internal/api_implementation.cc                      \
-  python/google/protobuf/internal/api_implementation.py                      \
-  python/google/protobuf/internal/builder.py                                 \
-  python/google/protobuf/internal/containers.py                              \
-  python/google/protobuf/internal/decoder.py                                 \
-  python/google/protobuf/internal/descriptor_database_test.py                \
-  python/google/protobuf/internal/descriptor_pool_test.py                    \
-  python/google/protobuf/internal/descriptor_pool_test1.proto                \
-  python/google/protobuf/internal/descriptor_pool_test2.proto                \
-  python/google/protobuf/internal/descriptor_test.py                         \
-  python/google/protobuf/internal/encoder.py                                 \
-  python/google/protobuf/internal/enum_type_wrapper.py                       \
-  python/google/protobuf/internal/extension_dict.py                          \
-  python/google/protobuf/internal/factory_test1.proto                        \
-  python/google/protobuf/internal/factory_test2.proto                        \
-  python/google/protobuf/internal/file_options_test.proto                    \
-  python/google/protobuf/internal/generator_test.py                          \
-  python/google/protobuf/internal/import_test.py                             \
-  python/google/protobuf/internal/import_test_package/__init__.py            \
-  python/google/protobuf/internal/import_test_package/import_public.proto    \
-  python/google/protobuf/internal/import_test_package/import_public_nested.proto \
-  python/google/protobuf/internal/import_test_package/inner.proto            \
-  python/google/protobuf/internal/import_test_package/outer.proto            \
-  python/google/protobuf/internal/json_format_test.py                        \
-  python/google/protobuf/internal/keywords_test.py                           \
-  python/google/protobuf/internal/message_factory_test.py                    \
-  python/google/protobuf/internal/message_listener.py                        \
-  python/google/protobuf/internal/message_set_extensions.proto               \
-  python/google/protobuf/internal/message_test.py                            \
-  python/google/protobuf/internal/missing_enum_values.proto                  \
-  python/google/protobuf/internal/more_extensions.proto                      \
-  python/google/protobuf/internal/more_extensions_dynamic.proto              \
-  python/google/protobuf/internal/more_messages.proto                        \
-  python/google/protobuf/internal/no_package.proto                           \
-  python/google/protobuf/internal/packed_field_test.proto                    \
-  python/google/protobuf/internal/proto_builder_test.py                      \
-  python/google/protobuf/internal/python_message.py                          \
-  python/google/protobuf/internal/python_protobuf.cc                         \
-  python/google/protobuf/internal/reflection_test.py                         \
-  python/google/protobuf/internal/service_reflection_test.py                 \
-  python/google/protobuf/internal/symbol_database_test.py                    \
-  python/google/protobuf/internal/test_bad_identifiers.proto                 \
-  python/google/protobuf/internal/test_proto3_optional.proto                 \
-  python/google/protobuf/internal/test_util.py                               \
-  python/google/protobuf/internal/testing_refleaks.py                        \
-  python/google/protobuf/internal/text_encoding_test.py                      \
-  python/google/protobuf/internal/text_format_test.py                        \
-  python/google/protobuf/internal/type_checkers.py                           \
-  python/google/protobuf/internal/unknown_fields_test.py                     \
-  python/google/protobuf/internal/well_known_types.py                        \
-  python/google/protobuf/internal/well_known_types.py                        \
-  python/google/protobuf/internal/well_known_types_test.py                   \
-  python/google/protobuf/internal/well_known_types_test.py                   \
-  python/google/protobuf/internal/wire_format.py                             \
-  python/google/protobuf/internal/wire_format_test.py                        \
-  python/google/protobuf/json_format.py                                      \
-  python/google/protobuf/message.py                                          \
-  python/google/protobuf/message_factory.py                                  \
-  python/google/protobuf/proto_api.h                                         \
-  python/google/protobuf/proto_builder.py                                    \
-  python/google/protobuf/pyext/README                                        \
-  python/google/protobuf/pyext/__init__.py                                   \
-  python/google/protobuf/pyext/cpp_message.py                                \
-  python/google/protobuf/pyext/descriptor.cc                                 \
-  python/google/protobuf/pyext/descriptor.h                                  \
-  python/google/protobuf/pyext/descriptor_containers.cc                      \
-  python/google/protobuf/pyext/descriptor_containers.h                       \
-  python/google/protobuf/pyext/descriptor_database.cc                        \
-  python/google/protobuf/pyext/descriptor_database.h                         \
-  python/google/protobuf/pyext/descriptor_pool.cc                            \
-  python/google/protobuf/pyext/descriptor_pool.h                             \
-  python/google/protobuf/pyext/extension_dict.cc                             \
-  python/google/protobuf/pyext/extension_dict.h                              \
-  python/google/protobuf/pyext/map_container.cc                              \
-  python/google/protobuf/pyext/map_container.h                               \
-  python/google/protobuf/pyext/message.cc                                    \
-  python/google/protobuf/pyext/message.h                                     \
-  python/google/protobuf/pyext/field.cc                                      \
-  python/google/protobuf/pyext/field.h                                       \
-  python/google/protobuf/pyext/unknown_fields.cc                             \
-  python/google/protobuf/pyext/unknown_fields.h                              \
-  python/google/protobuf/pyext/message_factory.cc                            \
-  python/google/protobuf/pyext/message_factory.h                             \
-  python/google/protobuf/pyext/message_module.cc                             \
-  python/google/protobuf/pyext/proto2_api_test.proto                         \
-  python/google/protobuf/pyext/python.proto                                  \
-  python/google/protobuf/pyext/repeated_composite_container.cc               \
-  python/google/protobuf/pyext/repeated_composite_container.h                \
-  python/google/protobuf/pyext/repeated_scalar_container.cc                  \
-  python/google/protobuf/pyext/repeated_scalar_container.h                   \
-  python/google/protobuf/pyext/safe_numerics.h                               \
-  python/google/protobuf/pyext/scoped_pyobject_ptr.h                         \
-  python/google/protobuf/pyext/unknown_field_set.cc                          \
-  python/google/protobuf/pyext/unknown_field_set.h                           \
-  python/google/protobuf/python_protobuf.h                                   \
-  python/google/protobuf/reflection.py                                       \
-  python/google/protobuf/service.py                                          \
-  python/google/protobuf/service_reflection.py                               \
-  python/google/protobuf/symbol_database.py                                  \
-  python/google/protobuf/text_encoding.py                                    \
-  python/google/protobuf/text_format.py                                      \
-  python/google/protobuf/unknown_fields.py                                   \
-  python/google/protobuf/util/__init__.py                                    \
-  python/internal.bzl                                                        \
-  python/release.sh                                                          \
-  python/mox.py                                                              \
-  python/setup.cfg                                                           \
-  python/setup.py                                                            \
-  python/stubout.py                                                          \
-  python/tox.ini                                                             \
-  python/README.md
-
-# Note: please keep this in sync with the dist_files rule in ruby/BUILD.bazel.
-ruby_EXTRA_DIST=                                                             \
-  ruby/Gemfile                                                               \
-  ruby/.gitignore                                                            \
-  ruby/README.md                                                             \
-  ruby/Rakefile                                                              \
-  ruby/compatibility_tests/v3.0.0/tests/test_import.proto                    \
-  ruby/compatibility_tests/v3.0.0/tests/stress.rb                            \
-  ruby/compatibility_tests/v3.0.0/tests/repeated_field_test.rb               \
-  ruby/compatibility_tests/v3.0.0/tests/generated_code_test.rb               \
-  ruby/compatibility_tests/v3.0.0/tests/generated_code.proto                 \
-  ruby/compatibility_tests/v3.0.0/tests/basic.rb                             \
-  ruby/compatibility_tests/v3.0.0/test.sh                                    \
-  ruby/compatibility_tests/v3.0.0/Rakefile                                   \
-  ruby/compatibility_tests/v3.0.0/README.md                                  \
-  ruby/ext/google/protobuf_c/convert.c                                       \
-  ruby/ext/google/protobuf_c/convert.h                                       \
-  ruby/ext/google/protobuf_c/defs.c                                          \
-  ruby/ext/google/protobuf_c/defs.h                                          \
-  ruby/ext/google/protobuf_c/extconf.rb                                      \
-  ruby/ext/google/protobuf_c/map.c                                           \
-  ruby/ext/google/protobuf_c/map.h                                           \
-  ruby/ext/google/protobuf_c/message.c                                       \
-  ruby/ext/google/protobuf_c/message.h                                       \
-  ruby/ext/google/protobuf_c/protobuf.c                                      \
-  ruby/ext/google/protobuf_c/protobuf.h                                      \
-  ruby/ext/google/protobuf_c/repeated_field.c                                \
-  ruby/ext/google/protobuf_c/repeated_field.h                                \
-  ruby/ext/google/protobuf_c/ruby-upb.c                                      \
-  ruby/ext/google/protobuf_c/ruby-upb.h                                      \
-  ruby/ext/google/protobuf_c/wrap_memcpy.c                                   \
-  ruby/google-protobuf.gemspec                                               \
-  ruby/lib/google/protobuf/descriptor_dsl.rb                                 \
-  ruby/lib/google/protobuf/message_exts.rb                                   \
-  ruby/lib/google/protobuf/repeated_field.rb                                 \
-  ruby/lib/google/protobuf/well_known_types.rb                               \
-  ruby/lib/google/protobuf.rb                                                \
-  ruby/pom.xml                                                               \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyDescriptor.java           \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyDescriptorPool.java       \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyEnum.java                 \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyEnumDescriptor.java       \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyFieldDescriptor.java      \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyFileDescriptor.java       \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java                  \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java              \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java      \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyProtobuf.java             \
-  ruby/src/main/java/com/google/protobuf/jruby/RubyRepeatedField.java        \
-  ruby/src/main/java/com/google/protobuf/jruby/SentinelOuterClass.java       \
-  ruby/src/main/java/com/google/protobuf/jruby/Utils.java                    \
-  ruby/src/main/java/google/ProtobufJavaService.java                         \
-  ruby/src/main/sentinel.proto                                               \
-  ruby/tests/basic_proto2.rb                                                 \
-  ruby/tests/basic_test_proto2.proto                                         \
-  ruby/tests/basic_test.proto                                                \
-  ruby/tests/basic.rb                                                        \
-  ruby/tests/common_tests.rb                                                 \
-  ruby/tests/encode_decode_test.rb                                           \
-  ruby/tests/gc_test.rb                                                      \
-  ruby/tests/repeated_field_test.rb                                          \
-  ruby/tests/stress.rb                                                       \
-  ruby/tests/generated_code_proto2_test.rb                                   \
-  ruby/tests/generated_code_proto2.proto                                     \
-  ruby/tests/generated_code.proto                                            \
-  ruby/tests/multi_level_nesting_test.proto                                  \
-  ruby/tests/multi_level_nesting_test.rb                                     \
-  ruby/tests/test_import_proto2.proto                                        \
-  ruby/tests/test_import.proto                                               \
-  ruby/tests/test_ruby_package_proto2.proto                                  \
-  ruby/tests/test_ruby_package.proto                                         \
-  ruby/tests/generated_code_test.rb                                          \
-  ruby/tests/well_known_types_test.rb                                        \
-  ruby/tests/type_errors.rb                                                  \
-  ruby/travis-test.sh
-
-all_EXTRA_DIST=$(csharp_EXTRA_DIST) $(java_EXTRA_DIST) $(objectivec_EXTRA_DIST) $(php_EXTRA_DIST) $(python_EXTRA_DIST) $(ruby_EXTRA_DIST)
-
-# Note: please keep this in sync with the common_dist_files rule in BUILD.bazel.
-EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST)              \
-  autogen.sh                                        \
-  generate_descriptor_proto.sh                      \
-  README.md                                         \
-  LICENSE                                           \
-  CONTRIBUTORS.txt                                  \
-  CHANGES.txt                                       \
-  BUILD.bazel                                       \
-  WORKSPACE                                         \
-  CMakeLists.txt                                    \
-  build_defs/BUILD.bazel                            \
-  build_defs/cc_proto_blacklist_test.bzl            \
-  build_defs/compiler_config_setting.bzl            \
-  build_defs/cpp_opts.bzl                           \
-  cmake/CMakeLists.txt                              \
-  cmake/README.md                                   \
-  cmake/conformance.cmake                           \
-  cmake/examples.cmake                              \
-  cmake/install.cmake                               \
-  cmake/libprotobuf-lite.cmake                      \
-  cmake/libprotobuf.cmake                           \
-  cmake/libprotoc.cmake                             \
-  cmake/protobuf-config-version.cmake.in            \
-  cmake/protobuf-config.cmake.in                    \
-  cmake/protobuf-lite.pc.cmake                      \
-  cmake/protobuf-module.cmake.in                    \
-  cmake/protobuf-options.cmake                      \
-  cmake/protobuf.pc.cmake                           \
-  cmake/protoc.cmake                                \
-  cmake/update_file_lists.sh                             \
-  cmake/tests.cmake                                 \
-  cmake/version.rc.in                               \
-  csharp/BUILD.bazel                                \
-  editors/README.txt                                \
-  editors/proto.vim                                 \
-  editors/protobuf-mode.el                          \
-  examples/AddPerson.java                           \
-  examples/BUILD.bazel                              \
-  examples/CMakeLists.txt                           \
-  examples/ListPeople.java                          \
-  examples/Makefile                                 \
-  examples/README.md                                \
-  examples/WORKSPACE                                \
-  examples/add_person.cc                            \
-  examples/add_person.dart                          \
-  examples/add_person.py                            \
-  examples/addressbook.proto                        \
-  examples/go/cmd/add_person/add_person.go          \
-  examples/go/cmd/add_person/add_person_test.go     \
-  examples/go/cmd/list_people/list_people.go        \
-  examples/go/cmd/list_people/list_people_test.go   \
-  examples/go/go.sum                                \
-  examples/go/go.mod                                \
-  examples/list_people.cc                           \
-  examples/list_people.dart                         \
-  examples/list_people.py                           \
-  examples/pubspec.yaml                             \
-  conformance/BUILD.bazel                           \
-  conformance/defs.bzl                              \
-  maven_install.json                                \
-  php/BUILD.bazel                                   \
-  protobuf.bzl                                      \
-  protobuf_deps.bzl                                 \
-  protobuf_release.bzl                              \
-  protobuf_version.bzl                              \
-  ruby/BUILD.bazel                                  \
-  third_party/zlib.BUILD                            \
-  util/python/BUILD.bazel
-
-# Deletes all the files generated by autogen.sh.
-MAINTAINERCLEANFILES =   \
-  aclocal.m4             \
-  ar-lib                 \
-  config.guess           \
-  config.sub             \
-  configure              \
-  depcomp                \
-  install-sh             \
-  ltmain.sh              \
-  Makefile.in            \
-  missing                \
-  mkinstalldirs          \
-  config.h.in            \
-  stamp.h.in             \
-  m4/ltsugar.m4          \
-  m4/libtool.m4          \
-  m4/ltversion.m4        \
-  m4/lt~obsolete.m4      \
-  m4/ltoptions.m4
diff --git a/README.md b/README.md
index ae63158..ad2b4d3 100644
--- a/README.md
+++ b/README.md
@@ -42,8 +42,7 @@
 or you are using C++, it's recommended to build your own protoc binary from
 source.
 
-If you would like to build protoc binary from source, see the [C++ Installation
-Instructions](src/README.md).
+If you would like to build protoc binary from source, see the [C++ Installation Instructions](src/README.md).
 
 Protobuf Runtime Installation
 -----------------------------
diff --git a/WORKSPACE b/WORKSPACE
index d01122a..ebe5331 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -30,11 +30,6 @@
 load("//:protobuf_deps.bzl", "PROTOBUF_MAVEN_ARTIFACTS", "protobuf_deps")
 protobuf_deps()
 
-bind(
-    name = "python_headers",
-    actual = "//util/python:python_headers",
-)
-
 load("@rules_jvm_external//:defs.bzl", "maven_install")
 
 maven_install(
@@ -69,3 +64,11 @@
 
 load("@upb//bazel:workspace_deps.bzl", "upb_deps")
 upb_deps()
+
+load("@upb//bazel:system_python.bzl", "system_python")
+system_python(name = "local_config_python")
+
+bind(
+    name = "python_headers",
+    actual = "@local_config_python//:python_headers",
+)
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755
index 105bf09..0000000
--- a/autogen.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/sh
-
-# Run this script to generate the configure script and other files that will
-# be included in the distribution.  These files are not checked in because they
-# are automatically generated.
-
-set -e
-
-if [ ! -z "$@" ]; then
-  for argument in "$@"; do
-    case $argument in
-	  # make curl silent
-      "-s")
-        curlopts="-s"
-        ;;
-    esac
-  done
-fi
-
-# Check that we're being run from the right directory.
-if test ! -f src/google/protobuf/stubs/common.h; then
-  cat >&2 << __EOF__
-Could not find source code.  Make sure you are running this script from the
-root of the distribution tree.
-__EOF__
-  exit 1
-fi
-
-set -ex
-
-# The absence of a m4 directory in googletest causes autoreconf to fail when
-# building under the CentOS docker image. It's a warning in regular build on
-# Ubuntu/gLinux as well. (This is only needed if git submodules have been
-# initialized, which is typically only needed for testing; see the installation
-# instructions for details.)
-if test -d third_party/googletest; then
-  mkdir -p third_party/googletest/m4
-fi
-
-# TODO(kenton):  Remove the ",no-obsolete" part and fix the resulting warnings.
-autoreconf -f -i -Wall,no-obsolete
-
-rm -rf autom4te.cache config.h.in~
-exit 0
diff --git a/benchmarks/BUILD.bazel b/benchmarks/BUILD.bazel
index cd80ca6..46c908b 100644
--- a/benchmarks/BUILD.bazel
+++ b/benchmarks/BUILD.bazel
@@ -2,6 +2,11 @@
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//:protobuf.bzl", "internal_py_proto_library", "internal_php_proto_library")
+
+################################################################################
+# Benchmark Protos
+################################################################################
 
 proto_library(
     name = "benchmarks_proto",
@@ -34,6 +39,26 @@
     ],
 )
 
+internal_php_proto_library(
+    name = "benchmarks_php_proto",
+    srcs = ["benchmarks.proto"],
+    outs = [
+        "Benchmarks/BenchmarkDataset.php",
+        "GPBMetadata/Benchmarks.php",
+    ],
+    visibility = [
+        "//benchmarks:__subpackages__",
+    ],
+)
+
+internal_py_proto_library(
+    name = "benchmarks_py_proto",
+    srcs = ["benchmarks.proto"],
+    visibility = [
+        "//benchmarks:__subpackages__",
+    ],
+)
+
 proto_library(
     name = "google_size_proto",
     srcs = [
@@ -65,19 +90,13 @@
     ],
 )
 
+################################################################################
+# Distribution files
+################################################################################
+
 pkg_files(
     name = "dist_files",
-    srcs = glob(
-        [
-            "*",
-            "python/*.cc",
-            "util/*.cc",
-        ],
-        exclude = [
-            "__init__.py",  # not in autotools dist
-            "go/*",
-        ],
-    ),
+    srcs = glob(["*"]),
     strip_prefix = strip_prefix.from_root(""),
 )
 
@@ -93,6 +112,10 @@
         "//benchmarks/datasets/google_message2:dist_files",
         "//benchmarks/datasets/google_message3:dist_files",
         "//benchmarks/datasets/google_message4:dist_files",
+        "//benchmarks/java:dist_files",
+        "//benchmarks/php:dist_files",
+        "//benchmarks/python:dist_files",
+        "//benchmarks/util:dist_files",
     ],
     visibility = ["//pkg:__pkg__"],
 )
diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am
deleted file mode 100644
index 3ab35e3..0000000
--- a/benchmarks/Makefile.am
+++ /dev/null
@@ -1,664 +0,0 @@
-benchmarks_protoc_inputs_benchmark_wrapper =                               \
-	benchmarks.proto
-
-benchmarks_protoc_inputs =                                                 \
-	datasets/google_message1/proto3/benchmark_message1_proto3.proto
-
-benchmarks_protoc_inputs_proto2 =                                          \
-	datasets/google_message1/proto2/benchmark_message1_proto2.proto          \
-	datasets/google_message2/benchmark_message2.proto                        \
-	datasets/google_message3/benchmark_message3.proto                        \
-	datasets/google_message3/benchmark_message3_1.proto                      \
-	datasets/google_message3/benchmark_message3_2.proto                      \
-	datasets/google_message3/benchmark_message3_3.proto                      \
-	datasets/google_message3/benchmark_message3_4.proto                      \
-	datasets/google_message3/benchmark_message3_5.proto                      \
-	datasets/google_message3/benchmark_message3_6.proto                      \
-	datasets/google_message3/benchmark_message3_7.proto                      \
-	datasets/google_message3/benchmark_message3_8.proto                      \
-	datasets/google_message4/benchmark_message4.proto                        \
-	datasets/google_message4/benchmark_message4_1.proto                      \
-	datasets/google_message4/benchmark_message4_2.proto                      \
-	datasets/google_message4/benchmark_message4_3.proto
-
-make_tmp_dir:
-	mkdir -p 'tmp/java/src/main/java'
-	touch make_tmp_dir
-
-
-# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
-# relative to srcdir, which may not be the same as the current directory when
-# building out-of-tree.
-protoc_middleman: make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper)
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd/cpp --java_out=$$oldpwd/tmp/java/src/main/java --python_out=$$oldpwd/tmp $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) )
-	touch protoc_middleman
-
-protoc_middleman2:  make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs_proto2) $(well_known_type_protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd/cpp --java_out=$$oldpwd/tmp/java/src/main/java --python_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2) )
-	touch protoc_middleman2
-
-all_data = $$(find $$(cd $(srcdir) && pwd) -type f -name "dataset.*.pb" -not -path "$$(cd $(srcdir) && pwd)/tmp/*")
-
-############# CPP RULES ##############
-
-benchmarks_protoc_outputs =                                                \
-	cpp/benchmarks.pb.cc                                                     \
-	cpp/datasets/google_message1/proto3/benchmark_message1_proto3.pb.cc
-
-benchmarks_protoc_outputs_header =                                         \
-	cpp/benchmarks.pb.h                                                      \
-	cpp/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h
-
-benchmarks_protoc_outputs_proto2_header =                                  \
-	cpp/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h       \
-	cpp/datasets/google_message2/benchmark_message2.pb.h                     \
-	cpp/datasets/google_message3/benchmark_message3.pb.h                     \
-	cpp/datasets/google_message3/benchmark_message3_1.pb.h                   \
-	cpp/datasets/google_message3/benchmark_message3_2.pb.h                   \
-	cpp/datasets/google_message3/benchmark_message3_3.pb.h                   \
-	cpp/datasets/google_message3/benchmark_message3_4.pb.h                   \
-	cpp/datasets/google_message3/benchmark_message3_5.pb.h                   \
-	cpp/datasets/google_message3/benchmark_message3_6.pb.h                   \
-	cpp/datasets/google_message3/benchmark_message3_7.pb.h                   \
-	cpp/datasets/google_message3/benchmark_message3_8.pb.h                   \
-	cpp/datasets/google_message4/benchmark_message4.pb.h                     \
-	cpp/datasets/google_message4/benchmark_message4_1.pb.h                   \
-	cpp/datasets/google_message4/benchmark_message4_2.pb.h                   \
-	cpp/datasets/google_message4/benchmark_message4_3.pb.h
-
-benchmarks_protoc_outputs_proto2 =                                         \
-	cpp/datasets/google_message1/proto2/benchmark_message1_proto2.pb.cc      \
-	cpp/datasets/google_message2/benchmark_message2.pb.cc                    \
-	cpp/datasets/google_message3/benchmark_message3.pb.cc                    \
-	cpp/datasets/google_message3/benchmark_message3_1.pb.cc                  \
-	cpp/datasets/google_message3/benchmark_message3_2.pb.cc                  \
-	cpp/datasets/google_message3/benchmark_message3_3.pb.cc                  \
-	cpp/datasets/google_message3/benchmark_message3_4.pb.cc                  \
-	cpp/datasets/google_message3/benchmark_message3_5.pb.cc                  \
-	cpp/datasets/google_message3/benchmark_message3_6.pb.cc                  \
-	cpp/datasets/google_message3/benchmark_message3_7.pb.cc                  \
-	cpp/datasets/google_message3/benchmark_message3_8.pb.cc                  \
-	cpp/datasets/google_message4/benchmark_message4.pb.cc                    \
-	cpp/datasets/google_message4/benchmark_message4_1.pb.cc                  \
-	cpp/datasets/google_message4/benchmark_message4_2.pb.cc                  \
-	cpp/datasets/google_message4/benchmark_message4_3.pb.cc
-
-
-$(benchmarks_protoc_outputs): protoc_middleman
-$(benchmarks_protoc_outputs_header): protoc_middleman
-$(benchmarks_protoc_outputs_proto2): protoc_middleman2
-$(benchmarks_protoc_outputs_proto2_header): protoc_middleman2
-
-initialize_submodule:
-	oldpwd=`pwd`
-	cd $(top_srcdir) && git submodule update --init -r third_party/benchmark && \
-		cd third_party/benchmark && cmake -DCMAKE_BUILD_TYPE=Release && make
-	cd $$oldpwd
-	touch initialize_submodule
-
-$(top_srcdir)/third_party/benchmark/src/libbenchmark.a: initialize_submodule
-
-AM_CXXFLAGS = $(NO_OPT_CXXFLAGS) $(PROTOBUF_OPT_FLAG) -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare
-
-bin_PROGRAMS = cpp-benchmark
-
-cpp_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-cpp_benchmark_SOURCES = cpp/cpp_benchmark.cc
-cpp_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(top_srcdir)/third_party/benchmark/include
-# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-# See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
-cpp/cpp_benchmark-cpp_benchmark.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-cpp/benchmark-cpp_benchmark.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-nodist_cpp_benchmark_SOURCES =                                             \
-	$(benchmarks_protoc_outputs)                                             \
-	$(benchmarks_protoc_outputs_proto2)                                      \
-	$(benchmarks_protoc_outputs_proto2_header)                               \
-	$(benchmarks_protoc_outputs_header)
-
-cpp: protoc_middleman protoc_middleman2 cpp-benchmark initialize_submodule
-	./cpp-benchmark $(all_data)
-
-############ CPP RULES END ############
-
-############# JAVA RULES ##############
-
-java_benchmark_testing_files =                                      \
-	java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
-
-javac_middleman: $(java_benchmark_testing_files) protoc_middleman protoc_middleman2
-	cp -r $(srcdir)/java tmp
-	mkdir -p tmp/java/lib
-	cp $(top_srcdir)/java/core/target/*.jar tmp/java/lib/protobuf-java.jar
-	cd tmp/java && mvn clean compile assembly:single -Dprotobuf.version=$(PACKAGE_VERSION) && cd ../..
-	@touch javac_middleman
-
-java-benchmark: javac_middleman
-	@echo "Writing shortcut script java-benchmark..."
-	@echo '#! /bin/bash' > java-benchmark
-	@echo 'all_data=""' >> java-benchmark
-	@echo 'conf=()' >> java-benchmark
-	@echo 'data_files=""' >> java-benchmark
-	@echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+="$$arg,"; fi; done' >> java-benchmark
-	@echo 'java -cp '\"tmp/java/target/*:$(top_srcdir)/java/core/target/*:$(top_srcdir)/java/util/target/*\"" \\" >>java-benchmark
-	@echo '   com.google.caliper.runner.CaliperMain com.google.protobuf.ProtoCaliperBenchmark -i runtime '"\\"  >> java-benchmark
-	@echo '   -b serializeToByteArray,serializeToMemoryStream,deserializeFromByteArray,deserializeFromMemoryStream '"\\" >> java-benchmark
-	@echo '   -DdataFile=$${data_files:0:-1} $${conf[*]}' >> java-benchmark
-	@chmod +x java-benchmark
-
-java: protoc_middleman protoc_middleman2 java-benchmark
-	./java-benchmark $(all_data)
-
-############# JAVA RULES END ##############
-
-
-############# PYTHON RULES ##############
-
-python_add_init: protoc_middleman protoc_middleman2
-	all_file=`find tmp -type f -regex '.*\.py'` &&                   \
-	for file in $${all_file[@]}; do                                  \
-		path="$${file%/*}";                                            \
-		while true; do                                                 \
-			touch "$$path/__init__.py" && chmod +x "$$path/__init__.py"; \
-			if [[ $$path != *"/"* ]]; then break; fi;                    \
-			path=$${path%/*};                                            \
-		done                                                           \
-	done
-
-python_cpp_pkg_flags = `pkg-config --cflags --libs python3`
-
-lib_LTLIBRARIES = libbenchmark_messages.la
-libbenchmark_messages_la_SOURCES = python/python_benchmark_messages.cc
-libbenchmark_messages_la_LIBADD = $(top_srcdir)/src/.libs/libprotobuf.la
-libbenchmark_messages_la_LDFLAGS = -version-info 1:0:0 -export-dynamic
-libbenchmark_messages_la_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp $(python_cpp_pkg_flags)
-libbenchmark_messages_la-python_benchmark_messages.$(OBJEXT): $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2)
-nodist_libbenchmark_messages_la_SOURCES =                         \
-	$(benchmarks_protoc_outputs)                                    \
-	$(benchmarks_protoc_outputs_proto2)                             \
-	$(benchmarks_protoc_outputs_proto2_header)                      \
-	$(benchmarks_protoc_outputs_header)
-
-python-pure-python-benchmark: python_add_init
-	@echo "Writing shortcut script python-pure-python-benchmark..."
-	@echo '#! /bin/bash' > python-pure-python-benchmark
-	@echo export LD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-pure-python-benchmark
-	@echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-pure-python-benchmark
-	@echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'python\' >> python-pure-python-benchmark
-	@echo cp $(srcdir)/python/py_benchmark.py tmp >> python-pure-python-benchmark
-	@echo python3 tmp/py_benchmark.py '$$@' >> python-pure-python-benchmark
-	@chmod +x python-pure-python-benchmark
-
-python-cpp-reflection-benchmark: python_add_init
-	@echo "Writing shortcut script python-cpp-reflection-benchmark..."
-	@echo '#! /bin/bash' > python-cpp-reflection-benchmark
-	@echo export LD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-reflection-benchmark
-	@echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-reflection-benchmark
-	@echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'cpp\' >> python-cpp-reflection-benchmark
-	@echo cp $(srcdir)/python/py_benchmark.py tmp >> python-cpp-reflection-benchmark
-	@echo python3 tmp/py_benchmark.py '$$@' >> python-cpp-reflection-benchmark
-	@chmod +x python-cpp-reflection-benchmark
-
-python-cpp-generated-code-benchmark: python_add_init libbenchmark_messages.la
-	@echo "Writing shortcut script python-cpp-generated-code-benchmark..."
-	@echo '#! /bin/bash' > python-cpp-generated-code-benchmark
-	@echo export LD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-generated-code-benchmark
-	@echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/.libs >> python-cpp-generated-code-benchmark
-	@echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'cpp\' >> python-cpp-generated-code-benchmark
-	@echo cp $(srcdir)/python/py_benchmark.py tmp >> python-cpp-generated-code-benchmark
-	@echo python3 tmp/py_benchmark.py --cpp_generated '$$@' >> python-cpp-generated-code-benchmark
-	@chmod +x python-cpp-generated-code-benchmark
-
-python-pure-python: python-pure-python-benchmark
-	./python-pure-python-benchmark $(all_data)
-
-python-cpp-reflection: python-cpp-reflection-benchmark
-	./python-cpp-reflection-benchmark $(all_data)
-
-python-cpp-generated-code: python-cpp-generated-code-benchmark
-	./python-cpp-generated-code-benchmark $(all_data)
-
-############# PYTHON RULES END ##############
-
-############# GO RULES BEGIN ##############
-
-benchmarks_protoc_inputs_proto2_message1 =                                 \
-	datasets/google_message1/proto2/benchmark_message1_proto2.proto
-
-benchmarks_protoc_inputs_proto2_message2 =                                 \
-	datasets/google_message2/benchmark_message2.proto
-
-benchmarks_protoc_inputs_proto2_message3 =                                 \
-	datasets/google_message3/benchmark_message3.proto                        \
-	datasets/google_message3/benchmark_message3_1.proto                      \
-	datasets/google_message3/benchmark_message3_2.proto                      \
-	datasets/google_message3/benchmark_message3_3.proto                      \
-	datasets/google_message3/benchmark_message3_4.proto                      \
-	datasets/google_message3/benchmark_message3_5.proto                      \
-	datasets/google_message3/benchmark_message3_6.proto                      \
-	datasets/google_message3/benchmark_message3_7.proto                      \
-	datasets/google_message3/benchmark_message3_8.proto
-
-benchmarks_protoc_inputs_proto2_message4 =                                 \
-	datasets/google_message4/benchmark_message4.proto                        \
-	datasets/google_message4/benchmark_message4_1.proto                      \
-	datasets/google_message4/benchmark_message4_2.proto                      \
-	datasets/google_message4/benchmark_message4_3.proto
-
-go_protoc_middleman: make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs) $(benchmarks_protoc_inputs_proto2_message1) $(benchmarks_protoc_inputs_proto2_message2) $(benchmarks_protoc_inputs_proto2_message3) $(benchmarks_protoc_inputs_proto2_message4) $(well_known_type_protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_benchmark_wrapper) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message1) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message2) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message3) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message4) )
-	touch go_protoc_middleman
-
-go-benchmark: go_protoc_middleman
-	@echo "Writing shortcut script go-benchmark..."
-	@echo '#! /bin/bash' > go-benchmark
-	@echo 'cd $(srcdir)/go' >> go-benchmark
-	@echo 'all_data=""' >> go-benchmark
-	@echo 'conf=()' >> go-benchmark
-	@echo 'data_files=()' >> go-benchmark
-	@echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+=("$$arg"); fi; done' >> go-benchmark
-	@echo 'go test -bench=. $${conf[*]} -- $${data_files[*]}' >> go-benchmark
-	@echo 'cd ..' >> go-benchmark
-	@chmod +x go-benchmark
-
-go: go_protoc_middleman go-benchmark
-	./go-benchmark $(all_data)
-
-############# GO RULES END ##############
-
-############# GOGO RULES BEGIN ############
-
-cpp_no_group_benchmarks_protoc_outputs_header =                             \
-	gogo/cpp_no_group/benchmarks.pb.h                                         \
-	gogo/cpp_no_group/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h
-
-cpp_no_group_benchmarks_protoc_outputs =                                    \
-	gogo/cpp_no_group/benchmarks.pb.cc                                        \
-	gogo/cpp_no_group/datasets/google_message1/proto3/benchmark_message1_proto3.pb.cc
-
-cpp_no_group_benchmarks_protoc_outputs_proto2_header =                      \
-	gogo/cpp_no_group/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h \
-	gogo/cpp_no_group/datasets/google_message2/benchmark_message2.pb.h        \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3.pb.h        \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_1.pb.h      \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_2.pb.h      \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_3.pb.h      \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_4.pb.h      \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_5.pb.h      \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_6.pb.h      \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_7.pb.h      \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_8.pb.h      \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4.pb.h        \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_1.pb.h      \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_2.pb.h      \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_3.pb.h
-
-cpp_no_group_benchmarks_protoc_outputs_proto2 =                             \
-	gogo/cpp_no_group/datasets/google_message1/proto2/benchmark_message1_proto2.pb.cc \
-	gogo/cpp_no_group/datasets/google_message2/benchmark_message2.pb.cc       \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3.pb.cc       \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_1.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_2.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_3.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_4.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_5.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_6.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_7.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_8.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4.pb.cc       \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_1.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_2.pb.cc     \
-	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_3.pb.cc
-
-$(cpp_no_group_benchmarks_protoc_outputs): cpp_no_group_protoc_middleman
-$(cpp_no_group_benchmarks_protoc_outputs_header): cpp_no_group_protoc_middleman
-$(cpp_no_group_benchmarks_protoc_outputs_proto2): cpp_no_group_protoc_middleman
-$(cpp_no_group_benchmarks_protoc_outputs_proto2_header): cpp_no_group_protoc_middleman
-
-generate_cpp_no_group_benchmark_code:
-	cp $(srcdir)/cpp/cpp_benchmark.cc gogo/cpp_no_group/cpp_benchmark.cc
-	sed -i -e "s/\#include \"datasets/\#include \"gogo\/cpp_no_group\/datasets/g" gogo/cpp_no_group/cpp_benchmark.cc
-	sed -i -e "s/\#include \"benchmarks.pb.h/\#include \"gogo\/cpp_no_group\/benchmarks.pb.h/g" gogo/cpp_no_group/cpp_benchmark.cc
-	touch generate_cpp_no_group_benchmark_code
-
-bin_PROGRAMS += cpp-no-group-benchmark
-cpp_no_group_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
-cpp_no_group_benchmark_SOURCES = gogo/cpp_no_group/cpp_benchmark.cc
-cpp_no_group_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/gogo/cpp_no_group -I$(top_srcdir)/third_party/benchmark/include
-# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-# See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
-gogo/cpp_no_group/cpp_no_group_benchmark-cpp_benchmark.$(OBJEXT): $(cpp_no_group_benchmarks_protoc_outputs) $(cpp_no_group_benchmarks_protoc_outputs_proto2) $(cpp_no_group_benchmarks_protoc_outputs_header) \
-	$(cpp_no_group_benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/third_party/benchmark/src/libbenchmark.a generate_cpp_no_group_benchmark_code
-gogo/cpp_no_group/cpp_benchmark.cc: generate_cpp_no_group_benchmark_code
-nodist_cpp_no_group_benchmark_SOURCES =                                    \
-	$(cpp_no_group_benchmarks_protoc_outputs_proto2)                         \
-	$(cpp_no_group_benchmarks_protoc_outputs)                                \
-	$(cpp_no_group_benchmarks_protoc_outputs_header)                         \
-	$(cpp_no_group_benchmarks_protoc_outputs_proto2_header)
-
-cpp_no_group: cpp_no_group_protoc_middleman generate_gogo_data cpp-no-group-benchmark
-	./cpp-no-group-benchmark $(gogo_data)
-
-gogo_proto_middleman: protoc-gen-gogoproto
-	mkdir -p "tmp/gogo_proto"
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I$(srcdir) -I$(top_srcdir) --plugin=protoc-gen-gogoproto --gogoproto_out=$$oldpwd/tmp/gogo_proto $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2) )
-	touch gogo_proto_middleman
-
-gogo_data = $$(for data in $(all_data); do echo "tmp/gogo_data$${data\#$(srcdir)}"; done | xargs)
-
-generate_gogo_data: protoc_middleman protoc_middleman2 gogo-data-scrubber
-	mkdir -p `dirname $(gogo_data)`
-	./gogo-data-scrubber $(all_data) $(gogo_data)
-	touch generate_gogo_data
-
-make_tmp_dir_gogo:
-	mkdir -p tmp/go_no_group/benchmark_code
-	mkdir -p tmp/gogofast/benchmark_code
-	mkdir -p tmp/gogofaster/benchmark_code
-	mkdir -p tmp/gogoslick/benchmark_code
-	touch make_tmp_dir_gogo
-
-go_no_group_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_benchmark_wrapper) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message1) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message2) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message3) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message4) )
-	touch go_no_group_protoc_middleman
-
-cpp_no_group_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_benchmark_wrapper) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message1) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message2) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message3) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message4) )
-	touch cpp_no_group_protoc_middleman
-
-gogofast_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_benchmark_wrapper) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message1) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message2) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message3) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message4) )
-	touch gogofast_protoc_middleman
-
-gogofaster_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_benchmark_wrapper) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message1) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message2) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message3) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message4) )
-	touch gogofaster_protoc_middleman
-
-gogoslick_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_benchmark_wrapper) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message1) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message2) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message3) )
-	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message4) )
-	touch gogoslick_protoc_middleman
-
-generate-gogo-benchmark-code:
-	@echo '#! /bin/bash' > generate-gogo-benchmark-code
-	@echo 'cp $(srcdir)/go/go_benchmark_test.go tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
-	@echo 'sed -i -e "s/\.\.\/tmp/../g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
-	@echo 'sed -i -e "s/b\.Run(\"\(.*\)\"/b.Run(\"\1\_$$1\"/g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
-	@echo 'if [[ $$2 == 1 ]]; then sed -i -e "s/github\.com\/golang/github.com\/gogo/g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go; fi ' >> generate-gogo-benchmark-code
-	@chmod +x generate-gogo-benchmark-code
-
-generate_all_gogo_benchmark_code: generate-gogo-benchmark-code make_tmp_dir_gogo
-	./generate-gogo-benchmark-code go_no_group 0
-	./generate-gogo-benchmark-code gogofast 1
-	./generate-gogo-benchmark-code gogofaster 1
-	./generate-gogo-benchmark-code gogoslick 1
-
-gogo-benchmark:
-	@echo "Writing shortcut script gogo-benchmark..."
-	@echo '#! /bin/bash' > gogo-benchmark
-	@echo 'cd tmp/$$1/benchmark_code' >> gogo-benchmark
-	@echo 'shift' >> gogo-benchmark
-	@echo 'all_data=""' >> gogo-benchmark
-	@echo 'for data_file in $$@; do all_data="$$all_data ../../../$$data_file"; done' >> gogo-benchmark
-	@echo 'go test -bench=. -- $$all_data' >> gogo-benchmark
-	@echo 'cd ../..' >> gogo-benchmark
-	@chmod +x gogo-benchmark
-
-go_no_group: go_no_group_protoc_middleman generate_gogo_data generate_all_gogo_benchmark_code gogo-benchmark
-	./gogo-benchmark go_no_group $(gogo_data)
-
-gogofast: gogofast_protoc_middleman generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
-	./gogo-benchmark gogofast $(gogo_data)
-
-gogofaster: gogofaster_protoc_middleman  generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
-	./gogo-benchmark gogofaster $(gogo_data)
-
-gogoslick: gogoslick_protoc_middleman  generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
-	./gogo-benchmark gogoslick $(gogo_data)
-
-
-############# GOGO RULES END ############
-
-
-############ UTIL RULES BEGIN ############
-
-bin_PROGRAMS += protoc-gen-gogoproto gogo-data-scrubber protoc-gen-proto2_to_proto3 proto3-data-stripper
-
-protoc_gen_gogoproto_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/src/libprotoc.la
-protoc_gen_gogoproto_SOURCES = util/protoc-gen-gogoproto.cc
-protoc_gen_gogoproto_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-
-gogo_data_scrubber_LDADD = $(top_srcdir)/src/libprotobuf.la
-gogo_data_scrubber_SOURCES = util/gogo_data_scrubber.cc
-gogo_data_scrubber_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-util/gogo_data_scrubber-gogo_data_scrubber.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header)
-nodist_gogo_data_scrubber_SOURCES =                                        \
-	$(benchmarks_protoc_outputs)                                             \
-	$(benchmarks_protoc_outputs_proto2)                                      \
-	$(benchmarks_protoc_outputs_proto2_header)                               \
-	$(benchmarks_protoc_outputs_header)
-
-protoc_gen_proto2_to_proto3_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/src/libprotoc.la
-protoc_gen_proto2_to_proto3_SOURCES = util/protoc-gen-proto2_to_proto3.cc
-protoc_gen_proto2_to_proto3_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-
-proto3_data_stripper_LDADD = $(top_srcdir)/src/libprotobuf.la
-proto3_data_stripper_SOURCES = util/proto3_data_stripper.cc
-proto3_data_stripper_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
-util/proto3_data_stripper-proto3_data_stripper.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header)
-nodist_proto3_data_stripper_SOURCES =                                      \
-	$(benchmarks_protoc_outputs)                                             \
-	$(benchmarks_protoc_outputs_proto2)                                      \
-	$(benchmarks_protoc_outputs_proto2_header)                               \
-	$(benchmarks_protoc_outputs_header)
-
-
-############ UTIL RULES END ############
-
-############ PROTO3 PREPARATION BEGIN #############
-
-proto3_proto_middleman: protoc-gen-proto2_to_proto3
-	mkdir -p "tmp/proto3_proto"
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I$(srcdir) -I$(top_srcdir) --plugin=protoc-gen-proto2_to_proto3 --proto2_to_proto3_out=$$oldpwd/tmp/proto3_proto $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2) )
-	touch proto3_proto_middleman
-
-full_srcdir = $$(cd $(srcdir) && pwd)
-proto3_data = $$(for data in $(all_data); do echo $(full_srcdir)"/tmp/proto3_data$${data\#$(full_srcdir)}"; done | xargs)
-
-generate_proto3_data: protoc_middleman protoc_middleman2 proto3-data-stripper
-	mkdir -p `dirname $(proto3_data)`
-	./proto3-data-stripper $(all_data) $(proto3_data)
-	touch generate_proto3_data
-
-############ PROTO3 PREPARATION END #############
-
-############ PHP RULES BEGIN #################
-
-proto3_middleman_php: proto3_proto_middleman
-	mkdir -p "tmp/php"
-	oldpwd=`pwd` && ( cd tmp/proto3_proto && $$oldpwd/../src/protoc$(EXEEXT) -I$(srcdir) -I$(top_srcdir) --php_out=$$oldpwd/tmp/php $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2) )
-	touch proto3_middleman_php
-
-php-benchmark: proto3_middleman_php generate_proto3_data
-	mkdir -p "tmp/php/Google/Protobuf/Benchmark" && cp php/PhpBenchmark.php "tmp/php/Google/Protobuf/Benchmark"
-	cp php/autoload.php "tmp/php"
-	@echo "Writing shortcut script php-benchmark..."
-	@echo '#! /bin/bash' > php-benchmark
-	@echo 'export PROTOBUF_PHP_SRCDIR="$$(cd $(top_srcdir) && pwd)/php/src"' >> php-benchmark
-	@echo 'cd tmp/php' >> php-benchmark
-	@echo 'export CURRENT_DIR=$$(pwd)' >> php-benchmark
-	@echo 'php -d auto_prepend_file="autoload.php" -d include_path="$$(pwd)" Google/Protobuf/Benchmark/PhpBenchmark.php $$@' >> php-benchmark
-	@echo 'cd ../..' >> php-benchmark
-	@chmod +x php-benchmark
-
-php: php-benchmark proto3_middleman_php
-	./php-benchmark --behavior_prefix="php" $(proto3_data)
-
-php_c_extension:
-	cd $(top_srcdir)/php/ext/google/protobuf && phpize && ./configure CFLAGS='-O3' && make -j8
-
-php-c-benchmark: proto3_middleman_php generate_proto3_data php_c_extension php_c_extension
-	mkdir -p "tmp/php/Google/Protobuf/Benchmark" && cp php/PhpBenchmark.php "tmp/php/Google/Protobuf/Benchmark"
-	cp php/autoload.php "tmp/php"
-	@echo "Writing shortcut script php-c-benchmark..."
-	@echo '#! /bin/bash' > php-c-benchmark
-	@echo 'export PROTOBUF_PHP_SRCDIR="$$(cd $(top_srcdir) && pwd)/php/src"' >> php-c-benchmark
-	@echo 'export PROTOBUF_PHP_EXTDIR="$$PROTOBUF_PHP_SRCDIR/../ext/google/protobuf/modules"' >> php-c-benchmark
-	@echo 'cd tmp/php' >> php-c-benchmark
-	@echo 'export CURRENT_DIR=$$(pwd)' >> php-c-benchmark
-	@echo 'php -d auto_prepend_file="autoload.php" -d include_path="$$(pwd)" -d extension="$$PROTOBUF_PHP_EXTDIR/protobuf.so" Google/Protobuf/Benchmark/PhpBenchmark.php $$@' >> php-c-benchmark
-	@echo 'cd ../..' >> php-c-benchmark
-	@chmod +x php-c-benchmark
-
-php_c: php-c-benchmark proto3_middleman_php
-	./php-c-benchmark --behavior_prefix="php_c" $(proto3_data)
-
-
-############ PHP RULES END #################
-
-############ protobuf.js RULE BEGIN #############
-
-pbjs_preparation:
-	mkdir -p tmp/protobuf.js
-	cd tmp/protobuf.js && git clone https://github.com/dcodeIO/protobuf.js.git && \
-			cd protobuf.js && npm install && npm run build
-	cd tmp/protobuf.js && npm install benchmark
-	cp protobuf.js/* tmp/protobuf.js
-	cp js/benchmark_suite.js tmp/protobuf.js
-	touch pbjs_preparation
-
-pbjs_middleman: pbjs_preparation
-	export OLDDIR=$$(pwd) && cd tmp/protobuf.js && node generate_pbjs_files.js --target static-module --include_path=$$OLDDIR -o generated_bundle_code.js $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2)
-	touch pbjs_middleman
-
-pbjs-benchmark: pbjs_middleman
-	@echo '#! /bin/bash' > pbjs-benchmark
-	@echo 'cd tmp/protobuf.js' >> pbjs-benchmark
-	@echo 'sed -i "s/protobufjs/.\/protobuf.js/g" generated_bundle_code.js' >> pbjs-benchmark
-	@echo 'env NODE_PATH=".:./node_modules:$$NODE_PATH" node protobufjs_benchmark.js $$@' >> pbjs-benchmark
-	@chmod +x pbjs-benchmark
-
-pbjs: pbjs-benchmark
-	./pbjs-benchmark $(all_data)
-
-############ protobuf.js RULE END #############
-
-############ JS RULE BEGIN #############
-
-js_preparation:
-	mkdir -p tmp/js
-	oldpwd=$$(pwd) && cd $(top_srcdir)/js && npm install && npm test
-	cd tmp/js && npm install benchmark
-	cp js/* tmp/js
-	touch js_preparation
-
-js_middleman: js_preparation
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --js_out=import_style=commonjs,binary:$$oldpwd/tmp/js $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2))
-	touch js_middleman
-
-js-benchmark: js_middleman
-	@echo '#! /bin/bash' > js-benchmark
-	@echo 'export TOP_JS_SRCDIR=$$(cd $(top_srcdir)/js && pwd)' >> js-benchmark
-	@echo 'cd tmp/js' >> js-benchmark
-	@echo 'env NODE_PATH="$$TOP_JS_SRCDIR:.:./node_modules:$$NODE_PATH" node --max-old-space-size=4096 js_benchmark.js $$@' >> js-benchmark
-	@chmod +x js-benchmark
-
-js: js-benchmark
-	./js-benchmark $(all_data)
-
-############ JS RULE END #############
-
-EXTRA_DIST =									\
-	$(benchmarks_protoc_inputs_benchmark_wrapper)				\
-	$(benchmarks_protoc_inputs)						\
-	$(benchmarks_protoc_inputs_proto2)					\
-	google_size.proto
-
-MAINTAINERCLEANFILES =                                                     \
-	Makefile.in
-
-CLEANFILES =                                                               \
-	$(benchmarks_protoc_outputs)                                             \
-	$(benchmarks_protoc_outputs_header)                                      \
-	$(benchmarks_protoc_outputs_proto2)                                      \
-	$(benchmarks_protoc_outputs_proto2_header)                               \
-	initialize_submodule                                                     \
-	make_tmp_dir                                                             \
-	protoc_middleman                                                         \
-	protoc_middleman2                                                        \
-	javac_middleman                                                          \
-	java-benchmark                                                           \
-	python_cpp_proto_library                                                 \
-	python-pure-python-benchmark                                             \
-	python-cpp-reflection-benchmark                                          \
-	python-cpp-generated-code-benchmark                                      \
-	go-benchmark                                                             \
-	go_protoc_middleman                                                      \
-	make_tmp_dir_gogo                                                        \
-	gogo_proto_middleman                                                     \
-	generate_gogo_data                                                       \
-	go_no_group_protoc_middleman                                             \
-	go_no_group                                                              \
-	go-no-group-benchmark                                                    \
-	$(cpp_no_group_benchmarks_protoc_outputs_header)                         \
-	$(cpp_no_group_benchmarks_protoc_outputs)                                \
-	$(cpp_no_group_benchmarks_protoc_outputs_proto2_header)                  \
-	$(cpp_no_group_benchmarks_protoc_outputs_proto2)                         \
-	generate_all_gogo_benchmark_code                                         \
-	generate-gogo-benchmark-code                                             \
-	cpp_no_group_protoc_middleman                                            \
-	generate_cpp_no_group_benchmark_code                                     \
-	generate_gogo_benchmark_code                                             \
-	gogofast_protoc_middleman                                                \
-	gogofast                                                                 \
-	gogofaster_protoc_middleman                                              \
-	gogofaster                                                               \
-	gogoslick_protoc_middleman                                               \
-	gogoslick                                                                \
-	gogo-benchmark                                                           \
-	gogo/cpp_no_group/cpp_benchmark.*                                        \
-	proto3_proto_middleman                                                   \
-	generate_proto3_data                                                     \
-	php-benchmark                                                            \
-	php-c-benchmark                                                          \
-	proto3_middleman_php                                                     \
-	pbjs_preparation                                                         \
-	pbjs_middleman                                                           \
-	pbjs-benchmark                                                           \
-	js_preparation                                                           \
-	js_middleman                                                             \
-	js-benchmark
-
-clean-local:
-	-rm -rf tmp/*
-
diff --git a/benchmarks/cpp/BUILD.bazel b/benchmarks/cpp/BUILD.bazel
index 7a3d3ba..72100e6 100644
--- a/benchmarks/cpp/BUILD.bazel
+++ b/benchmarks/cpp/BUILD.bazel
@@ -1,12 +1,13 @@
 load("@rules_cc//cc:defs.bzl", "cc_binary")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//benchmarks:internal.bzl", "internal_benchmark_test")
 
+# The benchmark binary which can be run over any dataset.
 cc_binary(
-    name = "cpp",
+    name = "cpp_benchmark",
     srcs = [
         "cpp_benchmark.cc",
     ],
-    tags = ["benchmark"],
     deps = [
         "//:protobuf",
         "//benchmarks:benchmarks_cc_proto",
@@ -15,6 +16,15 @@
     ],
 )
 
+# A pre-configured binary using the checked in datasets.
+internal_benchmark_test(
+    name = "cpp",
+    binary = ":cpp_benchmark",
+    datasets = [
+        "//benchmarks/datasets",
+    ],
+)
+
 pkg_files(
     name = "dist_files",
     srcs = [
diff --git a/benchmarks/cpp/cpp_benchmark.cc b/benchmarks/cpp/cpp_benchmark.cc
index 036d234..0cfb916 100644
--- a/benchmarks/cpp/cpp_benchmark.cc
+++ b/benchmarks/cpp/cpp_benchmark.cc
@@ -32,11 +32,11 @@
 #include <iostream>
 #include "benchmark/benchmark.h"
 #include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
+#include "benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
+#include "benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
+#include "benchmarks/datasets/google_message2/benchmark_message2.pb.h"
+#include "benchmarks/datasets/google_message3/benchmark_message3.pb.h"
+#include "benchmarks/datasets/google_message4/benchmark_message4.pb.h"
 
 
 #define PREFIX "dataset."
diff --git a/benchmarks/datasets/BUILD.bazel b/benchmarks/datasets/BUILD.bazel
index 2a8b402..4d4b195 100644
--- a/benchmarks/datasets/BUILD.bazel
+++ b/benchmarks/datasets/BUILD.bazel
@@ -14,6 +14,21 @@
     ],
     visibility = [
         "//benchmarks:__subpackages__",
+        "//conformance:__subpackages__",
+    ],
+)
+
+filegroup(
+    name = "proto3_datasets",
+    srcs = [
+        "//benchmarks/datasets/google_message1/proto2:proto3_datasets",
+        "//benchmarks/datasets/google_message1/proto3:datasets",
+        "//benchmarks/datasets/google_message2:proto3_datasets",
+    ],
+    visibility = [
+        "//benchmarks:__subpackages__",
+        "//conformance:__subpackages__",
+        "//csharp:__pkg__",
     ],
 )
 
@@ -59,6 +74,46 @@
     ],
 )
 
+py_library(
+    name = "py_protos",
+    visibility = [
+        "//benchmarks:__subpackages__",
+    ],
+    deps = [
+        "//benchmarks/datasets/google_message1/proto2:benchmark_message1_proto2_py_proto",
+        "//benchmarks/datasets/google_message1/proto3:benchmark_message1_proto3_py_proto",
+        "//benchmarks/datasets/google_message2:benchmark_message2_py_proto",
+        "//benchmarks/datasets/google_message3:benchmark_message3_py_proto",
+        "//benchmarks/datasets/google_message4:benchmark_message4_py_proto",
+    ],
+)
+
+filegroup(
+    name = "php_protos",
+    visibility = [
+        "//benchmarks:__subpackages__",
+    ],
+    srcs = [
+        "//benchmarks/datasets/google_message1/proto2:benchmark_message1_proto2_php_proto",
+        "//benchmarks/datasets/google_message1/proto3:benchmark_message1_proto3_php_proto",
+        "//benchmarks/datasets/google_message2:benchmark_message2_php_proto",
+    ],
+)
+
+filegroup(
+    name = "csharp_protos",
+    visibility = [
+        "//benchmarks:__subpackages__",
+    ],
+    srcs = [
+        "//benchmarks/datasets/google_message1/proto2:benchmark_message1_proto2_csharp_proto",
+        "//benchmarks/datasets/google_message1/proto3:benchmark_message1_proto3_csharp_proto",
+        "//benchmarks/datasets/google_message2:benchmark_message2_csharp_proto",
+        "//benchmarks/datasets/google_message3:benchmark_message3_csharp_proto",
+        "//benchmarks/datasets/google_message4:benchmark_message4_csharp_proto",
+    ],
+)
+
 pkg_files(
     name = "dist_files",
     srcs = ["BUILD.bazel"],
diff --git a/benchmarks/datasets/google_message1/proto2/BUILD.bazel b/benchmarks/datasets/google_message1/proto2/BUILD.bazel
index 30caed5..b7ee62c 100644
--- a/benchmarks/datasets/google_message1/proto2/BUILD.bazel
+++ b/benchmarks/datasets/google_message1/proto2/BUILD.bazel
@@ -2,6 +2,8 @@
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//:protobuf.bzl", "internal_py_proto_library", "internal_csharp_proto_library")
+load("//benchmarks/util:compatibility.bzl", "proto3_from_proto2_data", "php_proto3_from_proto2_library")
 
 filegroup(
     name = "datasets",
@@ -13,12 +15,21 @@
     ],
 )
 
+proto3_from_proto2_data(
+    name = "proto3_datasets",
+    srcs = [
+        "dataset.google_message1_proto2.pb",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 proto_library(
     name = "benchmark_message1_proto2_proto",
     srcs = [
         "benchmark_message1_proto2.proto",
     ],
-    strip_import_prefix = "/benchmarks",
     visibility = [
         "//benchmarks/datasets:__pkg__",
     ],
@@ -34,6 +45,14 @@
     ],
 )
 
+internal_csharp_proto_library(
+    name = "benchmark_message1_proto2_csharp_proto",
+    srcs = ["benchmark_message1_proto2.proto"],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 java_proto_library(
     name = "benchmark_message1_proto2_java_proto",
     visibility = [
@@ -44,6 +63,27 @@
     ],
 )
 
+php_proto3_from_proto2_library(
+    name = "benchmark_message1_proto2_php_proto",
+    src = "benchmark_message1_proto2.proto",
+    outs = [
+        "Benchmarks/Proto2/GoogleMessage1.php",
+        "Benchmarks/Proto2/GoogleMessage1SubMessage.php",
+        "GPBMetadata/BenchmarkMessage1Proto2.php",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
+internal_py_proto_library(
+    name = "benchmark_message1_proto2_py_proto",
+    srcs = ["benchmark_message1_proto2.proto"],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 pkg_files(
     name = "dist_files",
     srcs = glob(["*"]),
diff --git a/benchmarks/datasets/google_message1/proto3/BUILD.bazel b/benchmarks/datasets/google_message1/proto3/BUILD.bazel
index 0dc59d1..ae9b400 100644
--- a/benchmarks/datasets/google_message1/proto3/BUILD.bazel
+++ b/benchmarks/datasets/google_message1/proto3/BUILD.bazel
@@ -2,6 +2,7 @@
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_proto//proto:defs.bzl", "proto_library")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//:protobuf.bzl", "internal_py_proto_library", "internal_php_proto_library", "internal_csharp_proto_library")
 
 filegroup(
     name = "datasets",
@@ -18,7 +19,6 @@
     srcs = [
         "benchmark_message1_proto3.proto",
     ],
-    strip_import_prefix = "/benchmarks",
     visibility = [
         "//benchmarks/datasets:__pkg__",
     ],
@@ -34,6 +34,14 @@
     ],
 )
 
+internal_csharp_proto_library(
+    name = "benchmark_message1_proto3_csharp_proto",
+    srcs = ["benchmark_message1_proto3.proto"],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 java_proto_library(
     name = "benchmark_message1_proto3_java_proto",
     visibility = [
@@ -44,6 +52,27 @@
     ],
 )
 
+internal_php_proto_library(
+    name = "benchmark_message1_proto3_php_proto",
+    srcs = ["benchmark_message1_proto3.proto"],
+    outs = [
+        "Benchmarks/Proto3/GoogleMessage1.php",
+        "Benchmarks/Proto3/GoogleMessage1SubMessage.php",
+        "GPBMetadata/BenchmarkMessage1Proto3.php",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
+internal_py_proto_library(
+    name = "benchmark_message1_proto3_py_proto",
+    srcs = ["benchmark_message1_proto3.proto"],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 pkg_files(
     name = "dist_files",
     srcs = glob(["*"]),
diff --git a/benchmarks/datasets/google_message2/BUILD.bazel b/benchmarks/datasets/google_message2/BUILD.bazel
index f3d66a2..654a3e2 100644
--- a/benchmarks/datasets/google_message2/BUILD.bazel
+++ b/benchmarks/datasets/google_message2/BUILD.bazel
@@ -2,6 +2,8 @@
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//:protobuf.bzl", "internal_py_proto_library", "internal_csharp_proto_library")
+load("//benchmarks/util:compatibility.bzl", "proto3_from_proto2_data", "php_proto3_from_proto2_library")
 
 filegroup(
     name = "datasets",
@@ -13,12 +15,21 @@
     ],
 )
 
+proto3_from_proto2_data(
+    name = "proto3_datasets",
+    srcs = [
+        "dataset.google_message2.pb",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 proto_library(
     name = "benchmark_message2_proto",
     srcs = [
         "benchmark_message2.proto",
     ],
-    strip_import_prefix = "/benchmarks",
     visibility = [
         "//benchmarks/datasets:__pkg__",
     ],
@@ -34,6 +45,14 @@
     ],
 )
 
+internal_csharp_proto_library(
+    name = "benchmark_message2_csharp_proto",
+    srcs = ["benchmark_message2.proto"],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 java_proto_library(
     name = "benchmark_message2_java_proto",
     visibility = [
@@ -44,6 +63,27 @@
     ],
 )
 
+php_proto3_from_proto2_library(
+    name = "benchmark_message2_php_proto",
+    src = "benchmark_message2.proto",
+    outs = [
+        "Benchmarks/Proto2/GoogleMessage2.php",
+        "Benchmarks/Proto2/GoogleMessage2GroupedMessage.php",
+        "GPBMetadata/BenchmarkMessage2.php",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
+internal_py_proto_library(
+    name = "benchmark_message2_py_proto",
+    srcs = ["benchmark_message2.proto"],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 pkg_files(
     name = "dist_files",
     srcs = glob(["*"]),
diff --git a/benchmarks/datasets/google_message3/BUILD.bazel b/benchmarks/datasets/google_message3/BUILD.bazel
index a729e50..68ad3f8 100644
--- a/benchmarks/datasets/google_message3/BUILD.bazel
+++ b/benchmarks/datasets/google_message3/BUILD.bazel
@@ -2,6 +2,7 @@
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//:protobuf.bzl", "internal_py_proto_library", "internal_csharp_proto_library")
 
 filegroup(
     name = "datasets",
@@ -24,7 +25,6 @@
         "benchmark_message3_7.proto",
         "benchmark_message3_8.proto",
     ],
-    strip_import_prefix = "/benchmarks",
     visibility = [
         "//benchmarks/datasets:__pkg__",
     ],
@@ -40,6 +40,24 @@
     ],
 )
 
+internal_csharp_proto_library(
+    name = "benchmark_message3_csharp_proto",
+    srcs = [
+        "benchmark_message3.proto",
+        "benchmark_message3_1.proto",
+        "benchmark_message3_2.proto",
+        "benchmark_message3_3.proto",
+        "benchmark_message3_4.proto",
+        "benchmark_message3_5.proto",
+        "benchmark_message3_6.proto",
+        "benchmark_message3_7.proto",
+        "benchmark_message3_8.proto",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 java_proto_library(
     name = "benchmark_message3_java_proto",
     visibility = [
@@ -50,6 +68,24 @@
     ],
 )
 
+internal_py_proto_library(
+    name = "benchmark_message3_py_proto",
+    srcs = [
+        "benchmark_message3.proto",
+        "benchmark_message3_1.proto",
+        "benchmark_message3_2.proto",
+        "benchmark_message3_3.proto",
+        "benchmark_message3_4.proto",
+        "benchmark_message3_5.proto",
+        "benchmark_message3_6.proto",
+        "benchmark_message3_7.proto",
+        "benchmark_message3_8.proto",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 pkg_files(
     name = "dist_files",
     srcs = glob(["*"]),
diff --git a/benchmarks/datasets/google_message3/benchmark_message3.proto b/benchmarks/datasets/google_message3/benchmark_message3.proto
index 82422f9..947060d 100644
--- a/benchmarks/datasets/google_message3/benchmark_message3.proto
+++ b/benchmarks/datasets/google_message3/benchmark_message3.proto
@@ -34,13 +34,13 @@
 
 package benchmarks.google_message3;
 
-import "datasets/google_message3/benchmark_message3_1.proto";
-import "datasets/google_message3/benchmark_message3_2.proto";
-import "datasets/google_message3/benchmark_message3_3.proto";
-import "datasets/google_message3/benchmark_message3_4.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_1.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_2.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_3.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_4.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_5.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_7.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_8.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_1.proto b/benchmarks/datasets/google_message3/benchmark_message3_1.proto
index 1ee5c9e..f5c1f78 100644
--- a/benchmarks/datasets/google_message3/benchmark_message3_1.proto
+++ b/benchmarks/datasets/google_message3/benchmark_message3_1.proto
@@ -34,11 +34,11 @@
 
 package benchmarks.google_message3;
 
-import "datasets/google_message3/benchmark_message3_2.proto";
-import "datasets/google_message3/benchmark_message3_3.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_2.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_3.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_5.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_7.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_8.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_2.proto b/benchmarks/datasets/google_message3/benchmark_message3_2.proto
index d123a72..0bf5995 100644
--- a/benchmarks/datasets/google_message3/benchmark_message3_2.proto
+++ b/benchmarks/datasets/google_message3/benchmark_message3_2.proto
@@ -34,11 +34,11 @@
 
 package benchmarks.google_message3;
 
-import "datasets/google_message3/benchmark_message3_3.proto";
-import "datasets/google_message3/benchmark_message3_4.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_3.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_4.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_5.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_7.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_8.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_3.proto b/benchmarks/datasets/google_message3/benchmark_message3_3.proto
index 2e534a6..5965ebd 100644
--- a/benchmarks/datasets/google_message3/benchmark_message3_3.proto
+++ b/benchmarks/datasets/google_message3/benchmark_message3_3.proto
@@ -34,10 +34,10 @@
 
 package benchmarks.google_message3;
 
-import "datasets/google_message3/benchmark_message3_4.proto";
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_4.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_5.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_7.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_8.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_4.proto b/benchmarks/datasets/google_message3/benchmark_message3_4.proto
index b304148..768e1f4 100644
--- a/benchmarks/datasets/google_message3/benchmark_message3_4.proto
+++ b/benchmarks/datasets/google_message3/benchmark_message3_4.proto
@@ -34,10 +34,10 @@
 
 package benchmarks.google_message3;
 
-import "datasets/google_message3/benchmark_message3_5.proto";
-import "datasets/google_message3/benchmark_message3_6.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_5.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_6.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_7.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_8.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_5.proto b/benchmarks/datasets/google_message3/benchmark_message3_5.proto
index e72d7ee..8031c99 100644
--- a/benchmarks/datasets/google_message3/benchmark_message3_5.proto
+++ b/benchmarks/datasets/google_message3/benchmark_message3_5.proto
@@ -34,9 +34,9 @@
 
 package benchmarks.google_message3;
 
-import "datasets/google_message3/benchmark_message3_6.proto";
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_6.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_7.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_8.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_6.proto b/benchmarks/datasets/google_message3/benchmark_message3_6.proto
index c766f7c..5941ad7 100644
--- a/benchmarks/datasets/google_message3/benchmark_message3_6.proto
+++ b/benchmarks/datasets/google_message3/benchmark_message3_6.proto
@@ -34,8 +34,8 @@
 
 package benchmarks.google_message3;
 
-import "datasets/google_message3/benchmark_message3_7.proto";
-import "datasets/google_message3/benchmark_message3_8.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_7.proto";
+import "benchmarks/datasets/google_message3/benchmark_message3_8.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message4/BUILD.bazel b/benchmarks/datasets/google_message4/BUILD.bazel
index 33de093..079a9a2 100644
--- a/benchmarks/datasets/google_message4/BUILD.bazel
+++ b/benchmarks/datasets/google_message4/BUILD.bazel
@@ -2,6 +2,7 @@
 load("@rules_java//java:defs.bzl", "java_proto_library")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//:protobuf.bzl", "internal_py_proto_library", "internal_csharp_proto_library")
 
 filegroup(
     name = "datasets",
@@ -19,7 +20,6 @@
         "benchmark_message4_2.proto",
         "benchmark_message4_3.proto",
     ],
-    strip_import_prefix = "/benchmarks",
     visibility = [
         "//benchmarks/datasets:__pkg__",
     ],
@@ -35,6 +35,19 @@
     ],
 )
 
+internal_csharp_proto_library(
+    name = "benchmark_message4_csharp_proto",
+    srcs = [
+        "benchmark_message4.proto",
+        "benchmark_message4_1.proto",
+        "benchmark_message4_2.proto",
+        "benchmark_message4_3.proto",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 java_proto_library(
     name = "benchmark_message4_java_proto",
     visibility = [
@@ -45,6 +58,19 @@
     ],
 )
 
+internal_py_proto_library(
+    name = "benchmark_message4_py_proto",
+    srcs = [
+        "benchmark_message4.proto",
+        "benchmark_message4_1.proto",
+        "benchmark_message4_2.proto",
+        "benchmark_message4_3.proto",
+    ],
+    visibility = [
+        "//benchmarks/datasets:__pkg__",
+    ],
+)
+
 pkg_files(
     name = "dist_files",
     srcs = glob(["*"]),
diff --git a/benchmarks/datasets/google_message4/benchmark_message4.proto b/benchmarks/datasets/google_message4/benchmark_message4.proto
index 424ed10..156e188 100644
--- a/benchmarks/datasets/google_message4/benchmark_message4.proto
+++ b/benchmarks/datasets/google_message4/benchmark_message4.proto
@@ -34,9 +34,9 @@
 
 package benchmarks.google_message4;
 
-import "datasets/google_message4/benchmark_message4_1.proto";
-import "datasets/google_message4/benchmark_message4_2.proto";
-import "datasets/google_message4/benchmark_message4_3.proto";
+import "benchmarks/datasets/google_message4/benchmark_message4_1.proto";
+import "benchmarks/datasets/google_message4/benchmark_message4_2.proto";
+import "benchmarks/datasets/google_message4/benchmark_message4_3.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_1.proto b/benchmarks/datasets/google_message4/benchmark_message4_1.proto
index c5deecd..6e5256f 100644
--- a/benchmarks/datasets/google_message4/benchmark_message4_1.proto
+++ b/benchmarks/datasets/google_message4/benchmark_message4_1.proto
@@ -34,8 +34,8 @@
 
 package benchmarks.google_message4;
 
-import "datasets/google_message4/benchmark_message4_2.proto";
-import "datasets/google_message4/benchmark_message4_3.proto";
+import "benchmarks/datasets/google_message4/benchmark_message4_2.proto";
+import "benchmarks/datasets/google_message4/benchmark_message4_3.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_2.proto b/benchmarks/datasets/google_message4/benchmark_message4_2.proto
index 0c4cdfd..dbd43e4 100644
--- a/benchmarks/datasets/google_message4/benchmark_message4_2.proto
+++ b/benchmarks/datasets/google_message4/benchmark_message4_2.proto
@@ -32,7 +32,7 @@
 
 package benchmarks.google_message4;
 
-import "datasets/google_message4/benchmark_message4_3.proto";
+import "benchmarks/datasets/google_message4/benchmark_message4_3.proto";
 
 option cc_enable_arenas = true;
 option java_package = "com.google.protobuf.benchmarks";
diff --git a/benchmarks/go/go_benchmark_test.go b/benchmarks/go/go_benchmark_test.go
deleted file mode 100644
index 8c741b7..0000000
--- a/benchmarks/go/go_benchmark_test.go
+++ /dev/null
@@ -1,124 +0,0 @@
-package main
-
-import (
-	benchmarkWrapper "../tmp"
-	googleMessage1Proto2 "../tmp/datasets/google_message1/proto2"
-	googleMessage1Proto3 "../tmp/datasets/google_message1/proto3"
-	googleMessage2 "../tmp/datasets/google_message2"
-	googleMessage3 "../tmp/datasets/google_message3"
-	googleMessage4 "../tmp/datasets/google_message4"
-	"flag"
-	"github.com/golang/protobuf/proto"
-	"io/ioutil"
-	"testing"
-)
-
-// Data is returned by the Load function.
-type Dataset struct {
-	name        string
-	newMessage  func() proto.Message
-	marshaled   [][]byte
-	unmarshaled []proto.Message
-}
-
-var datasets []Dataset
-
-// This is used to getDefaultInstance for a message type.
-func generateNewMessageFunction(dataset benchmarkWrapper.BenchmarkDataset) func() proto.Message {
-	switch dataset.MessageName {
-	case "benchmarks.proto3.GoogleMessage1":
-		return func() proto.Message { return new(googleMessage1Proto3.GoogleMessage1) }
-	case "benchmarks.proto2.GoogleMessage1":
-		return func() proto.Message { return new(googleMessage1Proto2.GoogleMessage1) }
-	case "benchmarks.proto2.GoogleMessage2":
-		return func() proto.Message { return new(googleMessage2.GoogleMessage2) }
-	case "benchmarks.google_message3.GoogleMessage3":
-		return func() proto.Message { return new(googleMessage3.GoogleMessage3) }
-	case "benchmarks.google_message4.GoogleMessage4":
-		return func() proto.Message { return new(googleMessage4.GoogleMessage4) }
-	default:
-		panic("Unknown message type: " + dataset.MessageName)
-	}
-}
-
-func init() {
-	flag.Parse()
-	for _, f := range flag.Args() {
-		// Load the benchmark.
-		b, err := ioutil.ReadFile(f)
-		if err != nil {
-			panic(err)
-		}
-
-		// Parse the benchmark.
-		var dm benchmarkWrapper.BenchmarkDataset
-		if err := proto.Unmarshal(b, &dm); err != nil {
-			panic(err)
-		}
-
-		// Determine the concrete protobuf message type to use.
-		var ds Dataset
-		ds.newMessage = generateNewMessageFunction(dm)
-
-		// Unmarshal each test message.
-		for _, payload := range dm.Payload {
-			ds.marshaled = append(ds.marshaled, payload)
-			m := ds.newMessage()
-			if err := proto.Unmarshal(payload, m); err != nil {
-				panic(err)
-			}
-			ds.unmarshaled = append(ds.unmarshaled, m)
-		}
-		ds.name = f
-
-		datasets = append(datasets, ds)
-	}
-}
-
-func Benchmark(b *testing.B) {
-	for _, ds := range datasets {
-		b.Run(ds.name, func(b *testing.B) {
-			b.Run("Unmarshal", func(b *testing.B) {
-				for i := 0; i < b.N; i++ {
-					for j, payload := range ds.marshaled {
-						out := ds.newMessage()
-						if err := proto.Unmarshal(payload, out); err != nil {
-							b.Fatalf("can't unmarshal message %d %v", j, err)
-						}
-					}
-				}
-			})
-			b.Run("Marshal", func(b *testing.B) {
-				for i := 0; i < b.N; i++ {
-					for j, m := range ds.unmarshaled {
-						if _, err := proto.Marshal(m); err != nil {
-							b.Fatalf("can't marshal message %d %+v: %v", j, m, err)
-						}
-					}
-				}
-			})
-			b.Run("Size", func(b *testing.B) {
-				for i := 0; i < b.N; i++ {
-					for _, m := range ds.unmarshaled {
-						proto.Size(m)
-					}
-				}
-			})
-			b.Run("Clone", func(b *testing.B) {
-				for i := 0; i < b.N; i++ {
-					for _, m := range ds.unmarshaled {
-						proto.Clone(m)
-					}
-				}
-			})
-			b.Run("Merge", func(b *testing.B) {
-				for i := 0; i < b.N; i++ {
-					for _, m := range ds.unmarshaled {
-						out := ds.newMessage()
-						proto.Merge(out, m)
-					}
-				}
-			})
-		})
-	}
-}
diff --git a/benchmarks/internal.bzl b/benchmarks/internal.bzl
new file mode 100644
index 0000000..c060353
--- /dev/null
+++ b/benchmarks/internal.bzl
@@ -0,0 +1,37 @@
+"""Starlark definitions for Protobuf benchmark tests.
+
+PLEASE DO NOT DEPEND ON THE CONTENTS OF THIS FILE, IT IS UNSTABLE.
+"""
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
+
+def internal_benchmark_test(
+        name,
+        binary,
+        datasets,
+        args = [],
+        env_vars = []):
+    """Benchmark test runner.
+
+    Args:
+      name: the name for the test.
+      binary: a benchmark test binary.
+      datasets: a set of datasets to benchmark.
+      args: optional arguments to pass the binary.
+      env_vars: environment variables to set in the test.
+    """
+
+    dataset_labels = []
+    for dataset in datasets:
+        dataset_labels.append("$(rootpaths %s)" % dataset)
+    inline_sh_binary(
+        name = name,
+        srcs = datasets,
+        tools = [binary],
+        cmd = "%s $(rootpath %s) %s %s" % (
+            " ".join(env_vars),
+            binary,
+            " ".join(args),
+            " ".join(dataset_labels)),
+        tags = ["benchmark"],
+        testonly = 1,
+    )
diff --git a/benchmarks/java/BUILD.bazel b/benchmarks/java/BUILD.bazel
new file mode 100644
index 0000000..f8976bf
--- /dev/null
+++ b/benchmarks/java/BUILD.bazel
@@ -0,0 +1,55 @@
+load("@rules_java//java:defs.bzl", "java_library", "java_binary")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
+load("//benchmarks:internal.bzl", "internal_benchmark_test")
+
+java_binary(
+    name = "java_benchmark_jar",
+    srcs = [
+        "src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java",
+    ],
+    main_class = "com.google.caliper.runner.CaliperMain",
+    deps = [
+        "//:protobuf_java",
+        "//benchmarks:benchmarks_java_proto",
+        "//benchmarks/datasets:java_protos",
+        "@maven//:com_google_caliper_caliper",
+        "@maven//:com_google_caliper_caliper_api",
+    ],
+)
+
+# The benchmark binary which can be run over any dataset.
+inline_sh_binary(
+    name = "java_benchmark",
+    srcs = ["//benchmarks/datasets"],
+    tools = [":java_benchmark_jar"],
+    cmd = """
+        data_files=""
+        conf=()
+        for arg in "$${@:1}"; do
+            if [[ $${arg:0:1} == "-" ]]; then
+                conf+=($$arg)
+            else
+                data_files+="$$arg,"
+            fi
+        done
+        $(rootpath :java_benchmark_jar) com.google.protobuf.ProtoCaliperBenchmark \
+            -i runtime -DdataFile=$${data_files:0:-1} $${conf[*]}
+    """
+)
+
+# A pre-configured binary using the checked in datasets.
+internal_benchmark_test(
+    name = "java",
+    binary = ":java_benchmark",
+    datasets = ["//benchmarks/datasets"],
+)
+
+pkg_files(
+    name = "dist_files",
+    srcs = [
+        "BUILD.bazel",
+    ] + glob(["**/*.java"]),
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//benchmarks:__pkg__"],
+)
diff --git a/benchmarks/java/pom.xml b/benchmarks/java/pom.xml
deleted file mode 100644
index c0dc940..0000000
--- a/benchmarks/java/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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/maven-v4_0_0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>protobuf-java-benchmark</artifactId>
-  <groupId>com.google.protobuf</groupId>
-  <version>1.0.0</version>
-  <name>Protocol Buffers [Benchmark]</name>
-  <description>The benchmark tools for Protobuf Java.</description>
-
-  <dependencies>
-    <dependency>
-      <groupId>com.google.protobuf</groupId>
-      <artifactId>protobuf-java</artifactId>
-      <version>${protobuf.version}</version>
-      <type>jar</type>
-      <scope>system</scope>
-      <systemPath>${project.basedir}/lib/protobuf-java.jar</systemPath>
-    </dependency>
-    <dependency>
-      <groupId>com.google.caliper</groupId>
-      <artifactId>caliper</artifactId>
-      <version>1.0-beta-3</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-assembly-plugin</artifactId>
-          <version>2.4.1</version>
-          <configuration>
-            <!-- get all project dependencies -->
-            <descriptorRefs>
-              <descriptorRef>jar-with-dependencies</descriptorRef>
-            </descriptorRefs>
-            <!-- MainClass in mainfest make a executable jar -->
-            <archive>
-              <manifest>
-                <mainClass>com.mkyong.core.utils.App</mainClass>
-              </manifest>
-            </archive>
-          </configuration>
-          <executions>
-            <execution>
-              <id>make-assembly</id>
-              <!-- bind to the packaging phase -->
-              <phase>package</phase>
-              <goals>
-                <goal>single</goal>
-              </goals>
-            </execution>
-          </executions>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.5.1</version>
-          <configuration>
-            <source>1.8</source>
-            <target>1.8</target>
-          </configuration>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>2.5</version>
-          <configuration>
-            <archive>
-              <manifest>
-                <addClasspath>true</addClasspath>
-                <mainClass>com.google.protocolbuffers.ProtoBench</mainClass>
-              </manifest>
-            </archive>
-          </configuration>
-        </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-source-plugin</artifactId>
-          <version>2.4</version>
-          <executions>
-            <execution>
-              <id>attach-sources</id>
-              <goals>
-                <goal>jar-no-fork</goal>
-              </goals>
-            </execution>
-          </executions>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-</project>
-
diff --git a/benchmarks/js/benchmark_suite.js b/benchmarks/js/benchmark_suite.js
deleted file mode 100644
index c5c3e51..0000000
--- a/benchmarks/js/benchmark_suite.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var benchmark = require("benchmark");
-
-function newBenchmark(messageName, filename, language) {
-  var benches = [];
-  return {
-    suite: new benchmark.Suite(messageName + filename + language )
-      .on("add", function(event) {
-          benches.push(event.target);
-      })
-      .on("start", function() {
-          process.stdout.write(
-            "benchmarking message " + messageName
-            + " of dataset file " + filename
-            + "'s performance ..." + "\n\n");
-      })
-      .on("cycle", function(event) {
-          process.stdout.write(String(event.target) + "\n");
-      })
-      .on("complete", function() {
-          var getHz = function(bench) {
-            return 1 / (bench.stats.mean + bench.stats.moe);
-          }
-          benches.forEach(function(val, index) {
-            benches[index] = getHz(val);
-          });
-      }),
-     benches: benches
-  }
-}
-
-module.exports = {
-        newBenchmark: newBenchmark
-}
diff --git a/benchmarks/js/js_benchmark.js b/benchmarks/js/js_benchmark.js
deleted file mode 100644
index 9ba4828..0000000
--- a/benchmarks/js/js_benchmark.js
+++ /dev/null
@@ -1,82 +0,0 @@
-require('./datasets/google_message1/proto2/benchmark_message1_proto2_pb.js');
-require('./datasets/google_message1/proto3/benchmark_message1_proto3_pb.js');
-require('./datasets/google_message2/benchmark_message2_pb.js');
-require('./datasets/google_message3/benchmark_message3_pb.js');
-require('./datasets/google_message4/benchmark_message4_pb.js');
-require('./benchmarks_pb.js');
-
-var fs = require('fs');
-var benchmarkSuite = require("./benchmark_suite.js");
-
-
-function getNewPrototype(name) {
-  var message = eval("proto." + name);
-  if (typeof(message) == "undefined") {
-    throw "type " + name + " is undefined";
-  }
-  return message;
-}
-
-var results = [];
-var json_file = "";
-
-console.log("#####################################################");
-console.log("Js Benchmark: ");
-process.argv.forEach(function(filename, index) {
-  if (index < 2) {
-    return;
-  }
-  if (filename.indexOf("--json_output") != -1) {
-    json_file = filename.replace(/^--json_output=/, '');
-    return;
-  }
-
-  var benchmarkDataset =
-      proto.benchmarks.BenchmarkDataset.deserializeBinary(fs.readFileSync(filename));
-  var messageList = [];
-  var totalBytes = 0;
-  benchmarkDataset.getPayloadList().forEach(function(onePayload) {
-    var message = getNewPrototype(benchmarkDataset.getMessageName());
-    messageList.push(message.deserializeBinary(onePayload));
-    totalBytes += onePayload.length;
-  });
-
-  var scenarios = benchmarkSuite.newBenchmark(
-      benchmarkDataset.getMessageName(), filename, "js");
-  scenarios.suite
-  .add("js deserialize", function() {
-    benchmarkDataset.getPayloadList().forEach(function(onePayload) {
-      var protoType = getNewPrototype(benchmarkDataset.getMessageName());
-      protoType.deserializeBinary(onePayload);
-    });
-  })
-  .add("js serialize", function() {
-    var protoType = getNewPrototype(benchmarkDataset.getMessageName());
-    messageList.forEach(function(message) {
-      message.serializeBinary();
-    });
-  })
-  .run({"Async": false});
-
-  results.push({
-    filename: filename,
-    benchmarks: {
-      protobufjs_decoding: scenarios.benches[0] * totalBytes / 1024 / 1024,
-      protobufjs_encoding: scenarios.benches[1] * totalBytes / 1024 / 1024
-    }
-  })
-
-  console.log("Throughput for deserialize: "
-    + scenarios.benches[0] * totalBytes / 1024 / 1024 + "MB/s" );
-  console.log("Throughput for serialize: "
-    + scenarios.benches[1] * totalBytes / 1024 / 1024 + "MB/s" );
-  console.log("");
-});
-console.log("#####################################################");
-
-if (json_file != "") {
-  fs.writeFile(json_file, JSON.stringify(results), (err) => {
-    if (err) throw err;
-  });
-}
-
diff --git a/benchmarks/php/BUILD.bazel b/benchmarks/php/BUILD.bazel
new file mode 100644
index 0000000..a1a9319
--- /dev/null
+++ b/benchmarks/php/BUILD.bazel
@@ -0,0 +1,69 @@
+load("//benchmarks:internal.bzl", "internal_benchmark_test")
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+
+# The benchmark binary which can be run over any dataset.
+inline_sh_binary(
+    name = "php_benchmark",
+    srcs = [
+        "PhpBenchmark.php",
+        "autoload.php",
+    ],
+    deps = [
+        "//benchmarks:benchmarks_php_proto",
+        "//benchmarks/datasets:php_protos",
+        "//php:source_files",
+    ],
+    cmd = """
+        php -d include_path=benchmarks:php/src \\
+            -d auto_prepend_file=$(rootpath autoload.php) \\
+            $(rootpath PhpBenchmark.php) $$@
+    """,
+    testonly = 1,
+)
+
+# A pre-configured binary using the checked in datasets.
+internal_benchmark_test(
+    name = "php",
+    binary = ":php_benchmark",
+    datasets = ["//benchmarks/datasets:proto3_datasets"],
+    env_vars = ["PROTOBUF_PHP_SRCDIR=php/src"],
+    args = ["--behavior_prefix='php'"],
+)
+
+# The benchmark binary which can be run over any dataset.
+inline_sh_binary(
+    name = "php_c_benchmark",
+    srcs = [
+        "PhpBenchmark.php",
+        "//php:extension",
+    ],
+    deps = [
+        "//benchmarks:benchmarks_php_proto",
+        "//benchmarks/datasets:php_protos",
+    ],
+    cmd = """
+        php -d include_path=benchmarks:php/src \\
+            -dextension=$(rootpath //php:extension) \\
+            $(rootpath PhpBenchmark.php) $$@
+    """,
+    testonly = 1,
+)
+
+# A pre-configured binary using the checked in datasets.
+internal_benchmark_test(
+    name = "php_c",
+    binary = ":php_c_benchmark",
+    datasets = ["//benchmarks/datasets:proto3_datasets"],
+    env_vars = ["PROTOBUF_PHP_SRCDIR=php/src"],
+    args = ["--behavior_prefix='php_c'"],
+)
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob(["*.php"]) + [
+        "BUILD.bazel",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//benchmarks:__pkg__"],
+)
diff --git a/benchmarks/protobuf.js/generate_pbjs_files.js b/benchmarks/protobuf.js/generate_pbjs_files.js
deleted file mode 100644
index 11945bf..0000000
--- a/benchmarks/protobuf.js/generate_pbjs_files.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var pbjs = require("./protobuf.js/cli").pbjs
-
-var argv = [];
-var protoFiles = [];
-var prefix = "";
-process.argv.forEach(function(val, index) {
-  var arg = val;
-  if (arg.length > 6 && arg.substring(arg.length - 6) == ".proto") {
-    protoFiles.push(arg);
-  } else if (arg.length > 15 && arg.substring(0, 15) ==  "--include_path=") {
-    prefix = arg.substring(15);
-  } else if (index >= 2) {
-    argv.push(arg);
-  }
-});
-protoFiles.forEach(function(val) {
-  argv.push(prefix + "/" + val);
-});
-
-pbjs.main(argv, function(err, output){
-  if (err) {
-    console.log(err);
-  }
-});
-
diff --git a/benchmarks/protobuf.js/protobufjs_benchmark.js b/benchmarks/protobuf.js/protobufjs_benchmark.js
deleted file mode 100644
index e062d1c..0000000
--- a/benchmarks/protobuf.js/protobufjs_benchmark.js
+++ /dev/null
@@ -1,66 +0,0 @@
-var root = require("./generated_bundle_code.js");
-var fs = require('fs');
-var benchmark = require("./node_modules/benchmark");
-var benchmarkSuite = require("./benchmark_suite.js");
-
-
-function getNewPrototype(name) {
-  var message = eval("root." + name);
-  if (typeof(message) == "undefined") {
-    throw "type " + name + " is undefined";
-  }
-  return message;
-}
-
-
-var results = [];
-
-console.log("#####################################################");
-console.log("ProtobufJs Benchmark: ");
-process.argv.forEach(function(filename, index) {
-  if (index < 2) {
-    return;
-  }
-  var benchmarkDataset =
-      root.benchmarks.BenchmarkDataset.decode(fs.readFileSync(filename));
-  var messageList = [];
-  var totalBytes = 0;
-  benchmarkDataset.payload.forEach(function(onePayload) {
-    var message = getNewPrototype(benchmarkDataset.messageName);
-    messageList.push(message.decode(onePayload));
-    totalBytes += onePayload.length;
-  });
-
-  var scenarios = benchmarkSuite.newBenchmark(
-    benchmarkDataset.messageName, filename, "protobufjs");
-  scenarios.suite
-  .add("protobuf.js static decoding", function() {
-    benchmarkDataset.payload.forEach(function(onePayload) {
-      var protoType = getNewPrototype(benchmarkDataset.messageName);
-      protoType.decode(onePayload);
-    });
-  })
-  .add("protobuf.js static encoding", function() {
-    var protoType = getNewPrototype(benchmarkDataset.messageName);
-    messageList.forEach(function(message) {
-      protoType.encode(message).finish();
-    });
-  })
-  .run({"Async": false});
-
-  results.push({
-    filename: filename,
-    benchmarks: {
-      protobufjs_decoding: scenarios.benches[0] * totalBytes,
-      protobufjs_encoding: scenarios.benches[1] * totalBytes
-    }
-  })
-
-  console.log("Throughput for decoding: "
-    + scenarios.benches[0] * totalBytes / 1024 / 1024 + "MB/s" );
-  console.log("Throughput for encoding: "
-    + scenarios.benches[1] * totalBytes / 1024 / 1024 + "MB/s" );
-  console.log("");
-});
-console.log("#####################################################");
-
diff --git a/benchmarks/python/BUILD.bazel b/benchmarks/python/BUILD.bazel
new file mode 100644
index 0000000..a8b1801
--- /dev/null
+++ b/benchmarks/python/BUILD.bazel
@@ -0,0 +1,71 @@
+load("@rules_cc//cc:defs.bzl", "cc_binary")
+load("@rules_python//python:defs.bzl", "py_library", "py_binary")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//benchmarks:internal.bzl", "internal_benchmark_test")
+
+cc_binary(
+    name = "libbenchmark_messages.so",
+    srcs = ["python_benchmark_messages.cc"],
+    deps = [
+        "@local_config_python//:python_headers",
+        "//external:python_headers",
+        "//benchmarks:benchmarks_cc_proto",
+        "//benchmarks/datasets:cc_protos",
+    ],
+    linkshared = True,
+    linkstatic = True,
+    visibility = ["//visibility:private"],
+)
+
+# The benchmark binary which can be run over any dataset.
+py_binary(
+    name = "python_benchmark",
+    srcs = ["py_benchmark.py"],
+    main = "py_benchmark.py",
+    data = ["libbenchmark_messages.so"],
+    deps = [
+        "//:protobuf_python",
+        "//benchmarks:benchmarks_py_proto",
+        "//benchmarks/datasets:py_protos",
+    ],
+    env = select({
+        "//python:use_fast_cpp_protos": {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "cpp"},
+        "//conditions:default": {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "python"},
+    }),
+)
+
+# Pre-configured binaries using the checked in datasets.
+
+internal_benchmark_test(
+    name = "python",
+    binary = ":python_benchmark",
+    datasets = ["//benchmarks/datasets"],
+    env_vars = ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python"],
+)
+
+# Note: this requires --define=use_fast_cpp_protos=true
+internal_benchmark_test(
+    name = "cpp_reflection",
+    binary = ":python_benchmark",
+    datasets = ["//benchmarks/datasets"],
+    env_vars = ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp"],
+)
+
+# Note: this requires --define=use_fast_cpp_protos=true
+internal_benchmark_test(
+    name = "cpp_generated_code",
+    binary = ":python_benchmark",
+    datasets = ["//benchmarks/datasets"],
+    env_vars = ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp"],
+    args = ["--cpp_generated"],
+)
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob(["*.py"]) + [
+        "BUILD.bazel",
+        "python_benchmark_messages.cc",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//benchmarks:__pkg__"],
+)
diff --git a/benchmarks/python/py_benchmark.py b/benchmarks/python/py_benchmark.py
index 60e377e..053c78c 100644
--- a/benchmarks/python/py_benchmark.py
+++ b/benchmarks/python/py_benchmark.py
@@ -27,17 +27,17 @@
 # for the descriptor can be found in the pool
 if args.cpp_generated != "no":
   sys.path.append( os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) + "/.libs" )
-  import libbenchmark_messages
+  from benchmarks.python import libbenchmark_messages
   sys.path.append( os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) + "/tmp" )
 # END CPP GENERATED MESSAGE
 
 
-import datasets.google_message1.proto2.benchmark_message1_proto2_pb2 as benchmark_message1_proto2_pb2
-import datasets.google_message1.proto3.benchmark_message1_proto3_pb2 as benchmark_message1_proto3_pb2
-import datasets.google_message2.benchmark_message2_pb2 as benchmark_message2_pb2
-import datasets.google_message3.benchmark_message3_pb2 as benchmark_message3_pb2
-import datasets.google_message4.benchmark_message4_pb2 as benchmark_message4_pb2
-import benchmarks_pb2 as benchmarks_pb2
+import benchmarks.datasets.google_message1.proto2.benchmark_message1_proto2_pb2 as benchmark_message1_proto2_pb2
+import benchmarks.datasets.google_message1.proto3.benchmark_message1_proto3_pb2 as benchmark_message1_proto3_pb2
+import benchmarks.datasets.google_message2.benchmark_message2_pb2 as benchmark_message2_pb2
+import benchmarks.datasets.google_message3.benchmark_message3_pb2 as benchmark_message3_pb2
+import benchmarks.datasets.google_message4.benchmark_message4_pb2 as benchmark_message4_pb2
+import benchmarks.benchmarks_pb2 as benchmarks_pb2
 
 
 def run_one_test(filename):
diff --git a/benchmarks/python/python_benchmark_messages.cc b/benchmarks/python/python_benchmark_messages.cc
index f6ddcf3..8a65125 100644
--- a/benchmarks/python/python_benchmark_messages.cc
+++ b/benchmarks/python/python_benchmark_messages.cc
@@ -1,11 +1,11 @@
 #include <Python.h>
 
 #include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
+#include "benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
+#include "benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
+#include "benchmarks/datasets/google_message2/benchmark_message2.pb.h"
+#include "benchmarks/datasets/google_message3/benchmark_message3.pb.h"
+#include "benchmarks/datasets/google_message4/benchmark_message4.pb.h"
 
 static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT,
                                      "libbenchmark_messages",
diff --git a/benchmarks/util/BUILD.bazel b/benchmarks/util/BUILD.bazel
new file mode 100644
index 0000000..6b3aa2b
--- /dev/null
+++ b/benchmarks/util/BUILD.bazel
@@ -0,0 +1,50 @@
+load("@rules_cc//cc:defs.bzl", "cc_binary")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("@rules_python//python:defs.bzl", "py_binary")
+
+package(default_visibility = ["//benchmarks:__subpackages__"])
+
+cc_binary(
+    name = "protoc-gen-proto2_to_proto3",
+    srcs = [
+        "schema_proto2_to_proto3_util.h",
+        "protoc-gen-proto2_to_proto3.cc",
+    ],
+    deps = [
+        "//:protobuf",
+        "//src/google/protobuf/compiler:code_generator",
+        "//benchmarks:benchmarks_cc_proto",
+    ],
+    visibility = ["//benchmarks:__subpackages__"],
+)
+
+cc_binary(
+    name = "proto3_data_stripper",
+    srcs = [
+        "data_proto2_to_proto3_util.h",
+        "proto3_data_stripper.cc",
+    ],
+    deps = [
+        "//:protobuf",
+        "//benchmarks/datasets:cc_protos",
+        "//benchmarks:benchmarks_cc_proto",
+    ],
+)
+
+py_binary(
+    name = "result_parser",
+    srcs = ["result_parser.py"],
+    deps = [
+        "//benchmarks:benchmarks_py_proto",
+    ],
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob(["*"]),
+    strip_prefix = strip_prefix.from_root(""),
+)
diff --git a/benchmarks/util/compatibility.bzl b/benchmarks/util/compatibility.bzl
new file mode 100644
index 0000000..044ade6
--- /dev/null
+++ b/benchmarks/util/compatibility.bzl
@@ -0,0 +1,103 @@
+"""Starlark definitions for converting proto2 to proto3.
+
+PLEASE DO NOT DEPEND ON THE CONTENTS OF THIS FILE, IT IS UNSTABLE.
+"""
+
+load("//:protobuf.bzl", "internal_php_proto_library")
+
+def proto3_from_proto2_data(
+    name,
+    srcs,
+    **kwargs):
+    """Transforms proto2 binary data into a proto3-compatible format,
+
+    Args:
+      name: the name of the target representing the generated proto files.
+      srcs: the source binary protobuf data files.
+      **kwargs: standard arguments to forward on
+    """
+    outs = []
+    out_files = []
+    src_files = []
+    for src in srcs:
+        outs.append("proto3/" + src)
+        out_files.append("$(RULEDIR)/proto3/" + src)
+        src_files.append("$(rootpath %s)" % src);
+
+    native.genrule(
+        name = name + "_genrule",
+        srcs = srcs,
+        exec_tools = [
+            "//benchmarks/util:proto3_data_stripper",
+        ],
+        outs = outs,
+        cmd = "$(execpath //benchmarks/util:proto3_data_stripper) %s %s" % (
+            " ".join(src_files), " ".join(out_files)),
+    )
+
+    native.filegroup(
+        name = name,
+        srcs = outs,
+        **kwargs,
+    )
+
+def _proto3_from_proto2_library(
+        name,
+        srcs,
+        **kwargs):
+    """Create a proto3 library from a proto2 source.
+
+    Args:
+      name: the name of the target representing the generated proto files.
+      srcs: the source proto2 files.  Note: these must be raw sources.
+      **kwargs: standard arguments to forward on
+    """
+    outs = []
+    src_files = []
+    for src in srcs:
+        outs.append(src + "3")
+        src_files.append("$(rootpath %s)" % src);
+
+    native.genrule(
+        name = name,
+        srcs = srcs,
+        exec_tools = [
+            "//:protoc",
+            "//benchmarks/util:protoc-gen-proto2_to_proto3",
+        ],
+        outs = outs,
+        cmd = """
+            $(execpath //:protoc) \
+                --plugin=$(execpath //benchmarks/util:protoc-gen-proto2_to_proto3) \
+                --proto_path=. \
+                --proto_path=$(GENDIR) \
+                --proto2_to_proto3_out=$(GENDIR) \
+                %s
+        """ % (" ".join(src_files)),
+        **kwargs,
+    )
+
+def php_proto3_from_proto2_library(
+        name,
+        src,
+        outs = [],
+        **kwargs):
+    """Create a proto3 php library from a proto2 source.
+
+    Args:
+      name: the name of the target representing the generated proto files.
+      src: the source proto2 file.
+      outs: the expected php outputs.
+      **kwargs: standard arguments to forward on
+    """
+    _proto3_from_proto2_library(
+        name = name + "_genrule",
+        srcs = [src],
+    )
+
+    internal_php_proto_library(
+        name = name,
+        srcs = [name + "_genrule"],
+        outs = outs,
+        **kwargs,
+    )
diff --git a/benchmarks/util/gogo_data_scrubber.cc b/benchmarks/util/gogo_data_scrubber.cc
deleted file mode 100644
index 9ef57b0..0000000
--- a/benchmarks/util/gogo_data_scrubber.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-#include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
-#include "data_proto2_to_proto3_util.h"
-
-#include <fstream>
-
-using google::protobuf::util::GogoDataStripper;
-
-std::string ReadFile(const std::string& name) {
-  std::ifstream file(name.c_str());
-  GOOGLE_CHECK(file.is_open()) << "Couldn't find file '"
-      << name
-      << "', please make sure you are running this command from the benchmarks"
-      << " directory.\n";
-  return std::string((std::istreambuf_iterator<char>(file)),
-                     std::istreambuf_iterator<char>());
-}
-
-int main(int argc, char *argv[]) {
-  if (argc % 2 == 0 || argc == 1) {
-    std::cerr << "Usage: [input_files] [output_file_names] where " <<
-        "input_files are one to one mapping to output_file_names." <<
-        std::endl;
-    return 1;
-  }
-
-  for (int i = argc / 2; i > 0; i--) {
-    const std::string &input_file = argv[i];
-    const std::string &output_file = argv[i + argc / 2];
-
-    std::cerr << "Generating " << input_file
-        << " to " << output_file << std::endl;
-    benchmarks::BenchmarkDataset dataset;
-    Message* message;
-    std::string dataset_payload = ReadFile(input_file);
-    GOOGLE_CHECK(dataset.ParseFromString(dataset_payload))
-      << "Can' t parse data file " << input_file;
-
-    if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
-      message = new benchmarks::proto3::GoogleMessage1;
-    } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
-      message = new benchmarks::proto2::GoogleMessage1;
-    } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
-      message = new benchmarks::proto2::GoogleMessage2;
-    } else if (dataset.message_name() ==
-        "benchmarks.google_message3.GoogleMessage3") {
-      message = new benchmarks::google_message3::GoogleMessage3;
-    } else if (dataset.message_name() ==
-        "benchmarks.google_message4.GoogleMessage4") {
-      message = new benchmarks::google_message4::GoogleMessage4;
-    } else {
-      std::cerr << "Unknown message type: " << dataset.message_name();
-      exit(1);
-    }
-
-    for (int i = 0; i < dataset.payload_size(); i++) {
-      message->ParseFromString(dataset.payload(i));
-      GogoDataStripper stripper;
-      stripper.StripMessage(message);
-      dataset.set_payload(i, message->SerializeAsString());
-    }
-
-    std::ofstream ofs(output_file);
-    ofs << dataset.SerializeAsString();
-    ofs.close();
-  }
-
-
-  return 0;
-}
diff --git a/benchmarks/util/proto3_data_stripper.cc b/benchmarks/util/proto3_data_stripper.cc
index 3096c4c..68f4905 100644
--- a/benchmarks/util/proto3_data_stripper.cc
+++ b/benchmarks/util/proto3_data_stripper.cc
@@ -1,9 +1,9 @@
 #include "benchmarks.pb.h"
-#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
-#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
-#include "datasets/google_message2/benchmark_message2.pb.h"
-#include "datasets/google_message3/benchmark_message3.pb.h"
-#include "datasets/google_message4/benchmark_message4.pb.h"
+#include "benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
+#include "benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
+#include "benchmarks/datasets/google_message2/benchmark_message2.pb.h"
+#include "benchmarks/datasets/google_message3/benchmark_message3.pb.h"
+#include "benchmarks/datasets/google_message4/benchmark_message4.pb.h"
 #include "data_proto2_to_proto3_util.h"
 
 #include <fstream>
diff --git a/benchmarks/util/protoc-gen-gogoproto.cc b/benchmarks/util/protoc-gen-gogoproto.cc
deleted file mode 100644
index 9c1b3d0..0000000
--- a/benchmarks/util/protoc-gen-gogoproto.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-#include "google/protobuf/compiler/code_generator.h"
-#include "google/protobuf/io/zero_copy_stream.h"
-#include "google/protobuf/io/printer.h"
-#include "google/protobuf/descriptor.h"
-#include "google/protobuf/descriptor.pb.h"
-#include "schema_proto2_to_proto3_util.h"
-
-#include "google/protobuf/compiler/plugin.h"
-
-using google::protobuf::FileDescriptorProto;
-using google::protobuf::FileDescriptor;
-using google::protobuf::DescriptorPool;
-using google::protobuf::io::Printer;
-using google::protobuf::util::SchemaGroupStripper;
-using google::protobuf::util::EnumScrubber;
-
-namespace google {
-namespace protobuf {
-namespace compiler {
-
-namespace {
-
-string StripProto(string filename) {
-  if (filename.substr(filename.size() - 11) == ".protodevel") {
-    // .protodevel
-    return filename.substr(0, filename.size() - 11);
-  } else {
-    // .proto
-    return filename.substr(0, filename.size() - 6);
-  }
-}
-
-DescriptorPool new_pool_;
-
-}  // namespace
-
-class GoGoProtoGenerator : public CodeGenerator {
- public:
-  virtual bool GenerateAll(const std::vector<const FileDescriptor*>& files,
-                           const string& parameter,
-                           GeneratorContext* context,
-                           string* error) const {
-    for (int i = 0; i < files.size(); i++) {
-      for (auto file : files) {
-        bool can_generate =
-            (new_pool_.FindFileByName(file->name()) == nullptr);
-        for (int j = 0; j < file->dependency_count(); j++) {
-          can_generate &= (new_pool_.FindFileByName(
-              file->dependency(j)->name()) != nullptr);
-        }
-        for (int j = 0; j < file->public_dependency_count(); j++) {
-          can_generate &= (new_pool_.FindFileByName(
-              file->public_dependency(j)->name()) != nullptr);
-        }
-        for (int j = 0; j < file->weak_dependency_count(); j++) {
-          can_generate &= (new_pool_.FindFileByName(
-              file->weak_dependency(j)->name()) != nullptr);
-        }
-        if (can_generate) {
-          Generate(file, parameter, context, error);
-          break;
-        }
-      }
-    }
-
-    return true;
-  }
-
-  virtual bool Generate(const FileDescriptor* file,
-                        const string& parameter,
-                        GeneratorContext* context,
-                        string* error) const {
-    FileDescriptorProto new_file;
-    file->CopyTo(&new_file);
-    SchemaGroupStripper::StripFile(file, &new_file);
-
-    EnumScrubber enum_scrubber;
-    enum_scrubber.ScrubFile(&new_file);
-
-    string filename = file->name();
-    string basename = StripProto(filename);
-
-    std::vector<std::pair<string,string>> option_pairs;
-    ParseGeneratorParameter(parameter, &option_pairs);
-
-    std::unique_ptr<google::protobuf::io::ZeroCopyOutputStream> output(
-        context->Open(basename + ".proto"));
-    string content = new_pool_.BuildFile(new_file)->DebugString();
-    Printer printer(output.get(), '$');
-    printer.WriteRaw(content.c_str(), content.size());
-
-    return true;
-  }
-};
-
-}  // namespace compiler
-}  // namespace protobuf
-}  // namespace google
-
-int main(int argc, char* argv[]) {
-  google::protobuf::compiler::GoGoProtoGenerator generator;
-  return google::protobuf::compiler::PluginMain(argc, argv, &generator);
-}
diff --git a/benchmarks/util/protoc-gen-proto2_to_proto3.cc b/benchmarks/util/protoc-gen-proto2_to_proto3.cc
index d0a8902..3073e0f 100644
--- a/benchmarks/util/protoc-gen-proto2_to_proto3.cc
+++ b/benchmarks/util/protoc-gen-proto2_to_proto3.cc
@@ -15,6 +15,7 @@
 using google::protobuf::util::EnumScrubber;
 using google::protobuf::util::ExtensionStripper;
 using google::protobuf::util::FieldScrubber;
+using google::protobuf::util::ImportScrubber;
 
 namespace google {
 namespace protobuf {
@@ -22,7 +23,7 @@
 
 namespace {
 
-string StripProto(string filename) {
+std::string StripProtoExt(const std::string& filename) {
   return filename.substr(0, filename.rfind(".proto"));
 }
 
@@ -36,9 +37,9 @@
 class Proto2ToProto3Generator final : public CodeGenerator {
  public:
   bool GenerateAll(const std::vector<const FileDescriptor*>& files,
-                           const string& parameter,
+                           const std::string& parameter,
                            GeneratorContext* context,
-                           string* error) const {
+                           std::string* error) const {
     for (int i = 0; i < files.size(); i++) {
       for (auto file : files) {
         if (CanGenerate(file)) {
@@ -52,28 +53,30 @@
   }
 
   bool Generate(const FileDescriptor* file,
-                        const string& parameter,
+                        const std::string& parameter,
                         GeneratorContext* context,
-                        string* error) const {
+                        std::string* error) const {
     FileDescriptorProto new_file;
     file->CopyTo(&new_file);
+    new_file.set_name(ImportScrubber::ScrubFilename(file->name()));
     SchemaGroupStripper::StripFile(file, &new_file);
 
     EnumScrubber enum_scrubber;
     enum_scrubber.ScrubFile(&new_file);
     ExtensionStripper::StripFile(&new_file);
     FieldScrubber::ScrubFile(&new_file);
+    ImportScrubber::ScrubFile(&new_file);
     new_file.set_syntax("proto3");
 
-    string filename = file->name();
-    string basename = StripProto(filename);
+    std::string filename = file->name();
+    std::string basename = StripProtoExt(filename);
 
-    std::vector<std::pair<string,string>> option_pairs;
+    std::vector<std::pair<std::string,std::string>> option_pairs;
     ParseGeneratorParameter(parameter, &option_pairs);
 
     std::unique_ptr<google::protobuf::io::ZeroCopyOutputStream> output(
-        context->Open(basename + ".proto"));
-    string content = GetPool()->BuildFile(new_file)->DebugString();
+        context->Open(basename + ".proto3"));
+    std::string content = GetPool()->BuildFile(new_file)->DebugString();
     Printer printer(output.get(), '$');
     printer.WriteRaw(content.c_str(), content.size());
 
@@ -81,11 +84,12 @@
   }
  private:
   bool CanGenerate(const FileDescriptor* file) const {
-    if (GetPool()->FindFileByName(file->name()) != nullptr) {
+    if (GetPool()->FindFileByName(ImportScrubber::ScrubFilename(file->name())) != nullptr) {
       return false;
     }
     for (int j = 0; j < file->dependency_count(); j++) {
-      if (GetPool()->FindFileByName(file->dependency(j)->name()) == nullptr) {
+      if (GetPool()->FindFileByName(ImportScrubber::ScrubFilename(
+          file->dependency(j)->name())) == nullptr) {
         return false;
       }
     }
diff --git a/benchmarks/util/result_parser.py b/benchmarks/util/result_parser.py
index d3251a8..a35c1db 100644
--- a/benchmarks/util/result_parser.py
+++ b/benchmarks/util/result_parser.py
@@ -1,5 +1,3 @@
-# This import depends on the automake rule protoc_middleman, please make sure
-# protoc_middleman has been built before run this file.
 import argparse
 import json
 import re
@@ -8,7 +6,7 @@
 import sys
 sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
 # END OPENSOURCE
-import tmp.benchmarks_pb2 as benchmarks_pb2
+from benchmarks import benchmarks_pb2
 
 __file_size_map = {}
 
diff --git a/benchmarks/util/schema_proto2_to_proto3_util.h b/benchmarks/util/schema_proto2_to_proto3_util.h
index 0079f6f..ea7b796 100644
--- a/benchmarks/util/schema_proto2_to_proto3_util.h
+++ b/benchmarks/util/schema_proto2_to_proto3_util.h
@@ -187,6 +187,18 @@
   }
 };
 
+class ImportScrubber {
+ public:
+  static std::string ScrubFilename(const std::string& filename) {
+    return filename + "3";
+  }
+  static void ScrubFile(FileDescriptorProto *file) {
+    for(std::string& import: *file->mutable_dependency()) {
+      import += "3";
+    }
+  }
+};
+
 }  // namespace util
 }  // namespace protobuf
 }  // namespace google
diff --git a/build_defs/BUILD.bazel b/build_defs/BUILD.bazel
index a5d831c..4ac09c8 100644
--- a/build_defs/BUILD.bazel
+++ b/build_defs/BUILD.bazel
@@ -17,6 +17,16 @@
     value = "msvc-cl",
 )
 
+config_setting(
+    name = "aarch64",
+    values = {"cpu": "linux-aarch_64"},
+)
+
+config_setting(
+    name = "x86_64",
+    values = {"cpu": "linux-x86_64"},
+)
+
 # Android NDK builds can specify different crosstool_top flags to choose which
 # STL they use for C++. We need these multiple variants to catch all of those
 # versions of crosstool_top and reliably detect Android.
diff --git a/build_defs/arch_tests.bzl b/build_defs/arch_tests.bzl
new file mode 100644
index 0000000..7f8a6af
--- /dev/null
+++ b/build_defs/arch_tests.bzl
@@ -0,0 +1,56 @@
+"""Generated unittests to verify that a binary is built for the expected architecture."""
+
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+
+def _arch_test_impl(
+        name,
+        platform,
+        file_platform,
+        bazel_binaries = [],
+        system_binaries = [],
+        **kwargs):
+    """
+    Bazel rule to verify that a Bazel or system binary is built for the
+    aarch64 architecture.
+
+    Args:
+      name: the name of the test.
+      platform: a diagnostic name for this architecture.
+      file_platform: the expected output of `file`.
+      bazel_binaries: a set of binary targets to inspect.
+      system_binaries: a set of paths to system executables to inspect.
+      **kargs: other keyword arguments that are passed to the test.
+    """
+
+    inline_sh_test(
+        name = name,
+        tools = bazel_binaries,
+        cmd = """
+          for binary in "$(rootpaths %s) %s"; do
+            (file -L $$binary | grep -q "%s") \
+                || (echo "Test binary is not an %s binary: "; file -L $$binary; exit 1)
+          done
+        """ % (" ".join(bazel_binaries),
+               " ".join(system_binaries),
+               file_platform,
+               platform),
+        target_compatible_with = select({
+          "//build_defs:"+platform: [],
+          "//conditions:default": ["@platforms//:incompatible"],
+        }),
+    )
+
+
+def aarch64_test(**kwargs):
+  _arch_test_impl(
+    platform = "aarch64",
+    file_platform = "ELF 64-bit LSB executable, ARM aarch64",
+    **kwargs,
+  )
+
+def x86_64_test(**kwargs):
+  _arch_test_impl(
+    platform = "x86_64",
+    file_platform = "ELF 64-bit LSB executable, ARM x86_64",
+    **kwargs,
+  )
diff --git a/build_defs/internal_shell.bzl b/build_defs/internal_shell.bzl
new file mode 100644
index 0000000..0dda146
--- /dev/null
+++ b/build_defs/internal_shell.bzl
@@ -0,0 +1,85 @@
+def inline_sh_binary(
+        name,
+        srcs = [],
+        tools = [],
+        deps = [],
+        cmd = "",
+        testonly = None,
+        **kwargs):
+    """Bazel rule to wrap up an inline bash script in a binary.  This is most
+    useful as a stop-gap solution for migrating off Autotools.  These binaries
+    are likely to be non-hermetic, with implicit system dependencies.
+
+    NOTE: the rule is only an internal workaround. The interface may change and
+    the rule may be removed when everything is properly "Bazelified".
+
+    Args:
+      name: the name of the inline_sh_binary.
+      srcs: the files used directly by the script.
+      tools: the executable tools used directly by the script.  Any target used
+        with rootpath/execpath/location must be declared here or in `srcs`.
+      deps: a list of dependency labels that are required to run this binary.
+      **kargs: other keyword arguments that are passed to sh_binary.
+      testonly: common rule attribute (see:
+          https://bazel.build/reference/be/common-definitions#common-attributes)
+    """
+
+
+    native.genrule(
+        name = name + "_genrule",
+        srcs = srcs,
+        exec_tools = tools,
+        outs = [name + ".sh"],
+        cmd = "cat <<'EOF' >$(OUTS)\n#!/bin/bash -exu\n%s\nEOF\n" % cmd,
+        testonly = testonly,
+        visibility = ["//visibility:private"],
+    )
+
+    native.sh_binary(
+        name = name,
+        srcs = [name + "_genrule"],
+        data = srcs + tools + deps,
+        testonly = testonly,
+        **kwargs
+    )
+
+def inline_sh_test(
+        name,
+        srcs = [],
+        tools = [],
+        deps = [],
+        cmd = "",
+        **kwargs):
+    """Bazel rule to wrap up an inline bash script in a test.  This is most
+    useful as a stop-gap solution for migrating off Autotools.  These tests
+    are likely to be non-hermetic, with implicit system dependencies.
+
+    NOTE: the rule is only an internal workaround. The interface may change and
+    the rule may be removed when everything is properly "Bazelified".
+
+    Args:
+      name: the name of the inline_sh_binary.
+      srcs: the files used directly by the script.
+      tools: the executable tools used directly by the script.  Any target used
+        with rootpath/execpath/location must be declared here or in `srcs`.
+      deps: a list of dependency labels that are required to run this binary.
+      **kargs: other keyword arguments that are passed to sh_binary.
+          https://bazel.build/reference/be/common-definitions#common-attributes)
+    """
+
+
+    native.genrule(
+        name = name + "_genrule",
+        srcs = srcs,
+        exec_tools = tools,
+        outs = [name + ".sh"],
+        cmd = "cat <<'EOF' >$(OUTS)\n#!/bin/bash -exu\n%s\nEOF\n" % cmd,
+        visibility = ["//visibility:private"],
+    )
+
+    native.sh_test(
+        name = name,
+        srcs = [name + "_genrule"],
+        data = srcs + tools + deps,
+        **kwargs
+    )
diff --git a/cmake/conformance.cmake b/cmake/conformance.cmake
index 338b275..3397fa3 100644
--- a/cmake/conformance.cmake
+++ b/cmake/conformance.cmake
@@ -42,11 +42,11 @@
 
 target_include_directories(
   conformance_test_runner
-  PUBLIC ${protobuf_SOURCE_DIR}/conformance)
+  PUBLIC ${protobuf_SOURCE_DIR} ${protobuf_SOURCE_DIR}/conformance)
 
 target_include_directories(
   conformance_cpp
-  PUBLIC ${protobuf_SOURCE_DIR}/conformance)
+  PUBLIC ${protobuf_SOURCE_DIR})
 
 target_link_libraries(conformance_test_runner ${protobuf_LIB_PROTOBUF})
 target_link_libraries(conformance_cpp ${protobuf_LIB_PROTOBUF})
diff --git a/cmake/install.cmake b/cmake/install.cmake
index cf24e30..9379aa7 100644
--- a/cmake/install.cmake
+++ b/cmake/install.cmake
@@ -62,43 +62,6 @@
     RENAME "${_extract_name}")
 endforeach()
 
-# Internal function for parsing auto tools scripts
-function(_protobuf_auto_list FILE_NAME VARIABLE)
-  file(STRINGS ${FILE_NAME} _strings)
-  set(_list)
-  foreach(_string ${_strings})
-    set(_found)
-    string(REGEX MATCH "^[ \t]*${VARIABLE}[ \t]*=[ \t]*" _found "${_string}")
-    if(_found)
-      string(LENGTH "${_found}" _length)
-      string(SUBSTRING "${_string}" ${_length} -1 _draft_list)
-      foreach(_item ${_draft_list})
-        string(STRIP "${_item}" _item)
-        list(APPEND _list "${_item}")
-      endforeach()
-    endif()
-  endforeach()
-  set(${VARIABLE} ${_list} PARENT_SCOPE)
-endfunction()
-
-# Install well-known type proto files
-_protobuf_auto_list("${protobuf_SOURCE_DIR}/src/Makefile.am" nobase_dist_proto_DATA)
-foreach(_file ${nobase_dist_proto_DATA})
-  get_filename_component(_file_from "${protobuf_SOURCE_DIR}/src/${_file}" ABSOLUTE)
-  get_filename_component(_file_name ${_file} NAME)
-  get_filename_component(_dir ${_file} DIRECTORY)
-  if(EXISTS "${_file_from}")
-    install(FILES "${_file_from}"
-      DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_dir}"
-      COMPONENT protobuf-protos
-      RENAME "${_file_name}")
-  else()
-    message(AUTHOR_WARNING "The file \"${_file_from}\" is listed in "
-      "\"${protobuf_SOURCE_DIR}/src/Makefile.am\" as nobase_dist_proto_DATA "
-      "but there not exists. The file will not be installed.")
-  endif()
-endforeach()
-
 # Install configuration
 set(_install_cmakedir_desc "Directory relative to CMAKE_INSTALL to install the cmake configuration files")
 set(_build_cmakedir_desc "Directory relative to CMAKE_CURRENT_BINARY_DIR for cmake configuration files")
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index 375a79d..0000000
--- a/configure.ac
+++ /dev/null
@@ -1,247 +0,0 @@
-## Process this file with autoconf to produce configure.
-## In general, the safest way to proceed is to run ./autogen.sh
-
-AC_PREREQ(2.59)
-
-# Note:  If you change the version, you must also update it in:
-# * Protobuf.podspec
-# * csharp/Google.Protobuf.Tools.nuspec
-# * csharp/src/*/AssemblyInfo.cs
-# * csharp/src/Google.Protobuf/Google.Protobuf.nuspec
-# * java/*/pom.xml
-# * python/google/protobuf/__init__.py
-# * protoc-artifacts/pom.xml
-# * src/google/protobuf/stubs/common.h
-# * src/Makefile.am (Update -version-info for LDFLAGS if needed)
-#
-# In the SVN trunk, the version should always be the next anticipated release
-# version with the "-pre" suffix.  (We used to use "-SNAPSHOT" but this pushed
-# the size of one file name in the dist tarfile over the 99-char limit.)
-AC_INIT([Protocol Buffers],[3.21.5],[protobuf@googlegroups.com],[protobuf])
-
-AM_MAINTAINER_MODE([enable])
-
-AC_CONFIG_SRCDIR(src/google/protobuf/message.cc)
-# The config file is generated but not used by the source code, since we only
-# need very few of them, e.g. HAVE_PTHREAD and HAVE_ZLIB. Those macros are
-# passed down in CXXFLAGS manually in src/Makefile.am
-AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_MACRO_DIR([m4])
-
-AC_ARG_VAR(DIST_LANG, [language to include in the distribution package (i.e., make dist)])
-case "$DIST_LANG" in
-  "") DIST_LANG=all ;;
-  all | cpp | csharp | java | python | javanano | objectivec | ruby | php) ;;
-  *) AC_MSG_FAILURE([unknown language: $DIST_LANG]) ;;
-esac
-AC_SUBST(DIST_LANG)
-
-# autoconf's default CXXFLAGS are usually "-g -O2".  These aren't necessarily
-# the best choice for libprotobuf.
-AS_IF([test "x${ac_cv_env_CFLAGS_set}" = "x"],
-      [CFLAGS=""])
-AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"],
-      [CXXFLAGS=""])
-
-AC_CANONICAL_TARGET
-
-AM_INIT_AUTOMAKE([1.9 tar-ustar subdir-objects])
-
-# Silent rules enabled: the output is minimal but informative.
-# In particular, the warnings from the compiler stick out very clearly.
-# To see all logs, use the --disable-silent-rules on configure or via make V=1
-AM_SILENT_RULES([yes])
-
-AC_ARG_WITH([zlib],
-  [AS_HELP_STRING([--with-zlib],
-    [include classes for streaming compressed data in and out @<:@default=check@:>@])],
-  [],[with_zlib=check])
-
-AC_ARG_WITH([zlib-include],
-  [AS_HELP_STRING([--with-zlib-include=PATH],
-    [zlib include directory])],
-  [CPPFLAGS="-I$withval $CPPFLAGS"])
-
-AC_ARG_WITH([zlib-lib],
-  [AS_HELP_STRING([--with-zlib-lib=PATH],
-    [zlib lib directory])],
-  [LDFLAGS="-L$withval $LDFLAGS"])
-
-AC_ARG_WITH([protoc],
-  [AS_HELP_STRING([--with-protoc=COMMAND],
-    [use the given protoc command instead of building a new one when building tests (useful for cross-compiling)])],
-  [],[with_protoc=no])
-
-# Checks for programs.
-AC_PROG_CC
-AC_PROG_CXX
-AC_PROG_CXX_FOR_BUILD
-AC_LANG([C++])
-ACX_USE_SYSTEM_EXTENSIONS
-m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
-AM_CONDITIONAL(GCC, test "$GCC" = yes)   # let the Makefile know if we're gcc
-AS_CASE([$target_os], [darwin*], [AC_PROG_OBJC], [AM_CONDITIONAL([am__fastdepOBJC], [false])])
-
-# test_util.cc takes forever to compile with GCC and optimization turned on.
-AC_MSG_CHECKING([C++ compiler flags...])
-AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"],[
-  AS_IF([test "$GCC" = "yes"],[
-    PROTOBUF_OPT_FLAG="-O2"
-    CXXFLAGS="${CXXFLAGS} -g"
-  ])
-
-  # Protocol Buffers contains several checks that are intended to be used only
-  # for debugging and which might hurt performance.  Most users are probably
-  # end users who don't want these checks, so add -DNDEBUG by default.
-  CXXFLAGS="$CXXFLAGS -std=c++11 -DNDEBUG"
-
-  AC_MSG_RESULT([use default: $PROTOBUF_OPT_FLAG $CXXFLAGS])
-],[
-  AC_MSG_RESULT([use user-supplied: $CXXFLAGS])
-])
-
-AC_SUBST(PROTOBUF_OPT_FLAG)
-
-ACX_CHECK_SUNCC
-
-# Have to do libtool after SUNCC, other wise it "helpfully" adds Crun Cstd
-# to the link
-AC_PROG_LIBTOOL
-
-# Check whether the linker supports version scripts
-AC_MSG_CHECKING([whether the linker supports version scripts])
-save_LDFLAGS=$LDFLAGS
-LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
-cat > conftest.map <<EOF
-{
-  global:
-    main;
-  local:
-    *;
-};
-EOF
-AC_LINK_IFELSE(
-  [AC_LANG_SOURCE([int main() { return 0; }])],
-  [have_ld_version_script=yes; AC_MSG_RESULT(yes)],
-  [have_ld_version_script=no; AC_MSG_RESULT(no)])
-LDFLAGS=$save_LDFLAGS
-AM_CONDITIONAL([HAVE_LD_VERSION_SCRIPT], [test "$have_ld_version_script" = "yes"])
-
-# Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS([fcntl.h inttypes.h limits.h stdlib.h unistd.h])
-
-# Checks for library functions.
-AC_FUNC_MEMCMP
-AC_FUNC_STRTOD
-AC_CHECK_FUNCS([ftruncate memset mkdir strchr strerror strtol])
-
-# Check for zlib.
-HAVE_ZLIB=0
-AS_IF([test "$with_zlib" != no], [
-  AC_MSG_CHECKING([zlib version])
-
-  # First check the zlib header version.
-  AC_COMPILE_IFELSE(
-    [AC_LANG_PROGRAM([[
-        #include <zlib.h>
-        #if !defined(ZLIB_VERNUM) || (ZLIB_VERNUM < 0x1204)
-        # error zlib version too old
-        #endif
-        ]], [])], [
-    AC_MSG_RESULT([ok (1.2.0.4 or later)])
-
-    # Also need to add -lz to the linker flags and make sure this succeeds.
-    AC_SEARCH_LIBS([zlibVersion], [z], [
-      AC_DEFINE([HAVE_ZLIB], [1], [Enable classes using zlib compression.])
-      HAVE_ZLIB=1
-    ], [
-      AS_IF([test "$with_zlib" != check], [
-        AC_MSG_FAILURE([--with-zlib was given, but no working zlib library was found])
-      ])
-    ])
-  ], [
-    AS_IF([test "$with_zlib" = check], [
-      AC_MSG_RESULT([headers missing or too old (requires 1.2.0.4)])
-    ], [
-      AC_MSG_FAILURE([--with-zlib was given, but zlib headers were not present or were too old (requires 1.2.0.4)])
-    ])
-  ])
-])
-AM_CONDITIONAL([HAVE_ZLIB], [test $HAVE_ZLIB = 1])
-
-# Add -std=c++11 if necesssary. It is important for us to do this before the
-# libatomic check below, since that also depends on C++11.
-AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory])
-
-dnl On some platforms, std::atomic needs a helper library
-AC_MSG_CHECKING(whether -latomic is needed)
-AC_LINK_IFELSE([AC_LANG_SOURCE([[
-  #include <atomic>
-  #include <cstdint>
-  std::atomic<std::int64_t> v;
-  int main() {
-    return v;
-  }
-]])], STD_ATOMIC_NEED_LIBATOMIC=no, STD_ATOMIC_NEED_LIBATOMIC=yes)
-AC_MSG_RESULT($STD_ATOMIC_NEED_LIBATOMIC)
-if test "x$STD_ATOMIC_NEED_LIBATOMIC" = xyes; then
-  LIBATOMIC_LIBS="-latomic"
-fi
-AC_SUBST([LIBATOMIC_LIBS])
-
-AS_IF([test "$with_protoc" != "no"], [
-  PROTOC=$with_protoc
-  AS_IF([test "$with_protoc" = "yes"], [
-    # No argument given.  Use system protoc.
-    PROTOC=protoc
-  ])
-  AS_IF([echo "$PROTOC" | grep -q '^@<:@^/@:>@.*/'], [
-    # Does not start with a slash, but contains a slash.  So, it's a relative
-    # path (as opposed to an absolute path or an executable in $PATH).
-    # Since it will actually be executed from the src directory, prefix with
-    # the current directory.  We also insert $ac_top_build_prefix in case this
-    # is a nested package and --with-protoc was actually given on the outer
-    # package's configure script.
-    PROTOC=`pwd`/${ac_top_build_prefix}$PROTOC
-  ])
-  AC_SUBST([PROTOC])
-])
-AM_CONDITIONAL([USE_EXTERNAL_PROTOC], [test "$with_protoc" != "no"])
-
-AX_PTHREAD
-AM_CONDITIONAL([HAVE_PTHREAD], [test "x$ax_pthread_ok" = "xyes"])
-# We still keep this for improving pbconfig.h for unsupported platforms.
-AC_CXX_STL_HASH
-
-# Enable ObjC support for conformance directory on OS X.
-OBJC_CONFORMANCE_TEST=0
-case "$target_os" in
-  darwin*)
-    OBJC_CONFORMANCE_TEST=1
-    ;;
-esac
-AM_CONDITIONAL([OBJC_CONFORMANCE_TEST], [test $OBJC_CONFORMANCE_TEST = 1])
-
-AC_MSG_CHECKING(whether -llog is needed)
-ANDROID_TEST=no
-case "$target_os" in
-  *android*)
-    ANDROID_TEST=yes
-    ;;
-esac
-AC_MSG_RESULT($ANDROID_TEST)
-if test "x$ANDROID_TEST" = xyes; then
-  LIBLOG_LIBS="-llog"
-fi
-AC_SUBST([LIBLOG_LIBS])
-
-# HACK:  Make gmock's configure script pick up our copy of CFLAGS and CXXFLAGS,
-#   since the flags added by ACX_CHECK_SUNCC must be used when compiling gmock
-#   too.
-export CFLAGS
-export CXXFLAGS
-AC_CONFIG_SUBDIRS([third_party/googletest])
-
-AC_CONFIG_FILES([Makefile src/Makefile benchmarks/Makefile conformance/Makefile protobuf.pc protobuf-lite.pc])
-AC_OUTPUT
diff --git a/conformance/BUILD.bazel b/conformance/BUILD.bazel
index fef0366..0e7ad59 100644
--- a/conformance/BUILD.bazel
+++ b/conformance/BUILD.bazel
@@ -1,6 +1,9 @@
 # Conformance testing for Protobuf.
 
-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library")
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library", "objc_library")
+load("@rules_python//python:defs.bzl", "py_library")
+load("//:protobuf.bzl", "internal_py_proto_library", "internal_php_proto_library", "internal_csharp_proto_library", "internal_ruby_proto_library", "internal_objc_proto_library")
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
 load(
     "@rules_pkg//:mappings.bzl",
     "pkg_attributes",
@@ -11,20 +14,37 @@
 
 exports_files([
     "conformance_test_runner.sh",
+    "failure_list_cpp.txt",
+    "failure_list_csharp.txt",
     "failure_list_java.txt",
     "failure_list_java_lite.txt",
+    "failure_list_objc.txt",
+    "failure_list_php.txt",
+    "failure_list_php_c.txt",
+    "failure_list_python.txt",
+    "failure_list_python_cpp.txt",
+    "failure_list_ruby.txt",
+    "failure_list_jruby.txt",
+    "text_format_failure_list_cpp.txt",
+    "text_format_failure_list_csharp.txt",
     "text_format_failure_list_java.txt",
     "text_format_failure_list_java_lite.txt",
+    "text_format_failure_list_php.txt",
+    "text_format_failure_list_php_c.txt",
+    "text_format_failure_list_python.txt",
+    "text_format_failure_list_python_cpp.txt",
+    "text_format_failure_list_ruby.txt",
+    "text_format_failure_list_jruby.txt",
 ])
 
 cc_proto_library(
     name = "test_messages_proto2_proto_cc",
-    deps = ["//:test_messages_proto2_proto"],
+    deps = ["//src/google/protobuf:test_messages_proto2_proto"],
 )
 
 cc_proto_library(
     name = "test_messages_proto3_proto_cc",
-    deps = ["//:test_messages_proto3_proto"],
+    deps = ["//src/google/protobuf:test_messages_proto3_proto"],
 )
 
 proto_library(
@@ -34,10 +54,18 @@
 )
 
 cc_proto_library(
-    name = "conformance_proto_cc",
+    name = "conformance_cc_proto",
     deps = [":conformance_proto"],
 )
 
+internal_csharp_proto_library(
+    name = "conformance_csharp_proto",
+    srcs = ["conformance.proto"],
+    visibility = [
+        "//csharp:__subpackages__",
+    ],
+)
+
 java_proto_library(
     name = "conformance_java_proto",
     visibility = [
@@ -54,6 +82,51 @@
     deps = [":conformance_proto"],
 )
 
+internal_objc_proto_library(
+    name = "conformance_objc_proto",
+    srcs = ["conformance.proto"],
+    visibility = [
+        "//conformance:__pkg__",
+        "//objc:__pkg__",
+    ],
+)
+
+internal_py_proto_library(
+    name = "conformance_py_proto",
+    srcs = ["conformance.proto"],
+    visibility = [
+        "//python:__subpackages__",
+    ],
+    srcs_version = "PY2AND3",
+)
+
+internal_php_proto_library(
+    name = "conformance_php_proto",
+    srcs = ["conformance.proto"],
+    outs = [
+        "Conformance/ConformanceRequest.php",
+        "Conformance/ConformanceResponse.php",
+        "Conformance/FailureSet.php",
+        "Conformance/JspbEncodingConfig.php",
+        "Conformance/TestCategory.php",
+        "Conformance/WireFormat.php",
+        "GPBMetadata/Conformance.php",
+    ],
+    visibility = [
+        "//conformance:__pkg__",
+        "//php:__pkg__",
+    ],
+)
+
+internal_ruby_proto_library(
+    name = "conformance_ruby_proto",
+    srcs = ["conformance.proto"],
+    visibility = [
+        "//conformance:__pkg__",
+        "//ruby:__pkg__",
+    ],
+)
+
 cc_library(
     name = "jsoncpp",
     srcs = ["third_party/jsoncpp/jsoncpp.cpp"],
@@ -71,7 +144,7 @@
         "conformance_test.h",
     ],
     includes = ["."],
-    deps = [":conformance_proto_cc"],
+    deps = [":conformance_cc_proto"],
 )
 
 cc_library(
@@ -108,13 +181,23 @@
     ],
 )
 
+cc_binary(
+    name = "conformance_cpp",
+    srcs = ["conformance_cpp.cc"],
+    deps = [
+        ":conformance_cc_proto",
+        "//:protobuf",
+        "//:test_messages_proto2_cc_proto",
+        "//:test_messages_proto3_cc_proto",
+    ],
+    testonly = 1,
+    visibility = ["//src:__subpackages__"],
+)
+
 java_binary(
     name = "conformance_java",
     srcs = ["ConformanceJava.java"],
     main_class = "ConformanceJava",
-    visibility = [
-        "//java:__subpackages__",
-    ],
     deps = [
         ":conformance_java_proto",
         "//:protobuf_java",
@@ -122,11 +205,14 @@
         "//:test_messages_proto2_java_proto",
         "//:test_messages_proto3_java_proto",
     ],
+    testonly = 1,
+    visibility = [
+        "//java:__subpackages__",
+    ],
 )
 
 java_binary(
     name = "conformance_java_lite",
-    srcs = ["ConformanceJavaLite.java"],
     main_class = "ConformanceJavaLite",
     visibility = [
         "//java:__subpackages__",
@@ -138,8 +224,116 @@
         "//:test_messages_proto2_java_proto_lite",
         "//:test_messages_proto3_java_proto_lite",
     ],
+    testonly = 1,
+    srcs = ["ConformanceJavaLite.java"],
 )
 
+py_binary(
+    name = "conformance_python",
+    srcs = ["conformance_python.py"],
+    deps = [
+        ":conformance_py_proto",
+        "//:protobuf_python",
+        "//python:test_messages_proto2_py_proto",
+        "//python:test_messages_proto3_py_proto",
+    ],
+    imports = [".", "../python"],
+    srcs_version = "PY2AND3",
+    testonly = 1,
+    visibility = ["//python:__subpackages__"],
+)
+
+inline_sh_binary(
+    name = "conformance_php",
+    srcs = [
+        "conformance_php.php",
+        "autoload.php",
+    ],
+    deps = [
+        ":conformance_php_proto",
+        "//php:source_files",
+        "//:test_messages_proto3_php_proto",
+    ],
+    cmd = """
+        php -d include_path=conformance:src/google/protobuf \\
+            -d auto_prepend_file=$(rootpath autoload.php) \\
+            $(rootpath conformance_php.php)
+    """,
+    testonly = 1,
+    visibility = ["//php:__subpackages__"],
+)
+
+inline_sh_binary(
+    name = "conformance_php_c",
+    srcs = [
+        "conformance_php.php",
+        "//php:extension",
+    ],
+    deps = [
+        ":conformance_php_proto",
+        "//:test_messages_proto3_php_proto",
+    ],
+    cmd = """
+        php -dextension=$(rootpath //php:extension) \\
+            -d include_path=conformance:src/google/protobuf \\
+            $(rootpath conformance_php.php)
+    """,
+    testonly = 1,
+    visibility = ["//php:__subpackages__"],
+)
+
+inline_sh_binary(
+    name = "conformance_csharp",
+    srcs = ["//csharp/src/Google.Protobuf.Conformance:conformance_dll"],
+    deps = [
+        "//csharp/src/Google.Protobuf.Conformance:conformance_runfiles",
+    ],
+    cmd = "dotnet $(rootpath //csharp/src/Google.Protobuf.Conformance:conformance_dll)",
+    testonly = 1,
+    visibility = ["//csharp:__subpackages__"],
+)
+
+objc_library(
+    name = "conformance_objc_lib",
+    non_arc_srcs = ["conformance_objc.m"],
+    deps = [
+        ":conformance_objc_proto",
+        "//:test_messages_proto2_objc_proto",
+        "//:test_messages_proto3_objc_proto",
+    ],
+    testonly = 1,
+    # See https://github.com/bazelbuild/bazel/issues/12897.
+    tags = ["manual"],
+)
+
+cc_binary(
+    name = "conformance_objc",
+    deps = [":conformance_objc_lib"],
+    testonly = 1,
+    # See https://github.com/bazelbuild/bazel/issues/12897.
+    tags = ["manual"],
+    visibility = ["//objectivec:__subpackages__"],
+)
+
+inline_sh_binary(
+    name = "conformance_ruby",
+    srcs = ["conformance_ruby.rb"],
+    deps = [
+        ":conformance_ruby_proto",
+        "//:well_known_ruby_protos",
+        "//:test_messages_proto2_ruby_proto",
+        "//:test_messages_proto3_ruby_proto",
+        "//ruby:protobuf",
+    ],
+    cmd = "RUBYLIB=ruby/lib:conformance:src $(rootpath conformance_ruby.rb)",
+    testonly = 1,
+    visibility = ["//ruby:__subpackages__"],
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
 filegroup(
     name = "all_files",
     srcs = glob(["**/*"]),
@@ -156,7 +350,6 @@
 
             # The following are not in autotools dist:
             "autoload.php",
-            "conformance_nodejs.js",
             "failure_list_jruby.txt",
             "update_failure_list.py",
         ],
diff --git a/conformance/Makefile.am b/conformance/Makefile.am
deleted file mode 100644
index 415412b..0000000
--- a/conformance/Makefile.am
+++ /dev/null
@@ -1,372 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-conformance_protoc_inputs =                                    \
-  conformance.proto                                            \
-  $(top_srcdir)/src/google/protobuf/test_messages_proto3.proto
-
-# proto2 input files, should be separated with proto3, as we
-# can't generate proto2 files for php.
-conformance_proto2_protoc_inputs =                             \
-  $(top_srcdir)/src/google/protobuf/test_messages_proto2.proto
-
-well_known_type_protoc_inputs =                                \
-  $(top_srcdir)/src/google/protobuf/any.proto                  \
-  $(top_srcdir)/src/google/protobuf/duration.proto             \
-  $(top_srcdir)/src/google/protobuf/field_mask.proto           \
-  $(top_srcdir)/src/google/protobuf/struct.proto               \
-  $(top_srcdir)/src/google/protobuf/timestamp.proto            \
-  $(top_srcdir)/src/google/protobuf/wrappers.proto
-
-
-protoc_outputs =                                               \
-  conformance.pb.cc                                            \
-  conformance.pb.h
-
-other_language_protoc_outputs =                                \
-  conformance_pb2.py                                           \
-  Conformance.pbobjc.h                                         \
-  Conformance.pbobjc.m                                         \
-  conformance_pb.js                                            \
-  conformance_pb.rb                                            \
-  com/google/protobuf/Any.java                                 \
-  com/google/protobuf/AnyOrBuilder.java                        \
-  com/google/protobuf/AnyProto.java                            \
-  com/google/protobuf/BoolValue.java                           \
-  com/google/protobuf/BoolValueOrBuilder.java                  \
-  com/google/protobuf/BytesValue.java                          \
-  com/google/protobuf/BytesValueOrBuilder.java                 \
-  com/google/protobuf/conformance/Conformance.java             \
-  com/google/protobuf/DoubleValue.java                         \
-  com/google/protobuf/DoubleValueOrBuilder.java                \
-  com/google/protobuf/Duration.java                            \
-  com/google/protobuf/DurationOrBuilder.java                   \
-  com/google/protobuf/DurationProto.java                       \
-  com/google/protobuf/FieldMask.java                           \
-  com/google/protobuf/FieldMaskOrBuilder.java                  \
-  com/google/protobuf/FieldMaskProto.java                      \
-  com/google/protobuf/FloatValue.java                          \
-  com/google/protobuf/FloatValueOrBuilder.java                 \
-  com/google/protobuf/Int32Value.java                          \
-  com/google/protobuf/Int32ValueOrBuilder.java                 \
-  com/google/protobuf/Int64Value.java                          \
-  com/google/protobuf/Int64ValueOrBuilder.java                 \
-  com/google/protobuf/ListValue.java                           \
-  com/google/protobuf/ListValueOrBuilder.java                  \
-  com/google/protobuf/NullValue.java                           \
-  com/google/protobuf/StringValue.java                         \
-  com/google/protobuf/StringValueOrBuilder.java                \
-  com/google/protobuf/Struct.java                              \
-  com/google/protobuf/StructOrBuilder.java                     \
-  com/google/protobuf/StructProto.java                         \
-  com/google/protobuf/Timestamp.java                           \
-  com/google/protobuf/TimestampOrBuilder.java                  \
-  com/google/protobuf/TimestampProto.java                      \
-  com/google/protobuf/UInt32Value.java                         \
-  com/google/protobuf/UInt32ValueOrBuilder.java                \
-  com/google/protobuf/UInt64Value.java                         \
-  com/google/protobuf/UInt64ValueOrBuilder.java                \
-  com/google/protobuf/Value.java                               \
-  com/google/protobuf/ValueOrBuilder.java                      \
-  com/google/protobuf/WrappersProto.java                       \
-  com/google/protobuf_test_messages/proto3/TestMessagesProto3.java \
-  com/google/protobuf_test_messages/proto2/TestMessagesProto2.java \
-  google/protobuf/any.pb.cc                                    \
-  google/protobuf/any.pb.h                                     \
-  google/protobuf/any.rb                                       \
-  google/protobuf/any_pb2.py                                   \
-  google/protobuf/duration.pb.cc                               \
-  google/protobuf/duration.pb.h                                \
-  google/protobuf/duration.rb                                  \
-  google/protobuf/duration_pb2.py                              \
-  google/protobuf/field_mask.pb.cc                             \
-  google/protobuf/field_mask.pb.h                              \
-  google/protobuf/field_mask.rb                                \
-  google/protobuf/field_mask_pb2.py                            \
-  google/protobuf/struct.pb.cc                                 \
-  google/protobuf/struct.pb.h                                  \
-  google/protobuf/struct.rb                                    \
-  google/protobuf/struct_pb2.py                                \
-  google/protobuf/TestMessagesProto2.pbobjc.h                  \
-  google/protobuf/TestMessagesProto2.pbobjc.m                  \
-  google/protobuf/TestMessagesProto3.pbobjc.h                  \
-  google/protobuf/TestMessagesProto3.pbobjc.m                  \
-  google/protobuf/test_messages_proto3.pb.cc                   \
-  google/protobuf/test_messages_proto3.pb.h                    \
-  google/protobuf/test_messages_proto2.pb.cc                   \
-  google/protobuf/test_messages_proto2.pb.h                    \
-  google/protobuf/test_messages_proto3_pb.rb                   \
-  google/protobuf/test_messages_proto3_pb2.py                  \
-  google/protobuf/test_messages_proto2_pb2.py                  \
-  google/protobuf/timestamp.pb.cc                              \
-  google/protobuf/timestamp.pb.h                               \
-  google/protobuf/timestamp.rb                                 \
-  google/protobuf/timestamp_pb2.py                             \
-  google/protobuf/wrappers.pb.cc                               \
-  google/protobuf/wrappers.pb.h                                \
-  google/protobuf/wrappers.rb                                  \
-  google/protobuf/wrappers_pb2.py                              \
-  Conformance/ConformanceRequest.php                           \
-  Conformance/ConformanceResponse.php                          \
-  Conformance/FailureSet.php                                   \
-  Conformance/WireFormat.php                                   \
-  GPBMetadata/Conformance.php                                  \
-  GPBMetadata/Google/Protobuf/Any.php                          \
-  GPBMetadata/Google/Protobuf/Duration.php                     \
-  GPBMetadata/Google/Protobuf/FieldMask.php                    \
-  GPBMetadata/Google/Protobuf/Struct.php                       \
-  GPBMetadata/Google/Protobuf/TestMessagesProto3.php           \
-  GPBMetadata/Google/Protobuf/Timestamp.php                    \
-  GPBMetadata/Google/Protobuf/Wrappers.php                     \
-  Google/Protobuf/Any.php                                      \
-  Google/Protobuf/BoolValue.php                                \
-  Google/Protobuf/BytesValue.php                               \
-  Google/Protobuf/DoubleValue.php                              \
-  Google/Protobuf/Duration.php                                 \
-  Google/Protobuf/FieldMask.php                                \
-  Google/Protobuf/FloatValue.php                               \
-  Google/Protobuf/Int32Value.php                               \
-  Google/Protobuf/Int64Value.php                               \
-  Google/Protobuf/ListValue.php                                \
-  Google/Protobuf/NullValue.php                                \
-  Google/Protobuf/StringValue.php                              \
-  Google/Protobuf/Struct.php                                   \
-  Google/Protobuf/Timestamp.php                                \
-  Google/Protobuf/UInt32Value.php                              \
-  Google/Protobuf/UInt64Value.php                              \
-  Google/Protobuf/Value.php                                    \
-  Protobuf_test_messages/Proto3/ForeignEnum.php                \
-  Protobuf_test_messages/Proto3/ForeignMessage.php             \
-  Protobuf_test_messages/Proto3/TestAllTypes_NestedEnum.php    \
-  Protobuf_test_messages/Proto3/TestAllTypes_NestedMessage.php \
-  Protobuf_test_messages/Proto3/TestAllTypes.php
-  # lite/com/google/protobuf/Any.java                            \
-  # lite/com/google/protobuf/AnyOrBuilder.java                   \
-  # lite/com/google/protobuf/AnyProto.java                       \
-  # lite/com/google/protobuf/BoolValue.java                      \
-  # lite/com/google/protobuf/BoolValueOrBuilder.java             \
-  # lite/com/google/protobuf/BytesValue.java                     \
-  # lite/com/google/protobuf/BytesValueOrBuilder.java            \
-  # lite/com/google/protobuf/conformance/Conformance.java        \
-  # lite/com/google/protobuf/DoubleValue.java                    \
-  # lite/com/google/protobuf/DoubleValueOrBuilder.java           \
-  # lite/com/google/protobuf/Duration.java                       \
-  # lite/com/google/protobuf/DurationOrBuilder.java              \
-  # lite/com/google/protobuf/DurationProto.java                  \
-  # lite/com/google/protobuf/FieldMask.java                      \
-  # lite/com/google/protobuf/FieldMaskOrBuilder.java             \
-  # lite/com/google/protobuf/FieldMaskProto.java                 \
-  # lite/com/google/protobuf/FloatValue.java                     \
-  # lite/com/google/protobuf/FloatValueOrBuilder.java            \
-  # lite/com/google/protobuf/Int32Value.java                     \
-  # lite/com/google/protobuf/Int32ValueOrBuilder.java            \
-  # lite/com/google/protobuf/Int64Value.java                     \
-  # lite/com/google/protobuf/Int64ValueOrBuilder.java            \
-  # lite/com/google/protobuf/ListValue.java                      \
-  # lite/com/google/protobuf/ListValueOrBuilder.java             \
-  # lite/com/google/protobuf/NullValue.java                      \
-  # lite/com/google/protobuf/StringValue.java                    \
-  # lite/com/google/protobuf/StringValueOrBuilder.java           \
-  # lite/com/google/protobuf/Struct.java                         \
-  # lite/com/google/protobuf/StructOrBuilder.java                \
-  # lite/com/google/protobuf/StructProto.java                    \
-  # lite/com/google/protobuf/Timestamp.java                      \
-  # lite/com/google/protobuf/TimestampOrBuilder.java             \
-  # lite/com/google/protobuf/TimestampProto.java                 \
-  # lite/com/google/protobuf/UInt32Value.java                    \
-  # lite/com/google/protobuf/UInt32ValueOrBuilder.java           \
-  # lite/com/google/protobuf/UInt64Value.java                    \
-  # lite/com/google/protobuf/UInt64ValueOrBuilder.java           \
-  # lite/com/google/protobuf/Value.java                          \
-  # lite/com/google/protobuf/ValueOrBuilder.java                 \
-  # lite/com/google/protobuf/WrappersProto.java
-
-bin_PROGRAMS = conformance-test-runner conformance-cpp
-
-# All source files excepet C++/Objective-C ones should be explicitly listed
-# here because the autoconf tools don't include files of other languages
-# automatically.
-EXTRA_DIST =                  \
-  ConformanceJava.java        \
-  ConformanceJavaLite.java    \
-  README.md                   \
-  conformance.proto           \
-  conformance_python.py       \
-  conformance_ruby.rb         \
-  conformance_php.php         \
-  failure_list_cpp.txt        \
-  failure_list_csharp.txt     \
-  failure_list_java.txt       \
-  failure_list_js.txt         \
-  failure_list_objc.txt       \
-  failure_list_python.txt     \
-  failure_list_python_cpp.txt \
-  failure_list_python-post26.txt \
-  failure_list_ruby.txt       \
-  failure_list_php.txt        \
-  failure_list_php_c.txt
-
-conformance_test_runner_LDADD = $(top_srcdir)/src/libprotobuf.la
-conformance_test_runner_SOURCES = conformance_test.h conformance_test.cc \
-                                  conformance_test_main.cc               \
-                                  binary_json_conformance_suite.h        \
-                                  binary_json_conformance_suite.cc       \
-                                  text_format_conformance_suite.h        \
-                                  text_format_conformance_suite.cc       \
-                                  conformance_test_runner.cc             \
-                                  third_party/jsoncpp/json.h             \
-                                  third_party/jsoncpp/jsoncpp.cpp
-nodist_conformance_test_runner_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc google/protobuf/test_messages_proto2.pb.cc
-conformance_test_runner_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)
-conformance_test_runner_CXXFLAGS = -std=c++11
-# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-conformance_test_runner-conformance_test.$(OBJEXT): conformance.pb.h
-conformance_test_runner-conformance_test_runner.$(OBJEXT): conformance.pb.h
-
-conformance_cpp_LDADD = $(top_srcdir)/src/libprotobuf.la
-conformance_cpp_SOURCES = conformance_cpp.cc
-nodist_conformance_cpp_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc google/protobuf/test_messages_proto2.pb.cc
-conformance_cpp_CPPFLAGS = -I$(top_srcdir)/src
-# Explicit dep because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_cpp" could fail if parallel enough.
-conformance_cpp-conformance_cpp.$(OBJEXT): conformance.pb.h
-
-if OBJC_CONFORMANCE_TEST
-
-bin_PROGRAMS += conformance-objc
-
-conformance_objc_SOURCES = conformance_objc.m ../objectivec/GPBProtocolBuffers.m
-nodist_conformance_objc_SOURCES = Conformance.pbobjc.m google/protobuf/TestMessagesProto2.pbobjc.m google/protobuf/TestMessagesProto3.pbobjc.m
-# On travis, the build fails without the isysroot because whatever system
-# headers are being found don't include generics support for
-# NSArray/NSDictionary, the only guess is their image at one time had an odd
-# setup for Xcode and old frameworks are being found.
-conformance_objc_CPPFLAGS = -I$(top_srcdir)/objectivec -isysroot `xcrun --sdk macosx --show-sdk-path`
-conformance_objc_LDFLAGS = -framework Foundation
-# Explicit dep because BUILT_SOURCES are only done before a "make all/check"
-# so a direct "make test_objc" could fail if parallel enough.
-conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h google/protobuf/TestMessagesProto2.pbobjc.h google/protobuf/TestMessagesProto3.pbobjc.h
-
-endif
-
-# JavaScript well-known types are expected to be in a directory called
-# google-protobuf, because they are usually in the google-protobuf npm
-# package.  But we want to use the sources from our tree, so we recreate
-# that directory structure here.
-google-protobuf:
-	mkdir google-protobuf
-
-if USE_EXTERNAL_PROTOC
-
-# Some implementations include pre-generated versions of well-known types.
-protoc_middleman: $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
-	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. --php_out=. $(conformance_protoc_inputs)
-	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. $(conformance_proto2_protoc_inputs)
-	$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. $(well_known_type_protoc_inputs)
-	## $(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
-	touch protoc_middleman
-
-else
-
-# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
-# relative to srcdir, which may not be the same as the current directory when
-# building out-of-tree.
-protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(conformance_proto2_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd $(conformance_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd $(conformance_proto2_protoc_inputs) )
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd $(well_known_type_protoc_inputs) )
-	## @mkdir -p lite
-	## oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) )
-	touch protoc_middleman
-
-endif
-
-$(protoc_outputs): protoc_middleman
-
-$(other_language_protoc_outputs): protoc_middleman
-
-CLEANFILES = $(protoc_outputs) protoc_middleman javac_middleman conformance-java javac_middleman_lite conformance-java-lite conformance-csharp conformance-php conformance-php-c $(other_language_protoc_outputs)
-
-MAINTAINERCLEANFILES =   \
-  Makefile.in
-
-javac_middleman: ConformanceJava.java protoc_middleman $(other_language_protoc_outputs)
-	jar=`ls ../java/util/target/*jar-with-dependencies.jar` && javac -classpath ../java/target/classes:$$jar ConformanceJava.java com/google/protobuf/conformance/Conformance.java com/google/protobuf_test_messages/proto3/TestMessagesProto3.java com/google/protobuf_test_messages/proto2/TestMessagesProto2.java
-	@touch javac_middleman
-
-conformance-java: javac_middleman
-	@echo "Writing shortcut script conformance-java..."
-	@echo '#! /bin/sh' > conformance-java
-	@jar=`ls ../java/util/target/*jar-with-dependencies.jar` && echo java -classpath .:../java/target/classes:$$jar ConformanceJava '$$@' >> conformance-java
-	@chmod +x conformance-java
-
-javac_middleman_lite: ConformanceJavaLite.java protoc_middleman $(other_language_protoc_outputs)
-	javac -classpath ../java/lite/target/classes:lite ConformanceJavaLite.java lite/com/google/protobuf/conformance/Conformance.java
-	@touch javac_middleman_lite
-
-conformance-java-lite: javac_middleman_lite
-	@echo "Writing shortcut script conformance-java-lite..."
-	@echo '#! /bin/sh' > conformance-java-lite
-	@echo java -classpath .:../java/lite/target/classes:lite ConformanceJavaLite '$$@' >> conformance-java-lite
-	@chmod +x conformance-java-lite
-
-# Currently the conformance code is alongside the rest of the C#
-# source, as it's easier to maintain there. We assume we've already
-# built that, so we just need a script to run it.
-conformance-csharp: $(other_language_protoc_outputs)
-	@echo "Writing shortcut script conformance-csharp..."
-	@echo '#! /bin/sh' > conformance-csharp
-	@echo 'dotnet ../csharp/src/Google.Protobuf.Conformance/bin/Release/netcoreapp3.1/Google.Protobuf.Conformance.dll "$$@"' >> conformance-csharp
-	@chmod +x conformance-csharp
-
-conformance-php:
-	@echo "Writing shortcut script conformance-php..."
-	@echo '#! /bin/sh' > conformance-php
-	@echo 'php -d auto_prepend_file=autoload.php ./conformance_php.php' >> conformance-php
-	@chmod +x conformance-php
-
-conformance-php-c:
-	@echo "Writing shortcut script conformance-php-c..."
-	@echo '#! /bin/sh' > conformance-php-c
-	@echo 'php -dextension=../php/ext/google/protobuf/modules/protobuf.so ./conformance_php.php' >> conformance-php-c
-	@chmod +x conformance-php-c
-
-# Targets for actually running tests.
-test_cpp: protoc_middleman conformance-test-runner conformance-cpp
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_cpp.txt --text_format_failure_list text_format_failure_list_cpp.txt ./conformance-cpp
-
-test_java: protoc_middleman conformance-test-runner conformance-java
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_java.txt --text_format_failure_list text_format_failure_list_java.txt ./conformance-java
-
-test_java_lite: protoc_middleman conformance-test-runner conformance-java-lite
-	./conformance-test-runner --enforce_recommended ./conformance-java-lite
-
-test_csharp: protoc_middleman conformance-test-runner conformance-csharp
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_csharp.txt --text_format_failure_list text_format_failure_list_csharp.txt ./conformance-csharp
-
-test_ruby: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
-	RUBYLIB=../ruby/lib:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_ruby.txt --text_format_failure_list text_format_failure_list_ruby.txt ./conformance_ruby.rb
-
-test_jruby: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
-	RUBYLIB=../ruby/lib:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_jruby.txt --text_format_failure_list text_format_failure_list_jruby.txt ./conformance_ruby.rb
-
-test_php: protoc_middleman conformance-test-runner conformance-php $(other_language_protoc_outputs)
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_php.txt --text_format_failure_list text_format_failure_list_php.txt ./conformance-php
-
-test_php_c: protoc_middleman conformance-test-runner conformance-php-c $(other_language_protoc_outputs)
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_php_c.txt --text_format_failure_list text_format_failure_list_php.txt ./conformance-php-c
-
-# These depend on library paths being properly set up.  The easiest way to
-# run them is to just use "tox" from the python dir.
-test_python: protoc_middleman conformance-test-runner
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_python.txt --text_format_failure_list text_format_failure_list_python.txt ./conformance_python.py
-
-test_python_cpp: protoc_middleman conformance-test-runner
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_python_cpp.txt --text_format_failure_list text_format_failure_list_python_cpp.txt ./conformance_python.py
-
-if OBJC_CONFORMANCE_TEST
-
-test_objc: protoc_middleman conformance-test-runner conformance-objc
-	./conformance-test-runner --enforce_recommended --failure_list failure_list_objc.txt ./conformance-objc
-
-endif
diff --git a/conformance/autoload.php b/conformance/autoload.php
index 0f49aec..7f04cc0 100644
--- a/conformance/autoload.php
+++ b/conformance/autoload.php
@@ -7,7 +7,7 @@
 function protobuf_autoloader_impl($class, $prefix) {
     $length = strlen($prefix);
     if ((substr($class, 0, $length) === $prefix)) {
-        $path = '../php/src/' . implode('/', array_map('ucwords', explode('\\', $class))) . '.php';
+        $path = 'php/src/' . implode('/', array_map('ucwords', explode('\\', $class))) . '.php';
         include_once $path;
     }
 }
diff --git a/conformance/conformance_cpp.cc b/conformance/conformance_cpp.cc
index dd753ca..cbfd8b5 100644
--- a/conformance/conformance_cpp.cc
+++ b/conformance/conformance_cpp.cc
@@ -44,8 +44,7 @@
 #include <google/protobuf/util/type_resolver_util.h>
 #include <google/protobuf/stubs/status.h>
 #include <google/protobuf/stubs/statusor.h>
-#include "conformance.pb.h"
-#include "conformance.pb.h"
+#include "conformance/conformance.pb.h"
 #include <google/protobuf/test_messages_proto2.pb.h>
 #include <google/protobuf/test_messages_proto3.pb.h>
 #include <google/protobuf/test_messages_proto3.pb.h>
diff --git a/conformance/conformance_nodejs.js b/conformance/conformance_nodejs.js
deleted file mode 100755
index 275fac4..0000000
--- a/conformance/conformance_nodejs.js
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env node
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-var conformance = require('conformance_pb');
-var test_messages_proto3 = require('google/protobuf/test_messages_proto3_pb');
-var test_messages_proto2 = require('google/protobuf/test_messages_proto2_pb');
-var fs = require('fs');
-
-var testCount = 0;
-
-function doTest(request) {
-  var testMessage;
-  var response = new conformance.ConformanceResponse();
-
-  try {
-    if (request.getRequestedOutputFormat() == conformance.WireFormat.JSON) {
-      response.setSkipped("JSON not supported.");
-      return response;
-    }
-
-    if (request.getRequestedOutputFormat() ==
-        conformance.WireFormat.TEXT_FORMAT) {
-      response.setSkipped('Text format is not supported as output format.');
-      return response;
-    }
-
-    switch (request.getPayloadCase()) {
-      case conformance.ConformanceRequest.PayloadCase.PROTOBUF_PAYLOAD: {
-        if (request.getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") {
-          try {
-            testMessage = test_messages_proto3.TestAllTypesProto3.deserializeBinary(
-                request.getProtobufPayload());
-          } catch (err) {
-            response.setParseError(err.toString());
-            return response;
-          }
-        } else if (request.getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2"){
-          try {
-            testMessage = test_messages_proto2.TestAllTypesProto2.deserializeBinary(
-                request.getProtobufPayload());
-          } catch (err) {
-            response.setParseError(err.toString());
-            return response;
-          }
-        } else {
-          throw "Protobuf request doesn\'t have specific payload type";
-        }
-      } break;
-
-      case conformance.ConformanceRequest.PayloadCase.JSON_PAYLOAD:
-        response.setSkipped("JSON not supported.");
-        return response;
-
-	  case conformance.ConformanceRequest.PayloadCase.TEXT_PAYLOAD:
-	    response.setSkipped("Text format not supported.");
-        return response;
-		
-      case conformance.ConformanceRequest.PayloadCase.PAYLOAD_NOT_SET:
-        response.setRuntimeError("Request didn't have payload");
-        return response;
-    }
-
-    switch (request.getRequestedOutputFormat()) {
-      case conformance.WireFormat.UNSPECIFIED:
-        response.setRuntimeError("Unspecified output format");
-        return response;
-
-      case conformance.WireFormat.PROTOBUF:
-        response.setProtobufPayload(testMessage.serializeBinary());
-
-      case conformance.WireFormat.JSON:
-        response.setSkipped("JSON not supported.");
-        return response;
-
-      default:
-        throw "Request didn't have requested output format";
-    }
-  } catch (err) {
-    response.setRuntimeError(err.toString());
-  }
-
-  return response;
-}
-
-function onEof(totalRead) {
-  if (totalRead == 0) {
-    return undefined;
-  } else {
-    throw "conformance_nodejs: premature EOF on stdin.";
-  }
-}
-
-// Utility function to read a buffer of N bytes.
-function readBuffer(bytes) {
-  var buf = new Buffer(bytes);
-  var totalRead = 0;
-  while (totalRead < bytes) {
-    var read = 0;
-    try {
-      read = fs.readSync(process.stdin.fd, buf, totalRead, bytes - totalRead);
-    } catch (e) {
-      if (e.code == 'EOF') {
-        return onEof(totalRead)
-      } else if (e.code == 'EAGAIN') {
-      } else {
-        throw "conformance_nodejs: Error reading from stdin." + e;
-      }
-    }
-
-    totalRead += read;
-  }
-
-  return buf;
-}
-
-function writeBuffer(buffer) {
-  var totalWritten = 0;
-  while (totalWritten < buffer.length) {
-    totalWritten += fs.writeSync(
-        process.stdout.fd, buffer, totalWritten, buffer.length - totalWritten);
-  }
-}
-
-// Returns true if the test ran successfully, false on legitimate EOF.
-// If EOF is encountered in an unexpected place, raises IOError.
-function doTestIo() {
-  var lengthBuf = readBuffer(4);
-  if (!lengthBuf) {
-    return false;
-  }
-
-  var length = lengthBuf.readInt32LE(0);
-  var serializedRequest = readBuffer(length);
-  if (!serializedRequest) {
-    throw "conformance_nodejs: Failed to read request.";
-  }
-
-  serializedRequest = new Uint8Array(serializedRequest);
-  var request =
-      conformance.ConformanceRequest.deserializeBinary(serializedRequest);
-  var response = doTest(request);
-
-  var serializedResponse = response.serializeBinary();
-
-  lengthBuf = new Buffer(4);
-  lengthBuf.writeInt32LE(serializedResponse.length, 0);
-  writeBuffer(lengthBuf);
-  writeBuffer(new Buffer(serializedResponse));
-
-  testCount += 1
-
-  return true;
-}
-
-while (true) {
-  if (!doTestIo()) {
-    console.error('conformance_nodejs: received EOF from test runner ' +
-                  "after " + testCount + " tests, exiting")
-    break;
-  }
-}
diff --git a/conformance/conformance_php.php b/conformance/conformance_php.php
index 9eef0c5..f250ebf 100644
--- a/conformance/conformance_php.php
+++ b/conformance/conformance_php.php
@@ -14,7 +14,7 @@
 require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php");
 
 require_once("GPBMetadata/Conformance.php");
-require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
+require_once("GPBMetadata/TestMessagesProto3.php");
 
 use  \Conformance\TestCategory;
 use  \Conformance\WireFormat;
@@ -113,7 +113,7 @@
 while(true){
   if (!doTestIO()) {
       fprintf(STDERR,
-             "conformance_php: received EOF from test runner " +
+             "conformance_php: received EOF from test runner " .
              "after %d tests, exiting\n", $test_count);
       exit;
   }
diff --git a/conformance/conformance_test_runner.sh b/conformance/conformance_test_runner.sh
index 3149f82..0492d9d 100755
--- a/conformance/conformance_test_runner.sh
+++ b/conformance/conformance_test_runner.sh
@@ -44,13 +44,13 @@
 conformance_testee=$(rlocation $TESTEE)
 args=(--enforce_recommended)
 
-failure_list=$(rlocation $FAILURE_LIST)
-if [ "$failure_list" != "1" ] ; then
+failure_list=$(rlocation $FAILURE_LIST) || unset
+if [ -n "$failure_list" ] ; then
   args+=(--failure_list $failure_list)
 fi
 
-text_format_failure_list=$(rlocation $TEXT_FORMAT_FAILURE_LIST)
-if [ "$text_format_failure_list" != "1" ]; then
+text_format_failure_list=$(rlocation $TEXT_FORMAT_FAILURE_LIST) || unset
+if [ -n "$text_format_failure_list" ]; then
   args+=(--text_format_failure_list $text_format_failure_list)
 fi
 
diff --git a/conformance/defs.bzl b/conformance/defs.bzl
index cd36ab4..e6eceb8 100644
--- a/conformance/defs.bzl
+++ b/conformance/defs.bzl
@@ -7,7 +7,8 @@
         name,
         testee,
         failure_list = None,
-        text_format_failure_list = None):
+        text_format_failure_list = None,
+        **kwargs):
     """Conformance test runner.
 
     Args:
@@ -16,6 +17,7 @@
       failure_list: a text file with known failures, one per line.
       text_format_failure_list: a text file with known failures (one per line)
           for the text format conformance suite.
+      **kwargs: common arguments to pass to sh_test.
     """
     args = ["--testee %s" % _strip_bazel(testee)]
     failure_lists = []
@@ -36,6 +38,8 @@
         deps = [
             "@bazel_tools//tools/bash/runfiles",
         ],
+        tags = ["conformance"],
+        **kwargs,
     )
 
 def _strip_bazel(testee):
diff --git a/conformance/failure_list_js.txt b/conformance/failure_list_js.txt
deleted file mode 100644
index b7d36b6..0000000
--- a/conformance/failure_list_js.txt
+++ /dev/null
@@ -1,162 +0,0 @@
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.ENUM[4].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.ENUM[5].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.FIXED64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.INT32[7].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.INT64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.SFIXED64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.SINT64[2].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.UINT32[8].ProtobufOutput
-Recommended.Proto2.ProtobufInput.ValidDataScalarBinary.UINT64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.DefaultOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.PackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.UnpackedOutput.ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.ENUM[4].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.ENUM[5].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.FIXED64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.INT32[7].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.INT64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.SFIXED64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.SINT64[2].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.UINT32[8].ProtobufOutput
-Recommended.Proto3.ProtobufInput.ValidDataScalarBinary.UINT64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput
-Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
-Required.Proto2.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput
-Required.Proto2.ProtobufInput.ValidDataScalar.UINT64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.ENUM.ProtobufOutput
-Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
-Required.Proto3.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.ENUM.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.FIXED64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT32.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.INT64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SFIXED64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.SINT64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT32.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.PackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataRepeated.UINT64.UnpackedInput.ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[4].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.ENUM[5].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.FIXED64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.INT32[7].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.INT64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.SFIXED64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.SINT64[2].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.UINT32[8].ProtobufOutput
-Required.Proto3.ProtobufInput.ValidDataScalar.UINT64[2].ProtobufOutput
diff --git a/csharp/BUILD.bazel b/csharp/BUILD.bazel
index 4f35566..e2c9aef 100644
--- a/csharp/BUILD.bazel
+++ b/csharp/BUILD.bazel
@@ -3,11 +3,49 @@
 # See also code generation logic under /src/google/protobuf/compiler/csharp.
 
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//:protobuf.bzl", "internal_csharp_proto_library")
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+load("//conformance:defs.bzl", "conformance_test")
+
+################################################################################
+# Tests
+################################################################################
+
+conformance_test(
+    name = "conformance_test",
+    failure_list = "//conformance:failure_list_csharp.txt",
+    testee = "//conformance:conformance_csharp",
+    text_format_failure_list = "//conformance:text_format_failure_list_csharp.txt",
+)
+
+################################################################################
+# CSharp Runtime
+################################################################################
+
+filegroup(
+    name = "srcs",
+    srcs = glob([
+        "keys/*",
+        "protos/*",
+        "src/**/*.cs*",  # .cs and .csproj
+    ], exclude = [
+        # Exclude generated files.
+        "src/*/obj/**/*"
+    ]) + [
+        "src/Directory.Build.props",
+        "src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto",
+        "src/Google.Protobuf.Test/testprotos.pb",
+        "src/Google.Protobuf.sln",
+    ],
+    visibility = [
+        "//csharp:__subpackages__",
+        "//conformance:__subpackages__"
+    ],
+)
 
 filegroup(
     name = "wkt_cs_srcs",
-    data = [
-        "src/Google.Protobuf.Conformance/Conformance.cs",
+    srcs = [
         "src/Google.Protobuf/Reflection/Descriptor.cs",
         "src/Google.Protobuf/WellKnownTypes/Any.cs",
         "src/Google.Protobuf/WellKnownTypes/Api.cs",
@@ -23,13 +61,31 @@
     visibility = ["//src/google/protobuf/compiler/csharp:__pkg__"],
 )
 
+inline_sh_test(
+    name = "tests",
+    srcs = [
+        ":srcs",
+        "src/Google.Protobuf.sln",
+        "//csharp/src/Google.Protobuf.Conformance:srcs",
+        "//benchmarks/datasets:proto3_datasets"
+    ],
+    cmd = """
+        pushd `dirname $(location src/Google.Protobuf.sln)`/..
+        dotnet restore src/Google.Protobuf.sln
+        dotnet build -c Release src/Google.Protobuf.sln
+        dotnet test -c Release -f netcoreapp3.1 src/Google.Protobuf.Test/Google.Protobuf.Test.csproj
+        popd
+    """,
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
 pkg_files(
     name = "dist_files",
-    srcs = glob([
-        "keys/*",
-        "protos/*",
-        "src/**/*.cs*",  # .cs and .csproj
-    ]) + [
+    srcs = [
+        ":srcs",
         ".editorconfig",
         ".gitignore",
         "BUILD.bazel",
@@ -45,9 +101,7 @@
         "buildall.sh",
         "generate_protos.sh",
         "install_dotnet_sdk.ps1",
-        "src/Google.Protobuf.Benchmarks/wrapper_benchmark_messages.proto",
-        "src/Google.Protobuf.Test/testprotos.pb",
-        "src/Google.Protobuf.sln",
+        "//csharp/src/Google.Protobuf.Conformance:dist_files",
     ],
     strip_prefix = strip_prefix.from_root(""),
     visibility = ["//pkg:__pkg__"],
diff --git a/csharp/compatibility_tests/v3.0.0/BUILD.bazel b/csharp/compatibility_tests/v3.0.0/BUILD.bazel
new file mode 100644
index 0000000..1f6c713
--- /dev/null
+++ b/csharp/compatibility_tests/v3.0.0/BUILD.bazel
@@ -0,0 +1,16 @@
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+
+# Run csharp compatibility test between 3.0.0 and the current version.
+inline_sh_test(
+    name = "tests",
+    srcs = ["test.sh"],
+    tools = ["//:protoc"],
+    deps = glob([
+      "src/**/*.cs*",  # .cs and .csproj
+      "protos/**/*.proto",
+    ]) + [
+      "//csharp:srcs",
+      "//:well_known_protos",
+    ],
+    cmd = "$(location test.sh) 3.0.0 $(rootpath //:protoc)"
+)
diff --git a/csharp/compatibility_tests/v3.0.0/test.sh b/csharp/compatibility_tests/v3.0.0/test.sh
index 459c079..6323a6d 100755
--- a/csharp/compatibility_tests/v3.0.0/test.sh
+++ b/csharp/compatibility_tests/v3.0.0/test.sh
@@ -27,6 +27,8 @@
 
 set -ex
 
+PROTOC=$(realpath ${2:-../../../bazel-bin/protoc})
+
 # Change to the script's directory.
 cd $(dirname $0)
 
@@ -45,7 +47,7 @@
 echo "Running compatibility tests with $OLD_VERSION"
 
 # Check protoc
-[ -f ../../../src/protoc ] || {
+[ -f $PROTOC ] || {
   echo "[ERROR]: Please build protoc first."
   exit 1
 }
@@ -68,12 +70,12 @@
 # Test A.2:
 #   proto set 1: use new version
 #   proto set 2 which may import protos in set 1: use old version
-run_test "../../../src/protoc" "./old_protoc"
+run_test "$PROTOC" "./old_protoc"
 
 # Test A.3:
 #   proto set 1: use old version
 #   proto set 2 which may import protos in set 1: use new version
-run_test "./old_protoc" "../../../src/protoc"
+run_test "./old_protoc" "$PROTOC"
 
 rm old_protoc
 rm keys -r
diff --git a/csharp/generate_protos.sh b/csharp/generate_protos.sh
index 62ba1a1..d809aa9 100755
--- a/csharp/generate_protos.sh
+++ b/csharp/generate_protos.sh
@@ -11,17 +11,19 @@
 # Protocol buffer compiler to use. If the PROTOC variable is set,
 # use that. Otherwise, probe for expected locations under both
 # Windows and Unix.
+PROTOC_LOCATIONS=(
+  "bazel-bin/protoc"
+  "solution/Debug/protoc.exe"
+  "cmake/build/Debug/protoc.exe"
+  "cmake/build/Release/protoc.exe"
+)
 if [ -z "$PROTOC" ]; then
-  # TODO(jonskeet): Use an array and a for loop instead?
-  if [ -x solution/Debug/protoc.exe ]; then
-    PROTOC=solution/Debug/protoc.exe
-  elif [ -x cmake/build/Debug/protoc.exe ]; then
-    PROTOC=cmake/build/Debug/protoc.exe
-  elif [ -x cmake/build/Release/protoc.exe ]; then
-    PROTOC=cmake/build/Release/protoc.exe
-  elif [ -x src/protoc ]; then
-    PROTOC=src/protoc
-  else
+  for protoc in "${PROTOC_LOCATIONS[@]}"; do
+    if [ -x "$protoc" ]; then
+      PROTOC="$protoc"
+    fi
+  done
+  if [ -z "$PROTOC" ]; then
     echo "Unable to find protocol buffer compiler."
     exit 1
   fi
@@ -75,9 +77,6 @@
 $PROTOC -Iexamples -Isrc --csharp_out=csharp/src/AddressBook \
     examples/addressbook.proto
 
-$PROTOC -Iconformance -Isrc --csharp_out=csharp/src/Google.Protobuf.Conformance \
-    conformance/conformance.proto
-
 # Benchmark protos
 $PROTOC -Ibenchmarks \
   benchmarks/datasets/google_message1/proto3/*.proto \
diff --git a/csharp/src/Google.Protobuf.Conformance/BUILD.bazel b/csharp/src/Google.Protobuf.Conformance/BUILD.bazel
new file mode 100644
index 0000000..12ad0f7
--- /dev/null
+++ b/csharp/src/Google.Protobuf.Conformance/BUILD.bazel
@@ -0,0 +1,97 @@
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+
+inline_sh_binary(
+    name = "build_conformance_test",
+    srcs = ["Google.Protobuf.Conformance.csproj"],
+    cmd = "dotnet build -c Release $(SRCS)",
+    visibility = ["//visibility:private"],
+)
+
+CONFORMANCE_DEPS = [
+    "Google.Protobuf.dll",
+    "Google.Protobuf.Conformance.deps.json",
+    "Google.Protobuf.Conformance.pdb",
+    "Google.Protobuf.Conformance.runtimeconfig.json",
+    "Google.Protobuf.Test.dll",
+    "Google.Protobuf.Test.TestProtos.dll",
+    "Microsoft.TestPlatform.CommunicationUtilities.dll",
+    "Microsoft.TestPlatform.CoreUtilities.dll",
+    "Microsoft.TestPlatform.CrossPlatEngine.dll",
+    "Microsoft.TestPlatform.PlatformAbstractions.dll",
+    "Microsoft.TestPlatform.Utilities.dll",
+    "Microsoft.VisualStudio.CodeCoverage.Shim.dll",
+    "Microsoft.VisualStudio.TestPlatform.Common.dll",
+    "Microsoft.VisualStudio.TestPlatform.ObjectModel.dll",
+    "NUnit3.TestAdapter.dll",
+    "Newtonsoft.Json.dll",
+    "NuGet.Frameworks.dll",
+    "nunit.engine.api.dll",
+    "nunit.engine.core.dll",
+    "nunit.engine.dll",
+    "nunit.framework.dll",
+    "testcentric.engine.metadata.dll",
+    "testhost.dll",
+]
+
+filegroup(
+    name = "srcs",
+    srcs = [
+        "Conformance.cs",
+        "Program.cs",
+        "Google.Protobuf.Conformance.csproj",
+    ],
+    visibility = [
+        "//csharp:__subpackages__",
+    ],
+)
+
+genrule(
+    name = "package_conformance_test",
+    srcs = [
+        "Program.cs",
+        "Google.Protobuf.Conformance.csproj",
+        "//conformance:conformance_csharp_proto",
+        "//csharp:srcs",
+    ],
+    visibility = ["//visibility:private"],
+    tools = [":build_conformance_test"],
+    outs = CONFORMANCE_DEPS + ["Google.Protobuf.Conformance.dll"],
+    cmd = """
+        SRCDIR=$$(dirname $(location :Program.cs))
+        cp $(location //conformance:conformance_csharp_proto) $$SRCDIR
+        DOTNET_CLI_HOME=/tmp ./$(location :build_conformance_test)
+        cp -r $$SRCDIR/bin/Release/netcoreapp3.1/* $(RULEDIR)
+    """,
+)
+
+filegroup(
+    name = "conformance_dll",
+    srcs = ["Google.Protobuf.Conformance.dll"],
+    data = [":package_conformance_test"],
+    visibility = ["//conformance:__subpackages__"],
+)
+
+filegroup(
+    name = "conformance_runfiles",
+    srcs = CONFORMANCE_DEPS,
+    data = [":package_conformance_test"],
+    visibility = ["//conformance:__subpackages__"],
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
+pkg_files(
+    name = "dist_files",
+    srcs = [
+        "BUILD.bazel",
+        "Google.Protobuf.Conformance.csproj",
+        "Conformance.cs",
+        "Program.cs",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//csharp:__pkg__"],
+)
+
diff --git a/docs/cpp_build_systems.md b/docs/cpp_build_systems.md
index 812ddef..e093f9a 100644
--- a/docs/cpp_build_systems.md
+++ b/docs/cpp_build_systems.md
@@ -25,9 +25,9 @@
   was designed in large part to support exactly this type of rich,
   multi-language build.
 
-Currently, C++ Protobuf can be built with Bazel, Autotools, and CMake. Each of
-these build systems has different semantics and structure, but share in common
-the list of files needed to build the runtime and compiler.
+Currently, C++ Protobuf can be built with Bazel and CMake. Each of these build
+systems has different semantics and structure, but share in common the list of
+files needed to build the runtime and compiler.
 
 ## Design
 
@@ -74,7 +74,7 @@
 libraries into a single, monolithic library.
 
 For the Protobuf project, these "distribution libraries" are intended to match
-the granularity of the Autotools- and CMake-based builds. Since the Bazel-built
+the granularity of the CMake-based builds. Since the Bazel-built
 distribution library covers the rules with the source files needed by other
 builds, the `cc_dist_library` rule invokes the `cc_file_list_aspect` on its
 input libraries. The result is that a `cc_dist_library` rule not only produces
@@ -163,8 +163,7 @@
 ### File list generation
 
 Lists of input files are generated by Bazel in a format that can be imported to
-other build systems. Currently, Automake- and CMake-style files can be
-generated.
+other build systems. Currently only CMake-style files can be generated.
 
 The lists of files are derived from Bazel build targets. The sources can be:
 *   `cc_dist_library` rules (as described above)
@@ -263,11 +262,6 @@
 add_library(distlib ${distlib_srcs} ${buff_srcs})
 ```
 
-In addition to `gen_cmake_file_lists`, there is also a `gen_automake_file_lists`
-rule. These rules actually share most of the same implementation, but define
-different file headers and different Starlark "fragment generator" functions
-which format the generated list variables.
-
 ### Protobuf usage
 
 The main C++ runtimes (lite and full) and the Protobuf compiler use their
diff --git a/docs/implementing_proto3_presence.md b/docs/implementing_proto3_presence.md
index 7c3e213..4abfbd5 100644
--- a/docs/implementing_proto3_presence.md
+++ b/docs/implementing_proto3_presence.md
@@ -131,11 +131,11 @@
 
 ```
 # One option:
-$ ./src/protoc test.proto --cpp_out=. --experimental_allow_proto3_optional
+$ protoc test.proto --cpp_out=. --experimental_allow_proto3_optional
 
 # Another option:
 $ cp test.proto test_proto3_optional.proto
-$ ./src/protoc test_proto3_optional.proto --cpp_out=.
+$ protoc test_proto3_optional.proto --cpp_out=.
 $
 ```
 
@@ -152,7 +152,7 @@
 run into a different error:
 
 ```
-$ ./src/protoc test_proto3_optional.proto --my_codegen_out=.
+$ protoc test_proto3_optional.proto --my_codegen_out=.
 test_proto3_optional.proto: is a proto3 file that contains optional fields, but
 code generator --my_codegen_out hasn't been updated to support optional fields in
 proto3. Please ask the owner of this code generator to support proto3 optional.
@@ -201,7 +201,7 @@
 generator to generate a file containing proto3 optional fields:
 
 ```
-$ ./src/protoc test_proto3_optional.proto --my_codegen_out=.
+$ protoc test_proto3_optional.proto --my_codegen_out=.
 ```
 
 ### Updating Your Code Generator
diff --git a/examples/README.md b/examples/README.md
index a99883e..5f49211 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -44,7 +44,7 @@
 ### C++
 
 You can follow instructions in [../src/README.md](../src/README.md) to install
-protoc and protobuf C++ runtime from source.
+protoc from source.
 
 Then run "make cpp" in this examples directory to build the C++ example. It
 will create two executables: add_person_cpp and list_people_cpp. These programs
diff --git a/examples/WORKSPACE b/examples/WORKSPACE
index 3897572..e9811ef 100644
--- a/examples/WORKSPACE
+++ b/examples/WORKSPACE
@@ -10,9 +10,11 @@
 #
 # http_archive(
 #     name = "com_google_protobuf",
-#     strip_prefix = "protobuf-main",
-#     urls = ["https://github.com/protocolbuffers/protobuf/archive/main.zip"],
+#     sha256 = "c29d8b4b79389463c546f98b15aa4391d4ed7ec459340c47bffe15db63eb9126",
+#     strip_prefix = "protobuf-3.21.3",
+#     urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.21.3.tar.gz"],
 # )
+
 local_repository(
     name = "com_google_protobuf",
     path = "..",
diff --git a/generate_descriptor_proto.sh b/generate_descriptor_proto.sh
index dc03fee..d1b13d1 100755
--- a/generate_descriptor_proto.sh
+++ b/generate_descriptor_proto.sh
@@ -7,7 +7,7 @@
 # generate.
 #
 # HINT:  Flags passed to generate_descriptor_proto.sh will be passed directly
-#   to make when building protoc.  This is particularly useful for passing
+#   to bazel when building protoc.  This is particularly useful for passing
 #   -j4 to run 4 jobs simultaneously.
 
 if test ! -e src/google/protobuf/stubs/common.h; then
@@ -62,12 +62,12 @@
     PROTOC=$BOOTSTRAP_PROTOC
     BOOTSTRAP_PROTOC=""
   else
-    make -j$(nproc) $@ protoc
+    bazel build -j$(nproc) $@ //:protoc
     if test $? -ne 0; then
       echo "Failed to build protoc."
       exit 1
     fi
-    PROTOC="./protoc"
+    PROTOC="../bazel-bin/protoc"
   fi
 
   $PROTOC --cpp_out=dllexport_decl=PROTOBUF_EXPORT:$TMP ${RUNTIME_PROTO_FILES[@]} && \
diff --git a/java/internal/BUILD.bazel b/java/internal/BUILD.bazel
index 662dabd..598b8b5 100644
--- a/java/internal/BUILD.bazel
+++ b/java/internal/BUILD.bazel
@@ -6,8 +6,19 @@
     name = "dist_files",
     srcs = [
         "BUILD.bazel",
+        "JavaVersionTest.java",
         "testing.bzl",
     ],
     strip_prefix = strip_prefix.from_root(""),
     visibility = ["//java:__pkg__"],
 )
+
+java_test(
+    name = "java_version",
+    test_class = "JavaVersionTest",
+    srcs = ["JavaVersionTest.java"],
+    deps = [
+        "@maven//:com_google_truth_truth",
+        "@maven//:junit_junit",
+    ],
+)
diff --git a/java/internal/JavaVersionTest.java b/java/internal/JavaVersionTest.java
new file mode 100644
index 0000000..eb004d5
--- /dev/null
+++ b/java/internal/JavaVersionTest.java
@@ -0,0 +1,22 @@
+// Test that Kokoro is using the expected version of Java.
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class JavaVersionTest {
+  @Test
+  public void testJavaVersion() throws Exception {
+    String exp = System.getenv("KOKORO_JAVA_VERSION");
+    if(exp == null || exp.isEmpty()) {
+      System.err.println("No kokoro java version found, skipping check");
+      return;
+    }
+    String version = System.getProperty("java.version");
+    assertWithMessage("Expected Python " + exp + " but found Python " + version)
+      .that(version.startsWith(exp))
+      .isTrue();
+  }
+}
diff --git a/java/pom.xml b/java/pom.xml
index c086992..f8083c4 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -33,7 +33,7 @@
     <!-- These are relative to the submodules -->
     <protobuf.basedir>${project.basedir}/../..</protobuf.basedir>
     <protobuf.source.dir>${protobuf.basedir}/src</protobuf.source.dir>
-    <protoc>${protobuf.source.dir}/protoc</protoc>
+    <protoc>${protobuf.basedir}/protoc</protoc>
     <test.proto.dir>src/test/proto</test.proto.dir>
     <generated.sources.dir>${project.build.directory}/generated-sources</generated.sources.dir>
     <generated.testsources.dir>${project.build.directory}/generated-test-sources</generated.testsources.dir>
diff --git a/kokoro/common/check_missing_dist_files.sh b/kokoro/common/check_missing_dist_files.sh
deleted file mode 100755
index db4d92f..0000000
--- a/kokoro/common/check_missing_dist_files.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-#
-# Script to compare a distribution archive for expected files based on git.
-#
-# Usage:
-#   check_missing_dist_files.sh path/to/dist_archive.tar.gz
-
-set -eux
-set -o pipefail
-
-# By default, look for a git repo based on this script's path.
-: ${SOURCE_DIR:=$(cd $(dirname $0)/../.. ; pwd)}
-
-# Use a temporary directory for intermediate files.
-# Note that pipelines below use subshells to avoid multiple trap executions.
-_workdir=$(mktemp -d)
-function cleanup_workdir() { rm -r ${_workdir}; }
-trap cleanup_workdir EXIT
-
-# List all the files in the archive.
-(
-  tar -atf $1 | \
-    cut -d/ -f2- | \
-    sort
-) > ${_workdir}/archive.lst
-
-# List all files in the git repo that should be in the archive.
-(
-  git -C ${SOURCE_DIR} ls-files | \
-  grep "^\(java\|python\|objectivec\|csharp\|ruby\|php\|cmake\|examples\|src/google/protobuf/.*\.proto\)" |\
-  grep -v ".gitignore" | \
-  grep -v "java/lite/proguard.pgcfg" | \
-  grep -v "python/compatibility_tests" | \
-  grep -v "python/docs" | \
-  grep -v "python/.repo-metadata.json" | \
-  grep -v "python/protobuf_distutils" | \
-  grep -v "csharp/compatibility_tests" | \
-  sort
-) > ${_workdir}/expected.lst
-
-# Check for missing files.
-MISSING_FILES=( $(cd ${_workdir} && comm -13 archive.lst expected.lst) )
-if (( ${#MISSING_FILES[@]} == 0 )); then
-  exit 0
-fi
-
-(
-  set +x
-  echo -e "\n\nMissing files from archive:"
-  for (( i=0 ; i < ${#MISSING_FILES[@]} ; i++ )); do
-    echo "  ${MISSING_FILES[i]}"
-  done
-  echo -e "\nAdd them to the 'pkg_files' rule in corresponding BUILD.bazel.\n"
-) >&2
-exit 1
diff --git a/kokoro/common/pyenv.sh b/kokoro/common/pyenv.sh
deleted file mode 100644
index f89dc26..0000000
--- a/kokoro/common/pyenv.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-# Shared logic to choose a Python version with pyenv.
-#
-# This file should be `source`d.
-
-# Requested version of Python can be overridden by env variable.
-: ${PYTHON_VERSION:=3.9.5}
-
-if pyenv --version >/dev/null ; then
-  eval "$(pyenv init -)"
-  if ! pyenv global ${PYTHON_VERSION}; then
-    echo "Python ${PYTHON_VERSION} is not available. Versions available:" >&2
-    pyenv versions >&2
-    exit 1
-  fi
-fi
-echo "Using $(python --version || python3 --version)"
diff --git a/kokoro/docs/publish-python.sh b/kokoro/docs/publish-python.sh
index e3d53c7..9f88017 100755
--- a/kokoro/docs/publish-python.sh
+++ b/kokoro/docs/publish-python.sh
@@ -16,7 +16,7 @@
 sudo apt-get -y install unzip
 wget https://github.com/protocolbuffers/protobuf/releases/download/v21.1/protoc-21.1-linux-x86_64.zip
 unzip protoc-21.1-linux-x86_64.zip bin/protoc
-mv bin/protoc ../src/protoc
+mv bin/protoc ../protoc
 python3 -m venv venv
 source venv/bin/activate
 python setup.py install
diff --git a/kokoro/linux/32-bit/Dockerfile b/kokoro/linux/32-bit/Dockerfile
deleted file mode 100644
index 1278889..0000000
--- a/kokoro/linux/32-bit/Dockerfile
+++ /dev/null
@@ -1,143 +0,0 @@
-# This Dockerfile specifies the recipe for creating an image for the tests
-# to run in.
-#
-# We install as many test dependencies here as we can, because these setup
-# steps can be cached.  They do *not* run every time we run the build.
-# The Docker image is only rebuilt when the Dockerfile (ie. this file)
-# changes.
-
-# Base Dockerfile for gRPC dev images
-FROM 32bit/debian:latest
-
-# Apt source for php
-RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu trusty main" | tee /etc/apt/sources.list.d/various-php.list && \
-  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F4FCBB07
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  unzip \
-  # -- For python --
-  python-setuptools \
-  python-pip \
-  python-dev \
-  # -- For C++ benchmarks --
-  cmake  \
-  # -- For PHP --
-  php5.5     \
-  php5.5-dev \
-  php5.5-xml \
-  php5.6     \
-  php5.6-dev \
-  php5.6-xml \
-  php7.0     \
-  php7.0-dev \
-  php7.0-xml \
-  phpunit    \
-  valgrind   \
-  libxml2-dev \
-  && apt-get clean
-
-##################
-# PHP dependencies.
-RUN wget http://am1.php.net/get/php-5.5.38.tar.bz2/from/this/mirror
-RUN mv mirror php-5.5.38.tar.bz2
-RUN tar -xvf php-5.5.38.tar.bz2
-RUN cd php-5.5.38 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.5-zts && \
-    make && make install && make clean && cd ..
-RUN cd php-5.5.38 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.5 && \
-    make && make install && make clean && cd ..
-
-RUN wget http://am1.php.net/get/php-5.6.30.tar.bz2/from/this/mirror
-RUN mv mirror php-5.6.30.tar.bz2
-RUN tar -xvf php-5.6.30.tar.bz2
-RUN cd php-5.6.30 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.6-zts && \
-    make && make install && cd ..
-RUN cd php-5.6.30 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.6 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.0.18.tar.bz2/from/this/mirror
-RUN mv mirror php-7.0.18.tar.bz2
-RUN tar -xvf php-7.0.18.tar.bz2
-RUN cd php-7.0.18 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.0-zts && \
-    make && make install && cd ..
-RUN cd php-7.0.18 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.0 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.1.4.tar.bz2/from/this/mirror
-RUN mv mirror php-7.1.4.tar.bz2
-RUN tar -xvf php-7.1.4.tar.bz2
-RUN cd php-7.1.4 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.1-zts && \
-    make && make install && cd ..
-RUN cd php-7.1.4 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.1 && \
-    make && make install && cd ..
-
-RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-RUN php composer-setup.php
-RUN mv composer.phar /usr/bin/composer
-RUN php -r "unlink('composer-setup.php');"
-RUN composer config -g -- disable-tls true
-RUN composer config -g -- secure-http false
-RUN cd /tmp && \
-  git clone https://github.com/google/protobuf.git && \
-  cd protobuf/php && \
-  git reset --hard 49b44bff2b6257a119f9c6a342d6151c736586b8 && \
-  ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.5/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.5 && \
-  ln -sfn /usr/local/php-5.6/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.6/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.6/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.6 && \
-  ln -sfn /usr/local/php-7.0/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.0/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.0/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.0 && \
-  ln -sfn /usr/local/php-7.1/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.1/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.1/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.1
-
-##################
-# Python dependencies
-
-# These packages exist in apt-get, but their versions are too old, so we have
-# to get updates from pip.
-
-RUN pip install pip --upgrade
-RUN pip install virtualenv tox yattag
-
-##################
-# Prepare ccache
-
-RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
-RUN ln -s /usr/bin/ccache /usr/local/bin/g++
-RUN ln -s /usr/bin/ccache /usr/local/bin/cc
-RUN ln -s /usr/bin/ccache /usr/local/bin/c++
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
-
-# Define the default command.
-CMD ["bash"]
diff --git a/kokoro/linux/32-bit/build.sh b/kokoro/linux/32-bit/build.sh
index 8c0a41e..85dd81d 100755
--- a/kokoro/linux/32-bit/build.sh
+++ b/kokoro/linux/32-bit/build.sh
@@ -4,15 +4,20 @@
 # running the "pull request 32" project:
 #
 # This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
+# a script to run inside that image.
+
+set -ex
 
 # Change to repo root
 cd $(dirname $0)/../../..
+GIT_REPO_ROOT=$(pwd)
 
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/php_32bit
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="php_all_32"
-./kokoro/linux/build_and_run_docker.sh
+CONTAINER_IMAGE=gcr.io/protobuf-build/php/32bit@sha256:824cbdff02ee543eb69ee4b02c8c58cc7887f70f49e41725a35765d92a898b4f
+
+git submodule update --init --recursive
+
+docker run \
+  "$@" \
+  -v $GIT_REPO_ROOT:/workspace \
+  $CONTAINER_IMAGE \
+  bash -l "/workspace/kokoro/linux/32-bit/test_php.sh"
diff --git a/kokoro/linux/32-bit/test_php.sh b/kokoro/linux/32-bit/test_php.sh
new file mode 100644
index 0000000..3770b84
--- /dev/null
+++ b/kokoro/linux/32-bit/test_php.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+set -eux
+
+# Change to repo root
+cd $(dirname $0)/../../..
+
+use_php() {
+  VERSION=$1
+  export PATH=/usr/local/php-${VERSION}/bin:$PATH
+}
+
+build_php() {
+  use_php $1
+  pushd php
+  rm -rf vendor
+  php -v
+  php -m
+  composer update
+  composer test
+  popd
+}
+
+test_php_c() {
+  pushd php
+  rm -rf vendor
+  php -v
+  php -m
+  composer update
+  composer test_c
+  popd
+}
+
+build_php_c() {
+  use_php $1
+  test_php_c
+}
+
+cmake .
+cmake --build . --target protoc -- -j20
+export PROTOC=$(pwd)/protoc
+
+build_php 7.0
+build_php 7.1
+build_php 7.4
+build_php_c 7.0
+build_php_c 7.1
+build_php_c 7.4
+build_php_c 7.1-zts
+build_php_c 7.2-zts
+build_php_c 7.5-zts
diff --git a/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh b/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh
index d116c2f..2880507 100755
--- a/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh
+++ b/kokoro/linux/aarch64/protoc_crosscompile_aarch64.sh
@@ -6,6 +6,3 @@
 
 cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_WITH_ZLIB=0 .
 make -j8
-
-# The Java build setup expects the protoc binary to be in the src/ directory.
-ln -s $PWD/protoc ./src/protoc
diff --git a/kokoro/linux/aarch64/python_crosscompile_aarch64.sh b/kokoro/linux/aarch64/python_crosscompile_aarch64.sh
index 03cf44f..97d0a24 100755
--- a/kokoro/linux/aarch64/python_crosscompile_aarch64.sh
+++ b/kokoro/linux/aarch64/python_crosscompile_aarch64.sh
@@ -15,10 +15,6 @@
 cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_WITH_ZLIB=0 .
 make -j8
 
-# Copy lib files to the expected location.
-mkdir -p src/.libs
-ln -f *.a src/.libs/
-
 # create a simple shell wrapper that runs crosscompiled protoc under qemu
 echo '#!/bin/bash' >protoc_qemu_wrapper.sh
 echo 'exec qemu-aarch64 "../protoc" "$@"' >>protoc_qemu_wrapper.sh
diff --git a/kokoro/linux/bazel.sh b/kokoro/linux/bazel.sh
new file mode 100755
index 0000000..b7c8000
--- /dev/null
+++ b/kokoro/linux/bazel.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+set -ex
+
+if [[ -z "${CONTAINER_IMAGE}" ]]; then
+  CONTAINER_IMAGE=gcr.io/protobuf-build/bazel/linux@sha256:2bfd061284eff8234f2fcca16d71d43c69ccf3a22206628b54c204a6a9aac277
+fi
+
+cd $(dirname $0)/../..
+GIT_REPO_ROOT=`pwd`
+rm -rf $GIT_REPO_ROOT/logs
+
+ENVS=()
+
+# Check for specific versions pinned to the docker image.  In these cases we
+# want to forward the environment variable to tests, so that they can verify
+# that the correct version is being picked up by Bazel.
+ENVS+=("--test_env=KOKORO_JAVA_VERSION")
+ENVS+=("--test_env=KOKORO_PYTHON_VERSION")
+ENVS+=("--test_env=KOKORO_RUBY_VERSION")
+
+if [ -n "$BAZEL_ENV" ]; then
+  for env in $BAZEL_ENV; do
+    ENVS+="--action_env=${env}"
+  done
+fi
+
+tmpfile=$(mktemp -u)
+
+docker run \
+  --cidfile $tmpfile \
+  -v $GIT_REPO_ROOT:/workspace \
+  $CONTAINER_IMAGE \
+  test \
+  --keep_going \
+  --test_output=streamed \
+  ${ENVS[@]} \
+  $PLATFORM_CONFIG \
+  $BAZEL_EXTRA_FLAGS \
+  $BAZEL_TARGETS
+
+# Save logs for Kokoro
+docker cp \
+  `cat $tmpfile`:/workspace/logs $KOKORO_ARTIFACTS_DIR
diff --git a/kokoro/linux/bazel/build.sh b/kokoro/linux/bazel/build.sh
deleted file mode 100755
index bc8fdcb..0000000
--- a/kokoro/linux/bazel/build.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-set -eu
-
-# Install Bazel 4.0.0.
-use_bazel.sh 4.0.0
-bazel version
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Get kokoro scripts from repo root by default.
-: ${SCRIPT_ROOT:=$(pwd)}
-source ${SCRIPT_ROOT}/kokoro/common/pyenv.sh
-
-#  Disabled for now, re-enable if appropriate.
-#  //:build_files_updated_unittest \
-
-bazel_args=(
-  test
-  --keep_going
-  --copt=-Werror
-  --host_copt=-Werror
-  --test_output=errors
-  --
-  //...
-  -//objectivec/...  # only works on macOS
-  @com_google_protobuf_examples//...
-)
-
-${SCRIPT_ROOT}/kokoro/common/bazel_wrapper.sh "${bazel_args[@]}"
-
-# Verify that we can build successfully from generated tar files.
-(
-  pyenv versions
-  pyenv shell 2.7.9  # python2 required for old googletest autotools support
-  git submodule update --init --recursive
-  ./autogen.sh && ./configure && make -j$(nproc) dist
-)
-DIST=`ls *.tar.gz`
-tar -xf $DIST
-cd ${DIST//.tar.gz}
-${SCRIPT_ROOT}/kokoro/common/bazel_wrapper.sh build //:protobuf //:protobuf_java
diff --git a/kokoro/linux/bazel/common.cfg b/kokoro/linux/bazel/common.cfg
deleted file mode 100644
index 6b18488..0000000
--- a/kokoro/linux/bazel/common.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-# Common config shared by presubmit and continuous.
-
-bazel_setting: {
-  project_id: "protobuf-build"
-  bes_backend_address: "buildeventservice.googleapis.com"
-  foundry_backend_address: "remotebuildexecution.googleapis.com"
-  upsalite_frontend_address: "https://source.cloud.google.com"
-  local_execution: true
-}
diff --git a/kokoro/linux/bazel/continuous.cfg b/kokoro/linux/bazel/continuous.cfg
index 13cfef1..21fe759 100644
--- a/kokoro/linux/bazel/continuous.cfg
+++ b/kokoro/linux/bazel/continuous.cfg
@@ -1,5 +1,16 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/bazel/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 15
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//src/..."
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/bazel/presubmit.cfg b/kokoro/linux/bazel/presubmit.cfg
index 13cfef1..103128b 100644
--- a/kokoro/linux/bazel/presubmit.cfg
+++ b/kokoro/linux/bazel/presubmit.cfg
@@ -1,5 +1,16 @@
-# Config file for running tests in Kokoro
+# Config file for running C++ Bazel tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/bazel/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 15
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//src/..."
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/benchmark/build.sh b/kokoro/linux/benchmark/build.sh
deleted file mode 100755
index f470989..0000000
--- a/kokoro/linux/benchmark/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="benchmark"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/benchmark/continuous.cfg b/kokoro/linux/benchmark/continuous.cfg
index 8cc8f96..ddab7d2 100644
--- a/kokoro/linux/benchmark/continuous.cfg
+++ b/kokoro/linux/benchmark/continuous.cfg
@@ -1,7 +1,7 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/benchmark/build.sh"
+build_file: "protobuf/kokoro/linux/benchmark/run.sh"
 timeout_mins: 240
 
 action {
diff --git a/kokoro/linux/benchmark/run.sh b/kokoro/linux/benchmark/run.sh
index 963f779..efe09ca 100755
--- a/kokoro/linux/benchmark/run.sh
+++ b/kokoro/linux/benchmark/run.sh
@@ -1,7 +1,11 @@
 #!/bin/bash
 #
+# Install Bazel 4.0.0.
+use_bazel.sh 4.0.0
+
 # Change to repo root
 cd $(dirname $0)/../../..
+SCRIPT_ROOT=$(pwd)
 
 set -ex
 
@@ -18,82 +22,37 @@
 echo $datasets
 popd
 
-# build Python protobuf
-./autogen.sh
-./configure CXXFLAGS="-fPIC -O2"
-make -j8
-pushd python
-python3 -m venv env
-source env/bin/activate
-python3 setup.py build --cpp_implementation
-pip3 install --install-option="--cpp_implementation" .
-popd
-
 # build and run Python benchmark
-# We do this before building protobuf C++ since C++ build
-# will rewrite some libraries used by protobuf python.
-pushd benchmarks
-make python-pure-python-benchmark
-make python-cpp-reflection-benchmark
-make -j8 python-cpp-generated-code-benchmark
-echo "[" > tmp/python_result.json
 echo "benchmarking pure python..."
-./python-pure-python-benchmark --json --behavior_prefix="pure-python-benchmark" $datasets  >> tmp/python_result.json
-echo "," >> "tmp/python_result.json"
+${SCRIPT_ROOT}/kokoro/common/bazel_wrapper.sh run //benchmarks/python:python_benchmark -- \
+	--json --behavior_prefix="pure-python-benchmark" $datasets > /tmp/python1.json
 echo "benchmarking python cpp reflection..."
-env LD_LIBRARY_PATH="${repo_root}/src/.libs" ./python-cpp-reflection-benchmark --json --behavior_prefix="cpp-reflection-benchmark" $datasets  >> tmp/python_result.json
-echo "," >> "tmp/python_result.json"
+${SCRIPT_ROOT}/kokoro/common/bazel_wrapper.sh run //benchmarks/python:python_benchmark --define=use_fast_cpp_protos=true -- \
+	--json --behavior_prefix="cpp-reflection-benchmark" $datasets > /tmp/python2.json
 echo "benchmarking python cpp generated code..."
-env LD_LIBRARY_PATH="${repo_root}/src/.libs" ./python-cpp-generated-code-benchmark --json --behavior_prefix="cpp-generated-code-benchmark" $datasets >> tmp/python_result.json
-echo "]" >> "tmp/python_result.json"
-popd
+${SCRIPT_ROOT}/kokoro/common/bazel_wrapper.sh run //benchmarks/python:python_benchmark --define=use_fast_cpp_protos=true -- \
+	--json --cpp_generated --behavior_prefix="cpp-generated-code-benchmark" $datasets >> /tmp/python3.json
 
-# build CPP protobuf
-./configure
-make clean && make -j8
-
-pushd java
-mvn package -B -Dmaven.test.skip=true
-popd
-
-pushd benchmarks
+jq -s . /tmp/python1.json /tmp/python2.json /tmp/python3.json > python_result.json
 
 # build and run C++ benchmark
-# "make clean" deletes the contents of the tmp/ directory, so we move it elsewhere and then restore it once build is done.
-# TODO(jtattermusch): find a less clumsy way of protecting python_result.json contents
-mv tmp/python_result.json . && make clean && make -j8 cpp-benchmark && mv python_result.json tmp
 echo "benchmarking cpp..."
-env ./cpp-benchmark --benchmark_min_time=5.0 --benchmark_out_format=json --benchmark_out="tmp/cpp_result.json" $datasets
-
-# TODO(jtattermusch): add benchmarks for https://github.com/protocolbuffers/protobuf-go.
-# The original benchmarks for https://github.com/golang/protobuf were removed
-# because:
-# * they were broken and haven't been producing results for a long time
-# * the https://github.com/golang/protobuf implementation has been superseded by
-#   https://github.com/protocolbuffers/protobuf-go
+${SCRIPT_ROOT}/kokoro/common/bazel_wrapper.sh run //benchmarks/cpp:cpp_benchmark -- \
+	--benchmark_min_time=5.0 --benchmark_out_format=json --benchmark_out="${repo_root}/cpp_result.json" $datasets
 
 # build and run java benchmark (java 11 is required)
-make java-benchmark
 echo "benchmarking java..."
-./java-benchmark -Cresults.file.options.file="tmp/java_result.json" $datasets
-
-# TODO(jtattermusch): re-enable JS benchmarks once https://github.com/protocolbuffers/protobuf/issues/8747 is fixed.
-# build and run js benchmark
-# make js-benchmark
-# echo "benchmarking js..."
-# ./js-benchmark $datasets  --json_output=$(pwd)/tmp/node_result.json
-
-# TODO(jtattermusch): add php-c-benchmark. Currently its build is broken.
+${SCRIPT_ROOT}/kokoro/common/bazel_wrapper.sh run //benchmarks/java:java_benchmark -- \
+	-Cresults.file.options.file="${repo_root}/java_result.json" $datasets
 
 # persist raw the results in the build job log (for better debuggability)
-cat tmp/cpp_result.json
-cat tmp/java_result.json
-cat tmp/python_result.json
+cat cpp_result.json
+cat java_result.json
+cat python_result.json
 
 # print the postprocessed results to the build job log
 # TODO(jtattermusch): re-enable uploading results to bigquery (it is currently broken)
-make python_add_init
-env LD_LIBRARY_PATH="${repo_root}/src/.libs" python3 -m util.result_parser \
-	-cpp="../tmp/cpp_result.json" -java="../tmp/java_result.json" -python="../tmp/python_result.json"
-popd
-
+bazel run //benchmarks/util:result_parser -- \
+	-cpp="${repo_root}/cpp_result.json" \
+	-java="${repo_root}/java_result.json" \
+	-python="${repo_root}/python_result.json"
diff --git a/kokoro/linux/build_and_run_docker.sh b/kokoro/linux/build_and_run_docker.sh
deleted file mode 100755
index cdbd6e2..0000000
--- a/kokoro/linux/build_and_run_docker.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/bash
-#
-# Builds docker image and runs a command under it.
-# This is a generic script that is configured with the following variables:
-#
-# DOCKERHUB_ORGANIZATION - The organization on docker hub storing the
-# Dockerfile.
-# DOCKERFILE_DIR - Directory in which Dockerfile file is located.
-# DOCKER_RUN_SCRIPT - Script to run under docker (relative to protobuf repo root)
-# OUTPUT_DIR - Directory that will be copied from inside docker after finishing.
-# $@ - Extra args to pass to docker run
-
-set -ex
-
-cd $(dirname $0)/../..
-git_root=$(pwd)
-cd -
-
-# Use image name based on Dockerfile sha1
-if [ -z "$DOCKERHUB_ORGANIZATION" ]
-then
-  DOCKERHUB_ORGANIZATION=grpctesting/protobuf
-  DOCKER_IMAGE_NAME=${DOCKERHUB_ORGANIZATION}_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
-else
-  # TODO(teboring): Remove this when all tests have been migrated to separate
-  # docker images.
-  DOCKERFILE_PREFIX=$(basename $DOCKERFILE_DIR)
-  DOCKER_IMAGE_NAME=${DOCKERHUB_ORGANIZATION}/${DOCKERFILE_PREFIX}_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
-fi
-
-# Pull dockerimage from Dockerhub. This sometimes fails intermittently, so we
-# keep trying until we succeed.
-until docker pull $DOCKER_IMAGE_NAME; do sleep 10; done
-
-# Ensure existence of ccache directory
-CCACHE_DIR=/tmp/protobuf-ccache
-mkdir -p $CCACHE_DIR
-
-# Choose random name for docker container
-CONTAINER_NAME="build_and_run_docker_$(uuidgen)"
-
-echo $git_root
-
-# Run command inside docker
-docker run \
-  "$@" \
-  -e CCACHE_DIR=$CCACHE_DIR \
-  -e KOKORO_BUILD_NUMBER=$KOKORO_BUILD_NUMBER \
-  -e KOKORO_BUILD_ID=$KOKORO_BUILD_ID \
-  -e EXTERNAL_GIT_ROOT="/var/local/kokoro/protobuf" \
-  -e TEST_SET="$TEST_SET" \
-  -v "$git_root:/var/local/kokoro/protobuf:ro" \
-  -v $CCACHE_DIR:$CCACHE_DIR \
-  -w /var/local/git/protobuf \
-  --name=$CONTAINER_NAME \
-  $DOCKER_IMAGE_NAME \
-  bash -l "/var/local/kokoro/protobuf/$DOCKER_RUN_SCRIPT" || FAILED="true"
-
-# remove the container, possibly killing it first
-docker rm -f $CONTAINER_NAME || true
-
-[ -z "$FAILED" ] || {
-  exit 1
-}
diff --git a/kokoro/linux/cpp_aarch64/build.sh b/kokoro/linux/cpp_aarch64/build.sh
deleted file mode 100755
index a43ab1c..0000000
--- a/kokoro/linux/cpp_aarch64/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "continuous" and "presubmit" jobs.
-
-set -ex
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-kokoro/linux/aarch64/test_cpp_aarch64.sh
diff --git a/kokoro/linux/cpp_aarch64/continuous.cfg b/kokoro/linux/cpp_aarch64/continuous.cfg
index 0f1be4a..f77f73b 100644
--- a/kokoro/linux/cpp_aarch64/continuous.cfg
+++ b/kokoro/linux/cpp_aarch64/continuous.cfg
@@ -1,5 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_aarch64/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//src/..."
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/cpp_aarch64/presubmit.cfg b/kokoro/linux/cpp_aarch64/presubmit.cfg
index 0f1be4a..f77f73b 100644
--- a/kokoro/linux/cpp_aarch64/presubmit.cfg
+++ b/kokoro/linux/cpp_aarch64/presubmit.cfg
@@ -1,5 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_aarch64/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//src/..."
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/cpp_tcmalloc/build.sh b/kokoro/linux/cpp_tcmalloc/build.sh
deleted file mode 100755
index 3c77b11..0000000
--- a/kokoro/linux/cpp_tcmalloc/build.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-#
-# Build file to set up and run tests
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/cpp_tcmalloc
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="cpp_tcmalloc"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/cpp_tcmalloc/continuous.cfg b/kokoro/linux/cpp_tcmalloc/continuous.cfg
index 46312a9..fb76204 100644
--- a/kokoro/linux/cpp_tcmalloc/continuous.cfg
+++ b/kokoro/linux/cpp_tcmalloc/continuous.cfg
@@ -1,5 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_tcmalloc/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 1440
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/tcmalloc/linux:64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//src/..."
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/cpp_tcmalloc/presubmit.cfg b/kokoro/linux/cpp_tcmalloc/presubmit.cfg
index 46312a9..fb76204 100644
--- a/kokoro/linux/cpp_tcmalloc/presubmit.cfg
+++ b/kokoro/linux/cpp_tcmalloc/presubmit.cfg
@@ -1,5 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/cpp_tcmalloc/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 1440
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/tcmalloc/linux:64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//src/..."
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/csharp/build.sh b/kokoro/linux/csharp/build.sh
deleted file mode 100755
index 9a2eb48..0000000
--- a/kokoro/linux/csharp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/csharp
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="csharp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/csharp/continuous.cfg b/kokoro/linux/csharp/continuous.cfg
index 3d17767..2332c00 100644
--- a/kokoro/linux/csharp/continuous.cfg
+++ b/kokoro/linux/csharp/continuous.cfg
@@ -1,5 +1,27 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 1440
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/csharp/linux:3.1.415-6.0.100-6bbe70439ba5b0404bb12662cebc0296909389fa"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//csharp/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--action_env=DOTNET_CLI_TELEMETRY_OPTOUT=1 "
+         "--test_env=DOTNET_CLI_HOME=/home/bazel"
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/csharp/presubmit.cfg b/kokoro/linux/csharp/presubmit.cfg
index 3d17767..2332c00 100644
--- a/kokoro/linux/csharp/presubmit.cfg
+++ b/kokoro/linux/csharp/presubmit.cfg
@@ -1,5 +1,27 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/csharp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 1440
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/csharp/linux:3.1.415-6.0.100-6bbe70439ba5b0404bb12662cebc0296909389fa"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//csharp/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--action_env=DOTNET_CLI_TELEMETRY_OPTOUT=1 "
+         "--test_env=DOTNET_CLI_HOME=/home/bazel"
+}
+
+action {
+  define_artifacts {
+    regex: "**/sponge_log.*"
+  }
+}
diff --git a/kokoro/linux/dockerfile/push_testing_images.sh b/kokoro/linux/dockerfile/push_testing_images.sh
deleted file mode 100755
index 2d82bab..0000000
--- a/kokoro/linux/dockerfile/push_testing_images.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-
-set -ex
-
-cd $(dirname $0)/../../..
-git_root=$(pwd)
-cd kokoro/linux/dockerfile
-
-DOCKERHUB_ORGANIZATION=protobuftesting
-
-for DOCKERFILE_DIR in test/*
-do
-  # Generate image name based on Dockerfile checksum. That works well as long
-  # as can count on dockerfiles being written in a way that changing the logical
-  # contents of the docker image always changes the SHA (e.g. using "ADD file"
-  # cmd in the dockerfile in not ok as contents of the added file will not be
-  # reflected in the SHA).
-  DOCKER_IMAGE_NAME=$(basename $DOCKERFILE_DIR)_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ )
-
-  echo $DOCKER_IMAGE_NAME
-  # skip the image if it already exists in the repo
-  curl --silent -f -lSL https://registry.hub.docker.com/v2/repositories/${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}/tags/latest > /dev/null \
-      && continue
-
-  docker build -t ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME} ${DOCKERFILE_DIR}
-
-  # "docker login" needs to be run in advance
-  docker push ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}
-done
diff --git a/kokoro/linux/dockerfile/test/cpp_tcmalloc/Dockerfile b/kokoro/linux/dockerfile/test/cpp_tcmalloc/Dockerfile
deleted file mode 100644
index 0ce9982..0000000
--- a/kokoro/linux/dockerfile/test/cpp_tcmalloc/Dockerfile
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM debian:jessie
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  && apt-get clean
-
-# Install dependencies for TC malloc
-RUN apt-get install -y \
-  google-perftools \
-  libgoogle-perftools4 \
-  libgoogle-perftools-dev
diff --git a/kokoro/linux/dockerfile/test/csharp/Dockerfile b/kokoro/linux/dockerfile/test/csharp/Dockerfile
deleted file mode 100644
index c07fcbc..0000000
--- a/kokoro/linux/dockerfile/test/csharp/Dockerfile
+++ /dev/null
@@ -1,41 +0,0 @@
-FROM debian:buster
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  && apt-get clean
-
-# Update ca-certificates to fix known buster + .NET 5 issue
-# https://github.com/NuGet/Announcements/issues/49
-RUN apt-get update && apt-get install -y ca-certificates && apt-get clean
-
-# dotnet SDK prerequisites
-RUN apt-get update && apt-get install -y libunwind8 libicu63 && apt-get clean
-
-# Install dotnet SDK via install script
-RUN wget -q https://dot.net/v1/dotnet-install.sh && \
-    chmod u+x dotnet-install.sh && \
-    ./dotnet-install.sh --version 3.1.415 && \
-    ./dotnet-install.sh --version 6.0.100 && \
-    ln -s /root/.dotnet/dotnet /usr/local/bin
-
-RUN wget -q www.nuget.org/NuGet.exe -O /usr/local/bin/nuget.exe
-
-ENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE true
diff --git a/kokoro/linux/dockerfile/test/java_stretch/Dockerfile b/kokoro/linux/dockerfile/test/java_stretch/Dockerfile
deleted file mode 100644
index 0716927..0000000
--- a/kokoro/linux/dockerfile/test/java_stretch/Dockerfile
+++ /dev/null
@@ -1,39 +0,0 @@
-# Despite the name of this image, we are no longer on stretch.
-# We should consider renaming this image, and/or evaluating what
-# software versions we actually need.
-FROM debian:bullseye
-
-# Install dependencies.  We start with the basic ones required to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  cmake \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  pkg-config \
-  time \
-  wget \
-  # Java dependencies
-  maven \
-  openjdk-11-jdk \
-  openjdk-17-jdk \
-  # Required for the gtest build.
-  python2 \
-  # Python dependencies
-  python3-dev \
-  python3-setuptools \
-  python3-pip \
-  python3-venv \
-  && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/php/Dockerfile b/kokoro/linux/dockerfile/test/php/Dockerfile
deleted file mode 100644
index 4c9d69d..0000000
--- a/kokoro/linux/dockerfile/test/php/Dockerfile
+++ /dev/null
@@ -1,255 +0,0 @@
-FROM debian:jessie
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  re2c \
-  sqlite3 \
-  libsqlite3-dev \
-  && apt-get clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  php5 \
-  libcurl4-openssl-dev \
-  libgmp-dev \
-  libgmp3-dev \
-  libssl-dev \
-  libxml2-dev \
-  unzip \
-  zlib1g-dev \
-  pkg-config \
-  && apt-get clean
-
-# Install other dependencies
-RUN ln -sf /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
-RUN wget http://ftp.gnu.org/gnu/bison/bison-2.6.4.tar.gz -O /var/local/bison-2.6.4.tar.gz
-RUN cd /var/local \
-  && tar -zxvf bison-2.6.4.tar.gz \
-  && cd /var/local/bison-2.6.4 \
-  && ./configure \
-  && make \
-  && make install
-
-# Install composer
-RUN curl -sS https://getcomposer.org/installer | php
-RUN mv composer.phar /usr/local/bin/composer
-
-# Download php source code
-RUN git clone https://github.com/php/php-src
-
-# php 5.6
-RUN cd php-src \
-  && git checkout PHP-5.6.39 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-5.6 \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-5.phar \
-  && chmod +x phpunit \
-  && mv phpunit /usr/local/php-5.6/bin
-
-# php 7.0
-RUN cd php-src \
-  && git checkout PHP-7.0.33 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.0 \
-  && make \
-  && make install \
-  && make clean
-RUN cd php-src \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.0-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-6.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.0/bin \
-  && mv phpunit /usr/local/php-7.0-zts/bin
-
-# php 7.1
-RUN cd php-src \
-  && git checkout PHP-7.1.25 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.1 \
-  && make \
-  && make install \
-  && make clean
-RUN cd php-src \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.1-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.1/bin \
-  && mv phpunit /usr/local/php-7.1-zts/bin
-
-# php 7.2
-RUN cd php-src \
-  && git checkout PHP-7.2.13 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.2 \
-  && make \
-  && make install \
-  && make clean
-RUN cd php-src \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.2-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.2/bin \
-  && mv phpunit /usr/local/php-7.2-zts/bin
-
-# php 7.3
-RUN cd php-src \
-  && git checkout PHP-7.3.0 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.3 \
-  && make \
-  && make install \
-  && make clean
-RUN cd php-src \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.3-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.3/bin \
-  && mv phpunit /usr/local/php-7.3-zts/bin
-
-# php 7.4
-RUN wget https://ftp.gnu.org/gnu/bison/bison-3.0.1.tar.gz -O /var/local/bison-3.0.1.tar.gz
-RUN cd /var/local \
-  && tar -zxvf bison-3.0.1.tar.gz \
-  && cd /var/local/bison-3.0.1 \
-  && ./configure \
-  && make \
-  && make install
-
-RUN wget https://github.com/php/php-src/archive/php-7.4.0.tar.gz -O /var/local/php-7.4.0.tar.gz
-
-RUN cd /var/local \
-  && tar -zxvf php-7.4.0.tar.gz
-
-RUN cd /var/local/php-src-php-7.4.0 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --disable-mbregex \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.4 \
-  && make \
-  && make install \
-  && make clean
-RUN cd /var/local/php-src-php-7.4.0 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --disable-mbregex \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.4-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-8.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.4/bin \
-  && mv phpunit /usr/local/php-7.4-zts/bin
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  valgrind \
-  && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/php80/Dockerfile b/kokoro/linux/dockerfile/test/php80/Dockerfile
deleted file mode 100644
index 5b382d0..0000000
--- a/kokoro/linux/dockerfile/test/php80/Dockerfile
+++ /dev/null
@@ -1,124 +0,0 @@
-FROM debian:stretch
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  re2c \
-  sqlite3 \
-  vim \
-  libonig-dev \
-  libsqlite3-dev \
-  && apt-get clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  php \
-  libcurl4-openssl-dev \
-  libgmp-dev \
-  libgmp3-dev \
-  libssl-dev \
-  libxml2-dev \
-  unzip \
-  zlib1g-dev \
-  pkg-config \
-  && apt-get clean
-
-# Install other dependencies
-RUN ln -sf /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h
-RUN wget https://ftp.gnu.org/gnu/bison/bison-3.0.1.tar.gz -O /var/local/bison-3.0.1.tar.gz
-RUN cd /var/local \
-  && tar -zxvf bison-3.0.1.tar.gz \
-  && cd /var/local/bison-3.0.1 \
-  && ./configure \
-  && make \
-  && make install
-
-# Install composer
-RUN curl -sS https://getcomposer.org/installer | php
-RUN mv composer.phar /usr/local/bin/composer
-
-# Download php source code
-RUN git clone https://github.com/php/php-src
-
-# php 8.0
-RUN cd php-src \
-  && git checkout php-8.0.0 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-8.0 \
-  && make \
-  && make install \
-  && make clean
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --enable-maintainer-zts \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-8.0-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-9.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-8.0/bin \
-  && mv phpunit /usr/local/php-8.0-zts/bin
-
-# php 8.1
-RUN cd php-src \
-  && git checkout php-8.1.2 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-8.1 \
-  && make \
-  && make install \
-  && make clean
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --enable-maintainer-zts \
-  --with-gmp \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-8.1-zts \
-  && make \
-  && make install \
-  && make clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  valgrind \
-  && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/php_32bit/Dockerfile b/kokoro/linux/dockerfile/test/php_32bit/Dockerfile
deleted file mode 100644
index 2fd620e..0000000
--- a/kokoro/linux/dockerfile/test/php_32bit/Dockerfile
+++ /dev/null
@@ -1,260 +0,0 @@
-FROM i386/debian:jessie
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  re2c \
-  sqlite3 \
-  libsqlite3-dev \
-  && apt-get clean
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  bison \
-  php5 \
-  libcurl4-openssl-dev \
-  libssl-dev \
-  libxml2-dev \
-  unzip \
-  zlib1g-dev \
-  pkg-config \
-  && apt-get clean
-
-# Install other dependencies
-RUN wget http://ftp.gnu.org/gnu/bison/bison-2.6.4.tar.gz -O /var/local/bison-2.6.4.tar.gz
-RUN cd /var/local \
-  && tar -zxvf bison-2.6.4.tar.gz \
-  && cd /var/local/bison-2.6.4 \
-  && ./configure \
-  && make \
-  && make install
-
-# Install composer
-RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-RUN php composer-setup.php
-RUN mv composer.phar /usr/bin/composer
-RUN php -r "unlink('composer-setup.php');"
-
-# Download php source code
-RUN git clone https://github.com/php/php-src
-
-# php 5.6
-RUN cd php-src \
-  && git checkout PHP-5.6.39 \
-  && ./buildconf --force
-RUN cd php-src \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-5.6 \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-5.phar \
-  && chmod +x phpunit \
-  && mv phpunit /usr/local/php-5.6/bin
-
-# php 7.0
-RUN wget https://github.com/php/php-src/archive/php-7.0.33.tar.gz -O /var/local/php-7.0.33.tar.gz
-
-RUN cd /var/local \
-  && tar -zxvf php-7.0.33.tar.gz
-
-RUN cd /var/local/php-src-php-7.0.33 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.0 \
-  && make \
-  && make install \
-  && make clean
-RUN cd /var/local/php-src-php-7.0.33 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.0-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-6.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.0/bin \
-  && mv phpunit /usr/local/php-7.0-zts/bin
-
-# php 7.1
-RUN wget https://github.com/php/php-src/archive/php-7.1.25.tar.gz -O /var/local/php-7.1.25.tar.gz
-
-RUN cd /var/local \
-  && tar -zxvf php-7.1.25.tar.gz
-
-RUN cd /var/local/php-src-php-7.1.25 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.1 \
-  && make \
-  && make install \
-  && make clean
-RUN cd /var/local/php-src-php-7.1.25 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.1-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.1/bin \
-  && mv phpunit /usr/local/php-7.1-zts/bin
-
-# php 7.2
-RUN wget https://github.com/php/php-src/archive/php-7.2.13.tar.gz -O /var/local/php-7.2.13.tar.gz
-
-RUN cd /var/local \
-  && tar -zxvf php-7.2.13.tar.gz
-
-RUN cd /var/local/php-src-php-7.2.13 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.2 \
-  && make \
-  && make install \
-  && make clean
-RUN cd /var/local/php-src-php-7.2.13 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.2-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.2/bin \
-  && mv phpunit /usr/local/php-7.2-zts/bin
-
-# php 7.3
-RUN wget https://github.com/php/php-src/archive/php-7.3.0.tar.gz -O /var/local/php-7.3.0.tar.gz
-
-RUN cd /var/local \
-  && tar -zxvf php-7.3.0.tar.gz
-
-RUN cd /var/local/php-src-php-7.3.0 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.3 \
-  && make \
-  && make install \
-  && make clean
-RUN cd /var/local/php-src-php-7.3.0 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.3-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-7.5.0.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.3/bin \
-  && mv phpunit /usr/local/php-7.3-zts/bin
-
-# php 7.4
-RUN wget https://ftp.gnu.org/gnu/bison/bison-3.0.1.tar.gz -O /var/local/bison-3.0.1.tar.gz
-RUN cd /var/local \
-  && tar -zxvf bison-3.0.1.tar.gz \
-  && cd /var/local/bison-3.0.1 \
-  && ./configure \
-  && make \
-  && make install
-
-RUN wget https://github.com/php/php-src/archive/php-7.4.0.tar.gz -O /var/local/php-7.4.0.tar.gz
-
-RUN cd /var/local \
-  && tar -zxvf php-7.4.0.tar.gz
-
-RUN cd /var/local/php-src-php-7.4.0 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-bcmath \
-  --enable-mbstring \
-  --disable-mbregex \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.4 \
-  && make \
-  && make install \
-  && make clean
-RUN cd /var/local/php-src-php-7.4.0 \
-  && ./buildconf --force \
-  && ./configure \
-  --enable-maintainer-zts \
-  --enable-mbstring \
-  --disable-mbregex \
-  --with-openssl \
-  --with-zlib \
-  --prefix=/usr/local/php-7.4-zts \
-  && make \
-  && make install \
-  && make clean
-
-RUN wget -O phpunit https://phar.phpunit.de/phpunit-8.phar \
-  && chmod +x phpunit \
-  && cp phpunit /usr/local/php-7.4/bin \
-  && mv phpunit /usr/local/php-7.4-zts/bin
-
-# Install php dependencies
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  valgrind \
-  && apt-get clean
diff --git a/kokoro/linux/dockerfile/test/python310/Dockerfile b/kokoro/linux/dockerfile/test/python310/Dockerfile
deleted file mode 100644
index e16e93b..0000000
--- a/kokoro/linux/dockerfile/test/python310/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.10-buster
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  && apt-get clean \
-  && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
-  pip \
-  setuptools \
-  tox \
-  wheel
diff --git a/kokoro/linux/dockerfile/test/python37/Dockerfile b/kokoro/linux/dockerfile/test/python37/Dockerfile
deleted file mode 100644
index ee108dd..0000000
--- a/kokoro/linux/dockerfile/test/python37/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.7-buster
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  && apt-get clean \
-  && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
-  pip \
-  setuptools \
-  tox \
-  wheel
diff --git a/kokoro/linux/dockerfile/test/python38/Dockerfile b/kokoro/linux/dockerfile/test/python38/Dockerfile
deleted file mode 100644
index 56efc9d..0000000
--- a/kokoro/linux/dockerfile/test/python38/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.8-buster
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  && apt-get clean \
-  && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
-  pip \
-  setuptools \
-  tox \
-  wheel
diff --git a/kokoro/linux/dockerfile/test/python39/Dockerfile b/kokoro/linux/dockerfile/test/python39/Dockerfile
deleted file mode 100644
index ee7554d..0000000
--- a/kokoro/linux/dockerfile/test/python39/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-FROM python:3.9-buster
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  && apt-get clean \
-  && rm -rf /var/lib/apt/lists/*
-
-# Install Python libraries.
-RUN python -m pip install --no-cache-dir --upgrade \
-  pip \
-  setuptools \
-  tox \
-  wheel
diff --git a/kokoro/linux/dockerfile/test/ruby/Dockerfile b/kokoro/linux/dockerfile/test/ruby/Dockerfile
deleted file mode 100644
index 0e34fe5..0000000
--- a/kokoro/linux/dockerfile/test/ruby/Dockerfile
+++ /dev/null
@@ -1,44 +0,0 @@
-FROM debian:stretch
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get update && apt-get install -y \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  # Java dependencies
-  maven \
-  openjdk-8-jdk \
-  && apt-get clean
-
-# Install rvm
-RUN gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys \
-    409B6B1796C275462A1703113804BB82D39DC0E3 \
-    7D2BAF1CF37B13E2069D6956105BD0E739499BDB
-RUN \curl -sSL https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer | bash -s master
-
-RUN /bin/bash -l -c "rvm install 2.5.1"
-RUN /bin/bash -l -c "rvm install 2.6.0"
-RUN /bin/bash -l -c "rvm install 2.7.0"
-RUN /bin/bash -l -c "rvm install 3.0.0"
-RUN /bin/bash -l -c "rvm install 3.1.0"
-RUN /bin/bash -l -c "rvm install jruby-9.2.20.1"
-RUN /bin/bash -l -c "rvm install jruby-9.3.3.0"
-RUN /bin/bash -l -c "rvm install jruby-9.3.4.0"
-
-RUN /bin/bash -l -c "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
-RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
diff --git a/kokoro/linux/java_aarch64/build.sh b/kokoro/linux/java_aarch64/build.sh
deleted file mode 100755
index ed5ad53..0000000
--- a/kokoro/linux/java_aarch64/build.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "continuous" and "presubmit" jobs.
-
-set -ex
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Initialize any submodules.
-git submodule update --init --recursive
-
-kokoro/linux/aarch64/qemu_helpers/prepare_qemu.sh
-
-kokoro/linux/aarch64/test_java_aarch64.sh
diff --git a/kokoro/linux/java_aarch64/continuous.cfg b/kokoro/linux/java_aarch64/continuous.cfg
index 5db46d4..75e3f0b 100644
--- a/kokoro/linux/java_aarch64/continuous.cfg
+++ b/kokoro/linux/java_aarch64/continuous.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_aarch64/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//java/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/java_aarch64/presubmit.cfg b/kokoro/linux/java_aarch64/presubmit.cfg
index 5db46d4..bca25d1 100644
--- a/kokoro/linux/java_aarch64/presubmit.cfg
+++ b/kokoro/linux/java_aarch64/presubmit.cfg
@@ -1,11 +1,20 @@
 # Config file for running tests in Kokoro
 
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_aarch64/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//java/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/java_jdk11/build.sh b/kokoro/linux/java_jdk11/build.sh
deleted file mode 100755
index d73aa7c..0000000
--- a/kokoro/linux/java_jdk11/build.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# fail on error
-set -e
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-# The image of the Dockerfile sha1 is fetched from the organization
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_jdk11"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/java_jdk11/continuous.cfg b/kokoro/linux/java_jdk11/continuous.cfg
index f8af54d..3db5cd0 100644
--- a/kokoro/linux/java_jdk11/continuous.cfg
+++ b/kokoro/linux/java_jdk11/continuous.cfg
@@ -1,11 +1,16 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk11/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//java/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/java_jdk11/presubmit.cfg b/kokoro/linux/java_jdk11/presubmit.cfg
index 366048c..04d8214 100644
--- a/kokoro/linux/java_jdk11/presubmit.cfg
+++ b/kokoro/linux/java_jdk11/presubmit.cfg
@@ -1,12 +1,16 @@
 # Config file for running Linkage Monitor in Kokoro
-# https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk11/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//java/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/java_jdk17/build.sh b/kokoro/linux/java_jdk17/build.sh
deleted file mode 100755
index 677245a..0000000
--- a/kokoro/linux/java_jdk17/build.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Fail on error
-set -e
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-# The image of the Dockerfile sha1 is fetched from the organization
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_jdk17"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/java_jdk17/continuous.cfg b/kokoro/linux/java_jdk17/continuous.cfg
index 6bac25c..cd31eda 100644
--- a/kokoro/linux/java_jdk17/continuous.cfg
+++ b/kokoro/linux/java_jdk17/continuous.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk17/build.sh"
-timeout_mins: 60
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/java/linux:17-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//java/..."
+}
 
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/java_jdk17/presubmit.cfg b/kokoro/linux/java_jdk17/presubmit.cfg
index ee80517..4574a0f 100644
--- a/kokoro/linux/java_jdk17/presubmit.cfg
+++ b/kokoro/linux/java_jdk17/presubmit.cfg
@@ -1,12 +1,21 @@
 # Config file for running Linkage Monitor in Kokoro
-# https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk17/build.sh"
-timeout_mins: 60
+build_file: "protobuf/kokoro/linux/bazel.sh"
+timeout_mins: 120
+
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/java/linux:17-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//java/..."
+}
 
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/java_linkage_monitor/build.sh b/kokoro/linux/java_linkage_monitor/build.sh
index c447453..fd1c5c7 100755
--- a/kokoro/linux/java_linkage_monitor/build.sh
+++ b/kokoro/linux/java_linkage_monitor/build.sh
@@ -4,16 +4,24 @@
 # running the "pull request" project:
 #
 # This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
+# a script to run inside that image.
+
+use_bazel.sh 5.1.1
 
 # Change to repo root
 cd $(dirname $0)/../../..
 
-export DOCKERHUB_ORGANIZATION=protobuftesting
-# The image of the Dockerfile sha1 is fetched from the organization
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/java_stretch
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_linkage_monitor"
-./kokoro/linux/build_and_run_docker.sh
+bazel build //:protoc
+
+# The java build setup expects protoc in the root directory.
+cp bazel-bin/protoc .
+
+cd java
+# Installs the snapshot version locally
+mvn -e -B -Dhttps.protocols=TLSv1.2 install -Dmaven.test.skip=true
+
+# Linkage Monitor uses the snapshot versions installed in $HOME/.m2 to verify compatibility
+JAR=linkage-monitor-latest-all-deps.jar
+curl -v -O "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/${JAR}"
+# Fails if there's new linkage errors compared with baseline
+java -jar $JAR com.google.cloud:libraries-bom
diff --git a/kokoro/linux/jruby92/build.sh b/kokoro/linux/jruby92/build.sh
deleted file mode 100755
index 5820115..0000000
--- a/kokoro/linux/jruby92/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="jruby92"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/jruby92/continuous.cfg b/kokoro/linux/jruby92/continuous.cfg
index 3339584..9db8f50 100644
--- a/kokoro/linux/jruby92/continuous.cfg
+++ b/kokoro/linux/jruby92/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby92/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:jruby-9.2.20.1-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=java"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/jruby92/presubmit.cfg b/kokoro/linux/jruby92/presubmit.cfg
index 3339584..9db8f50 100644
--- a/kokoro/linux/jruby92/presubmit.cfg
+++ b/kokoro/linux/jruby92/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby92/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:jruby-9.2.20.1-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=java"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/jruby93/build.sh b/kokoro/linux/jruby93/build.sh
deleted file mode 100755
index 24c54d0..0000000
--- a/kokoro/linux/jruby93/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="jruby93"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/jruby93/continuous.cfg b/kokoro/linux/jruby93/continuous.cfg
index 706d848..a5a9bd2 100644
--- a/kokoro/linux/jruby93/continuous.cfg
+++ b/kokoro/linux/jruby93/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby93/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:jruby-9.3.4.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=java"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/jruby93/presubmit.cfg b/kokoro/linux/jruby93/presubmit.cfg
index 706d848..a5a9bd2 100644
--- a/kokoro/linux/jruby93/presubmit.cfg
+++ b/kokoro/linux/jruby93/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/jruby93/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:jruby-9.3.4.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=java"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/make_test_output.py b/kokoro/linux/make_test_output.py
deleted file mode 100644
index 9853685..0000000
--- a/kokoro/linux/make_test_output.py
+++ /dev/null
@@ -1,94 +0,0 @@
-"""Gathers output from test runs and create an XML file in JUnit format.
-
-The output files from the individual tests have been written in a directory
-structure like:
-
-  $DIR/joblog  (output from "parallel --joblog joblog")
-  $DIR/logs/1/cpp/stdout
-  $DIR/logs/1/cpp/stderr
-  $DIR/logs/1/csharp/stdout
-  $DIR/logs/1/csharp/stderr
-  $DIR/logs/1/java_jdk7/stdout
-  $DIR/logs/1/java_jdk7/stderr
-  etc.
-
-This script bundles them into a single output XML file so Jenkins can show
-detailed test results.  It runs as the last step before the Jenkins build
-finishes.
-"""
-
-import os
-import sys
-from yattag import Doc
-from collections import defaultdict
-
-
-def readtests(basedir):
-  tests = defaultdict(dict)
-
-  # Sample input (note: separators are tabs).
-  #
-  # Seq	Host	Starttime	Runtime	Send	Receive	Exitval	Signal	Command
-  # 1	:	1456263838.313	0.005	0	0	0	0	echo A
-  with open(basedir + "/joblog") as jobs:
-    firstline = next(jobs)
-    for line in jobs:
-      values = line.split("\t")
-
-      name = values[8].split()[-1]
-      test = tests[name]
-      test["name"] = name
-      test["time"] = values[3]
-
-      exitval = values[6]
-      if int(exitval):
-        # We don't have a more specific message.  User should look at stderr.
-        test["failure"] = "TEST FAILURE"
-      else:
-        test["failure"] = False
-
-  for testname in os.listdir(basedir + "/logs/1"):
-    test = tests[testname]
-
-    with open(basedir + "/logs/1/" + testname + "/stdout") as f:
-      test["stdout"] = f.read()
-
-    with open(basedir + "/logs/1/" + testname + "/stderr") as f:
-      test["stderr"] = f.read()
-
-  # The cpp test is special since it doesn't run under parallel so doesn't show
-  # up in the job log.
-  tests["cpp"]["name"] = "cpp"
-
-  with open(basedir + '/logs/1/cpp/build_time', 'r') as f:
-    tests["cpp"]["time"] = f.read().strip()
-  tests["cpp"]["failure"] = False
-
-  ret = tests.values()
-  ret.sort(key=lambda x: x["name"])
-
-  return ret
-
-
-def genxml(tests):
-  doc, tag, text = Doc().tagtext()
-
-  with tag("testsuites"):
-    with tag("testsuite", name="Protobuf Tests"):
-      for test in tests:
-        with tag("testcase", name=test["name"], classname=test["name"],
-                             time=test["time"]):
-          with tag("system-out"):
-            text(test["stdout"])
-          with tag("system-err"):
-            text(test["stderr"])
-          if test["failure"]:
-            with tag("failure"):
-              text(test["failure"])
-
-  return doc.getvalue()
-
-
-sys.stderr.write("make_test_output.py: writing XML from directory: " +
-                 sys.argv[1] + "\n")
-print(genxml(readtests(sys.argv[1])))
diff --git a/kokoro/linux/pull_request_in_docker.sh b/kokoro/linux/pull_request_in_docker.sh
deleted file mode 100755
index a048c47..0000000
--- a/kokoro/linux/pull_request_in_docker.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# This is the script that runs inside Docker, once the image has been built,
-# to execute all tests for the "pull request" project.
-
-WORKSPACE_BASE=`pwd`
-MY_DIR="$(dirname "$0")"
-TEST_SCRIPT=./tests.sh
-BUILD_DIR=/tmp/protobuf
-
-set -e  # exit immediately on error
-set -x  # display all commands
-
-# The protobuf repository is mounted into our Docker image, but read-only.
-# We clone into a directory inside Docker (this is faster than cp).
-rm -rf $BUILD_DIR
-mkdir -p $BUILD_DIR
-cd $BUILD_DIR
-git clone /var/local/kokoro/protobuf
-cd protobuf
-
-# Initialize any submodules:
-git submodule update --init --recursive
-
-$TEST_SCRIPT $TEST_SET
diff --git a/kokoro/linux/python310/build.sh b/kokoro/linux/python310/build.sh
deleted file mode 100755
index 0d8a2c9..0000000
--- a/kokoro/linux/python310/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python310
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python310"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python310/continuous.cfg b/kokoro/linux/python310/continuous.cfg
index 6ec74d8..7e4a798 100644
--- a/kokoro/linux/python310/continuous.cfg
+++ b/kokoro/linux/python310/continuous.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.10-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python310/presubmit.cfg b/kokoro/linux/python310/presubmit.cfg
index 6ec74d8..7e4a798 100644
--- a/kokoro/linux/python310/presubmit.cfg
+++ b/kokoro/linux/python310/presubmit.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.10-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python310_cpp/build.sh b/kokoro/linux/python310_cpp/build.sh
deleted file mode 100755
index 2903a2d..0000000
--- a/kokoro/linux/python310_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python310
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python310_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python310_cpp/continuous.cfg b/kokoro/linux/python310_cpp/continuous.cfg
index 7ec8441..1f91c26 100644
--- a/kokoro/linux/python310_cpp/continuous.cfg
+++ b/kokoro/linux/python310_cpp/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.10-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python310_cpp/presubmit.cfg b/kokoro/linux/python310_cpp/presubmit.cfg
index 7ec8441..1c4cfee 100644
--- a/kokoro/linux/python310_cpp/presubmit.cfg
+++ b/kokoro/linux/python310_cpp/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python310_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.10-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python37/build.sh b/kokoro/linux/python37/build.sh
deleted file mode 100755
index 2117a27..0000000
--- a/kokoro/linux/python37/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python37
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python37"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python37/continuous.cfg b/kokoro/linux/python37/continuous.cfg
index 9fa20c1..3ae100c 100644
--- a/kokoro/linux/python37/continuous.cfg
+++ b/kokoro/linux/python37/continuous.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.7-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python37/presubmit.cfg b/kokoro/linux/python37/presubmit.cfg
index 9fa20c1..3ae100c 100644
--- a/kokoro/linux/python37/presubmit.cfg
+++ b/kokoro/linux/python37/presubmit.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.7-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python37_cpp/build.sh b/kokoro/linux/python37_cpp/build.sh
deleted file mode 100755
index 3126b48..0000000
--- a/kokoro/linux/python37_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python37
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python37_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python37_cpp/continuous.cfg b/kokoro/linux/python37_cpp/continuous.cfg
index 49c441f..44f6606 100644
--- a/kokoro/linux/python37_cpp/continuous.cfg
+++ b/kokoro/linux/python37_cpp/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.7-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python37_cpp/presubmit.cfg b/kokoro/linux/python37_cpp/presubmit.cfg
index 49c441f..54b2de4 100644
--- a/kokoro/linux/python37_cpp/presubmit.cfg
+++ b/kokoro/linux/python37_cpp/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python37_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.7-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python38/build.sh b/kokoro/linux/python38/build.sh
deleted file mode 100755
index 299c7ba..0000000
--- a/kokoro/linux/python38/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python38
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python38"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python38/continuous.cfg b/kokoro/linux/python38/continuous.cfg
index 76425d2..7d9e7aa 100644
--- a/kokoro/linux/python38/continuous.cfg
+++ b/kokoro/linux/python38/continuous.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.8-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python38/presubmit.cfg b/kokoro/linux/python38/presubmit.cfg
index 76425d2..7d9e7aa 100644
--- a/kokoro/linux/python38/presubmit.cfg
+++ b/kokoro/linux/python38/presubmit.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.8-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python38_cpp/build.sh b/kokoro/linux/python38_cpp/build.sh
deleted file mode 100755
index b43859b..0000000
--- a/kokoro/linux/python38_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python38
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python38_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python38_cpp/continuous.cfg b/kokoro/linux/python38_cpp/continuous.cfg
index 1e8888c..dc24fd2 100644
--- a/kokoro/linux/python38_cpp/continuous.cfg
+++ b/kokoro/linux/python38_cpp/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.8-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python38_cpp/presubmit.cfg b/kokoro/linux/python38_cpp/presubmit.cfg
index 1e8888c..f9d025a 100644
--- a/kokoro/linux/python38_cpp/presubmit.cfg
+++ b/kokoro/linux/python38_cpp/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python38_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.8-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python39/build.sh b/kokoro/linux/python39/build.sh
deleted file mode 100755
index 497dc66..0000000
--- a/kokoro/linux/python39/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python39
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python39"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python39/continuous.cfg b/kokoro/linux/python39/continuous.cfg
index b03bc90..5133ab5 100644
--- a/kokoro/linux/python39/continuous.cfg
+++ b/kokoro/linux/python39/continuous.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.9-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python39/presubmit.cfg b/kokoro/linux/python39/presubmit.cfg
index b03bc90..5133ab5 100644
--- a/kokoro/linux/python39/presubmit.cfg
+++ b/kokoro/linux/python39/presubmit.cfg
@@ -1,11 +1,21 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.9-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python39_cpp/build.sh b/kokoro/linux/python39_cpp/build.sh
deleted file mode 100755
index f45d2ec..0000000
--- a/kokoro/linux/python39_cpp/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/python39
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python39_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python39_cpp/continuous.cfg b/kokoro/linux/python39_cpp/continuous.cfg
index dd84fbe..f11d73e 100644
--- a/kokoro/linux/python39_cpp/continuous.cfg
+++ b/kokoro/linux/python39_cpp/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.9-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/... @upb//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/python39_cpp/presubmit.cfg b/kokoro/linux/python39_cpp/presubmit.cfg
index dd84fbe..d7deef5 100644
--- a/kokoro/linux/python39_cpp/presubmit.cfg
+++ b/kokoro/linux/python39_cpp/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python39_cpp/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/python/linux:3.9-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//python/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=use_fast_cpp_protos=true"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby25/build.sh b/kokoro/linux/ruby25/build.sh
deleted file mode 100755
index 1e82ec5..0000000
--- a/kokoro/linux/ruby25/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby25"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby25/continuous.cfg b/kokoro/linux/ruby25/continuous.cfg
index dee2db0..ec975cd 100644
--- a/kokoro/linux/ruby25/continuous.cfg
+++ b/kokoro/linux/ruby25/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby25/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-2.5.1-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby25/presubmit.cfg b/kokoro/linux/ruby25/presubmit.cfg
index dee2db0..ec975cd 100644
--- a/kokoro/linux/ruby25/presubmit.cfg
+++ b/kokoro/linux/ruby25/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby25/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-2.5.1-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby26/build.sh b/kokoro/linux/ruby26/build.sh
deleted file mode 100755
index 72d2d45..0000000
--- a/kokoro/linux/ruby26/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby26"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby26/continuous.cfg b/kokoro/linux/ruby26/continuous.cfg
index 4779065..d09a405 100644
--- a/kokoro/linux/ruby26/continuous.cfg
+++ b/kokoro/linux/ruby26/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby26/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-2.6.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby26/presubmit.cfg b/kokoro/linux/ruby26/presubmit.cfg
index 4779065..d09a405 100644
--- a/kokoro/linux/ruby26/presubmit.cfg
+++ b/kokoro/linux/ruby26/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby26/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-2.6.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby27/build.sh b/kokoro/linux/ruby27/build.sh
deleted file mode 100755
index c38ee36..0000000
--- a/kokoro/linux/ruby27/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby27"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby27/continuous.cfg b/kokoro/linux/ruby27/continuous.cfg
index 9cce8c9..51afa75 100644
--- a/kokoro/linux/ruby27/continuous.cfg
+++ b/kokoro/linux/ruby27/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby27/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-2.7.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby27/presubmit.cfg b/kokoro/linux/ruby27/presubmit.cfg
index 9cce8c9..51afa75 100644
--- a/kokoro/linux/ruby27/presubmit.cfg
+++ b/kokoro/linux/ruby27/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby27/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-2.7.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby30/build.sh b/kokoro/linux/ruby30/build.sh
deleted file mode 100755
index 9e44575..0000000
--- a/kokoro/linux/ruby30/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby30"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby30/continuous.cfg b/kokoro/linux/ruby30/continuous.cfg
index b03a335..338505e 100644
--- a/kokoro/linux/ruby30/continuous.cfg
+++ b/kokoro/linux/ruby30/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby30/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-3.0.2-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby30/presubmit.cfg b/kokoro/linux/ruby30/presubmit.cfg
index b03a335..338505e 100644
--- a/kokoro/linux/ruby30/presubmit.cfg
+++ b/kokoro/linux/ruby30/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby30/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-3.0.2-2f706fd1ab49f4e97af769388be486069b63efee"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby31/build.sh b/kokoro/linux/ruby31/build.sh
deleted file mode 100644
index c22bdae..0000000
--- a/kokoro/linux/ruby31/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERHUB_ORGANIZATION=protobuftesting
-export DOCKERFILE_DIR=kokoro/linux/dockerfile/test/ruby
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="ruby31"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/ruby31/continuous.cfg b/kokoro/linux/ruby31/continuous.cfg
index 0477912..588fe13 100644
--- a/kokoro/linux/ruby31/continuous.cfg
+++ b/kokoro/linux/ruby31/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby31/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-3.1.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby31/presubmit.cfg b/kokoro/linux/ruby31/presubmit.cfg
index 0477912..588fe13 100644
--- a/kokoro/linux/ruby31/presubmit.cfg
+++ b/kokoro/linux/ruby31/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby31/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/ruby/linux:ruby-3.1.0-64e8944e4f18d7d6c9649112a8a93be57e693cd8"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby_aarch64/build.sh b/kokoro/linux/ruby_aarch64/build.sh
deleted file mode 100755
index 6473e0d..0000000
--- a/kokoro/linux/ruby_aarch64/build.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "continuous" and "presubmit" jobs.
-
-set -ex
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-# Initialize any submodules.
-git submodule update --init --recursive
-
-kokoro/linux/aarch64/qemu_helpers/prepare_qemu.sh
-
-kokoro/linux/aarch64/test_ruby_aarch64.sh
diff --git a/kokoro/linux/ruby_aarch64/continuous.cfg b/kokoro/linux/ruby_aarch64/continuous.cfg
index ae82696..044e826 100644
--- a/kokoro/linux/ruby_aarch64/continuous.cfg
+++ b/kokoro/linux/ruby_aarch64/continuous.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby_aarch64/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/linux/ruby_aarch64/presubmit.cfg b/kokoro/linux/ruby_aarch64/presubmit.cfg
index ae82696..044e826 100644
--- a/kokoro/linux/ruby_aarch64/presubmit.cfg
+++ b/kokoro/linux/ruby_aarch64/presubmit.cfg
@@ -1,11 +1,26 @@
 # Config file for running tests in Kokoro
 
 # Location of the build script in repository
-build_file: "protobuf/kokoro/linux/ruby_aarch64/build.sh"
+build_file: "protobuf/kokoro/linux/bazel.sh"
 timeout_mins: 120
 
+env_vars {
+  key: "CONTAINER_IMAGE"
+  value: "gcr.io/protobuf-build/emulation/linux:aarch64-4e847d7a01c1792471b6dd985ab0bf2677332e6f"
+}
+
+env_vars {
+  key: "BAZEL_TARGETS"
+  value: "//ruby/..."
+}
+
+env_vars {
+  key: "BAZEL_EXTRA_FLAGS"
+  value: "--define=ruby_platform=c"
+}
+
 action {
   define_artifacts {
-    regex: "**/sponge_log.xml"
+    regex: "**/sponge_log.*"
   }
 }
diff --git a/kokoro/macos/cpp/build.sh b/kokoro/macos/cpp/build.sh
index fae3b30..7c21d48 100755
--- a/kokoro/macos/cpp/build.sh
+++ b/kokoro/macos/cpp/build.sh
@@ -5,26 +5,13 @@
 set -eux
 set -o pipefail
 
-if [[ -h /tmpfs ]] && [[ ${PWD} == /tmpfs/src ]]; then
-  # Workaround for internal Kokoro bug: b/227401944
-  cd /Volumes/BuildData/tmpfs/src
-fi
-
-# Default environment variables used by cmake build:
-: ${CMAKE_CONFIG_TYPE:=Debug}
-export CMAKE_CONFIG_TYPE
-: ${CTEST_PARALLEL_LEVEL:=4}
-export CTEST_PARALLEL_LEVEL
-
 # Run from the project root directory.
 cd $(dirname $0)/../../..
 
-#
-# Update submodules
-#
-git submodule update --init --recursive
+# Prepare worker environment to run tests
+source kokoro/macos/prepare_build_macos_rc
 
 #
 # Run build
 #
-kokoro/common/cmake.sh
+bazel test //src/... -k --test_output=streamed
diff --git a/kokoro/macos/objectivec_ios_debug/build.sh b/kokoro/macos/objectivec_ios_debug/build.sh
index 1055d72..77b704f 100755
--- a/kokoro/macos/objectivec_ios_debug/build.sh
+++ b/kokoro/macos/objectivec_ios_debug/build.sh
@@ -8,4 +8,5 @@
 # Prepare worker environment to run tests
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh objectivec_ios_debug
+objectivec/DevTools/full_mac_build.sh \
+  --core-only --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance --skip-xcode-release
diff --git a/kokoro/macos/objectivec_ios_release/build.sh b/kokoro/macos/objectivec_ios_release/build.sh
index 76ce3ba..adbc4f2 100755
--- a/kokoro/macos/objectivec_ios_release/build.sh
+++ b/kokoro/macos/objectivec_ios_release/build.sh
@@ -8,4 +8,5 @@
 # Prepare worker environment to run tests
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh objectivec_ios_release
+objectivec/DevTools/full_mac_build.sh \
+  --core-only --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance --skip-xcode-debug
diff --git a/kokoro/macos/objectivec_osx/build.sh b/kokoro/macos/objectivec_osx/build.sh
index 000be27..7f5d561 100755
--- a/kokoro/macos/objectivec_osx/build.sh
+++ b/kokoro/macos/objectivec_osx/build.sh
@@ -8,4 +8,5 @@
 # Prepare worker environment to run tests
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh objectivec_osx
+objectivec/DevTools/full_mac_build.sh \
+  --core-only --skip-xcode-ios --skip-xcode-tvos
diff --git a/kokoro/macos/php74/build.sh b/kokoro/macos/php74/build.sh
index ff39657..2b50a0a 100755
--- a/kokoro/macos/php74/build.sh
+++ b/kokoro/macos/php74/build.sh
@@ -17,4 +17,4 @@
 export PATH="$PHP_FOLDER/bin:$PATH"
 
 # Test
-./tests.sh php_mac
+kokoro/macos/test_php.sh
diff --git a/kokoro/macos/php80/build.sh b/kokoro/macos/php80/build.sh
index 84e2c46..4051822 100755
--- a/kokoro/macos/php80/build.sh
+++ b/kokoro/macos/php80/build.sh
@@ -17,4 +17,4 @@
 export PATH="$PHP_FOLDER/bin:$PATH"
 
 # Test
-./tests.sh php_mac
+kokoro/macos/test_php.sh
diff --git a/kokoro/macos/prepare_build_macos_rc b/kokoro/macos/prepare_build_macos_rc
index 7ec2832..fe3b6be 100755
--- a/kokoro/macos/prepare_build_macos_rc
+++ b/kokoro/macos/prepare_build_macos_rc
@@ -16,13 +16,6 @@
 pyenv global 2.7.18
 
 ##
-# Install Tox
-
-if [[ "${KOKORO_INSTALL_TOX:-}" == "yes" ]] ; then
-  sudo python3 -m pip install --upgrade pip tox
-fi
-
-##
 # Setup RVM
 if [[ "${KOKORO_INSTALL_RVM:-}" == "yes" ]] ; then
     git config --global --add safe.directory $HOMEBREW_PREFIX/Library/Taps/homebrew/homebrew-cask
@@ -38,3 +31,11 @@
     chmod ug+x valgrind
     sudo mv valgrind /usr/local/bin/valgrind
 fi
+
+##
+# Install Virtual Python Environment
+
+if [[ "${KOKORO_INSTALL_VENV:-}" == "yes" ]] ; then
+    python3 -m venv venv
+    source venv/bin/activate
+fi
diff --git a/kokoro/macos/python/build.sh b/kokoro/macos/python/build.sh
index 388e24b..f1ea3aa 100755
--- a/kokoro/macos/python/build.sh
+++ b/kokoro/macos/python/build.sh
@@ -6,7 +6,7 @@
 cd $(dirname $0)/../../..
 
 # Prepare worker environment to run tests
-KOKORO_INSTALL_TOX=yes
+KOKORO_INSTALL_VENV=yes
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh python
+bazel test //python/... @upb//python/... -k --macos_minimum_os=10.9 --test_output=streamed
diff --git a/kokoro/macos/python/presubmit.cfg b/kokoro/macos/python/presubmit.cfg
index 0fc8b50..ac3cbee 100644
--- a/kokoro/macos/python/presubmit.cfg
+++ b/kokoro/macos/python/presubmit.cfg
@@ -3,3 +3,9 @@
 # Location of the build script in repository
 build_file: "protobuf/kokoro/macos/python/build.sh"
 timeout_mins: 1440
+
+action {
+  define_artifacts {
+    regex: "**/*"
+  }
+}
diff --git a/kokoro/macos/python_cpp/build.sh b/kokoro/macos/python_cpp/build.sh
index f86dd6f..ae480a5 100755
--- a/kokoro/macos/python_cpp/build.sh
+++ b/kokoro/macos/python_cpp/build.sh
@@ -6,8 +6,7 @@
 cd $(dirname $0)/../../..
 
 # Prepare worker environment to run tests
-KOKORO_INSTALL_TOX=yes
+KOKORO_INSTALL_VENV=yes
 source kokoro/macos/prepare_build_macos_rc
-g++ --version
 
-./tests.sh python_cpp
+bazel test //python/... -k --macos_minimum_os=10.9 --test_output=streamed --define=use_fast_cpp_protos=true
diff --git a/kokoro/macos/ruby25/build.sh b/kokoro/macos/ruby25/build.sh
index 48c8940..81ce2c3 100755
--- a/kokoro/macos/ruby25/build.sh
+++ b/kokoro/macos/ruby25/build.sh
@@ -9,4 +9,5 @@
 KOKORO_INSTALL_RVM=yes
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh ruby25
+cd ruby
+./travis-test.sh ruby-2.5.1
diff --git a/kokoro/macos/ruby26/build.sh b/kokoro/macos/ruby26/build.sh
index 1b94fe1..ee815b6 100755
--- a/kokoro/macos/ruby26/build.sh
+++ b/kokoro/macos/ruby26/build.sh
@@ -9,4 +9,5 @@
 KOKORO_INSTALL_RVM=yes
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh ruby26
+cd ruby
+./travis-test.sh ruby-2.6.0
diff --git a/kokoro/macos/ruby27/build.sh b/kokoro/macos/ruby27/build.sh
index baebdb7..ca6badb 100755
--- a/kokoro/macos/ruby27/build.sh
+++ b/kokoro/macos/ruby27/build.sh
@@ -9,4 +9,5 @@
 KOKORO_INSTALL_RVM=yes
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh ruby27
+cd ruby
+./travis-test.sh ruby-2.7.0
diff --git a/kokoro/macos/ruby30/build.sh b/kokoro/macos/ruby30/build.sh
index b1e0641..01bdc47 100755
--- a/kokoro/macos/ruby30/build.sh
+++ b/kokoro/macos/ruby30/build.sh
@@ -9,4 +9,5 @@
 KOKORO_INSTALL_RVM=yes
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh ruby30
+cd ruby
+./travis-test.sh ruby-3.0.2
diff --git a/kokoro/macos/ruby31/build.sh b/kokoro/macos/ruby31/build.sh
index 1b5a5a5..57914bd 100644
--- a/kokoro/macos/ruby31/build.sh
+++ b/kokoro/macos/ruby31/build.sh
@@ -9,4 +9,5 @@
 KOKORO_INSTALL_RVM=yes
 source kokoro/macos/prepare_build_macos_rc
 
-./tests.sh ruby31
+cd ruby
+./travis-test.sh ruby-3.1.0
diff --git a/kokoro/macos/test_php.sh b/kokoro/macos/test_php.sh
new file mode 100755
index 0000000..933b251
--- /dev/null
+++ b/kokoro/macos/test_php.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+set -eux
+
+pushd php
+rm -rf vendor
+php -v
+php -m
+composer update
+composer test_c
+popd
+
+git clean -fXd
+bazel test //php:conformance_test_c --action_env=PATH --test_env=PATH --test_output=streamed
diff --git a/kokoro/release/protoc/linux/build.sh b/kokoro/release/protoc/linux/build.sh
index 44a95aa..ca3ff21 100755
--- a/kokoro/release/protoc/linux/build.sh
+++ b/kokoro/release/protoc/linux/build.sh
@@ -1,44 +1,29 @@
 #!/bin/bash
 
-set -x
+# This is not the source of truth for release protoc executables, and will soon
+# be deprecated.
+
+set -ex
 
 # Change to repo root.
 cd $(dirname $0)/../../../..
+GIT_REPO_ROOT=$(pwd)
 
 # Initialize any submodules.
 git submodule update --init --recursive
 
-# Generate the configure script.
-./autogen.sh
-
 # Cross-build for aarch64, ppc64le and s390x. Note: we do these builds first to avoid
 # file permission issues. The Docker builds will create directories owned by
 # root, which causes problems if we try to add new artifacts to those
 # directories afterward.
 
-sudo apt install -y g++-aarch64-linux-gnu
+
 protoc-artifacts/build-protoc.sh linux aarch_64 protoc
 
-sudo apt install -y g++-powerpc64le-linux-gnu
 protoc-artifacts/build-protoc.sh linux ppcle_64 protoc
 
-sudo apt install -y g++-s390x-linux-gnu
 protoc-artifacts/build-protoc.sh linux s390_64 protoc
 
-# Use docker image to build linux artifacts.
-DOCKER_IMAGE_NAME=protobuf/protoc_$(sha1sum protoc-artifacts/Dockerfile | cut -f1 -d " ")
-docker pull $DOCKER_IMAGE_NAME
+protoc-artifacts/build-protoc.sh linux x86_64 protoc
 
-docker run -v $(pwd):/var/local/protobuf --rm $DOCKER_IMAGE_NAME \
-    bash -l /var/local/protobuf/protoc-artifacts/build-protoc.sh \
-    linux x86_64 protoc || {
-  echo "Failed to build protoc for linux + x86_64."
-  exit 1
-}
-
-docker run -v $(pwd):/var/local/protobuf --rm $DOCKER_IMAGE_NAME \
-    bash -l /var/local/protobuf/protoc-artifacts/build-protoc.sh \
-    linux x86_32 protoc || {
-  echo "Failed to build protoc for linux + x86_32."
-  exit 1
-}
+protoc-artifacts/build-protoc.sh linux x86_32 protoc
diff --git a/kokoro/release/protoc/macos/build.sh b/kokoro/release/protoc/macos/build.sh
index 47c9bfa..8daddf6 100755
--- a/kokoro/release/protoc/macos/build.sh
+++ b/kokoro/release/protoc/macos/build.sh
@@ -4,12 +4,7 @@
 CXXFLAGS_COMMON="-std=c++14 -DNDEBUG -mmacosx-version-min=10.9"
 
 cd github/protobuf
-./autogen.sh
 
-mkdir build64 && cd build64
-export CXXFLAGS="$CXXFLAGS_COMMON -m64"
-../configure --disable-shared
-make -j4
-file src/protoc
-otool -L src/protoc | grep dylib
-cd ..
+bazel build //:protoc --dynamic_mode=off
+file bazel-bin/protoc
+otool -L bazel-bin/protoc | grep dylib
diff --git a/kokoro/release/ruby/linux/ruby/ruby_build.sh b/kokoro/release/ruby/linux/ruby/ruby_build.sh
index 761b54f..12d270e 100755
--- a/kokoro/release/ruby/linux/ruby/ruby_build.sh
+++ b/kokoro/release/ruby/linux/ruby/ruby_build.sh
@@ -5,8 +5,10 @@
 # Build protoc
 use_bazel.sh 5.1.1
 bazel build //:protoc
-cp bazel-bin/protoc src/protoc
-export PROTOC=$PWD/src/protoc
+
+# The java build setup expects protoc in the root directory.
+cp bazel-bin/protoc .
+export PROTOC=$PWD/protoc
 
 umask 0022
 pushd ruby
diff --git a/kokoro/windows/bazel/build.bat b/kokoro/windows/bazel/build.bat
index 73eb0fd..b7b77a6 100644
--- a/kokoro/windows/bazel/build.bat
+++ b/kokoro/windows/bazel/build.bat
@@ -21,7 +21,10 @@
 bazel %BAZEL_STARTUP% build //:protoc //:protobuf //:protobuf_lite %BAZEL_FLAGS% || goto :error
 
 @rem Run C++ tests.
-bazel %BAZEL_STARTUP% test //src/... %BAZEL_FLAGS% || goto :error
+@rem TODO(b/241484899) Enable conformance tests on windows.
+bazel %BAZEL_STARTUP% test %BAZEL_FLAGS% ^
+  --test_tag_filters=-conformance --build_tag_filters=-conformance ^
+  //src/...  || goto :error
 
 goto :EOF
 
diff --git a/m4/ac_system_extensions.m4 b/m4/ac_system_extensions.m4
deleted file mode 100644
index 1ca2eeb..0000000
--- a/m4/ac_system_extensions.m4
+++ /dev/null
@@ -1,37 +0,0 @@
-dnl Provide AC_USE_SYSTEM_EXTENSIONS for old autoconf machines.
-AC_DEFUN([ACX_USE_SYSTEM_EXTENSIONS],[
-  ifdef([AC_USE_SYSTEM_EXTENSIONS],[
-    AC_USE_SYSTEM_EXTENSIONS
-  ],[
-    AC_BEFORE([$0], [AC_COMPILE_IFELSE])
-    AC_BEFORE([$0], [AC_RUN_IFELSE])
-
-    AC_REQUIRE([AC_GNU_SOURCE])
-    AC_REQUIRE([AC_AIX])
-    AC_REQUIRE([AC_MINIX])
-
-    AH_VERBATIM([__EXTENSIONS__],
-[/* Enable extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif
-#ifndef _TANDEM_SOURCE
-# undef _TANDEM_SOURCE
-#endif])
-    AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
-      [ac_cv_safe_to_define___extensions__],
-      [AC_COMPILE_IFELSE(
-         [AC_LANG_PROGRAM([
-#           define __EXTENSIONS__ 1
-            AC_INCLUDES_DEFAULT])],
-         [ac_cv_safe_to_define___extensions__=yes],
-         [ac_cv_safe_to_define___extensions__=no])])
-    test $ac_cv_safe_to_define___extensions__ = yes &&
-      AC_DEFINE([__EXTENSIONS__])
-    AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
-    AC_DEFINE([_TANDEM_SOURCE])
-  ])
-])
diff --git a/m4/acx_check_suncc.m4 b/m4/acx_check_suncc.m4
deleted file mode 100644
index 0a9a577..0000000
--- a/m4/acx_check_suncc.m4
+++ /dev/null
@@ -1,73 +0,0 @@
-dnl Check for the presence of the Sun Studio compiler.
-dnl If Sun Studio compiler is found, set appropriate flags.
-dnl Additionally, Sun Studio doesn't default to 64-bit by itself,
-dnl nor does it automatically look in standard Solaris places for
-dnl 64-bit libs, so we must add those options and paths to the search
-dnl paths.
-
-dnl TODO(kenton):  This is pretty hacky.  It sets CXXFLAGS, which the autoconf
-dnl docs say should never be overridden except by the user.  It also isn't
-dnl cross-compile safe.  We should fix these problems, but since I don't have
-dnl Sun CC at my disposal for testing, someone else will have to do it.
-
-AC_DEFUN([ACX_CHECK_SUNCC],[
-
-  AC_LANG_PUSH([C++])
-  AC_CHECK_DECL([__SUNPRO_CC], [SUNCC="yes"], [SUNCC="no"])
-  AC_LANG_POP()
-
-
-  AC_ARG_ENABLE([64bit-solaris],
-    [AS_HELP_STRING([--disable-64bit-solaris],
-      [Build 64 bit binary on Solaris @<:@default=on@:>@])],
-             [ac_enable_64bit="$enableval"],
-             [ac_enable_64bit="yes"])
-
-  AS_IF([test "$SUNCC" = "yes" -a "x${ac_cv_env_CXXFLAGS_set}" = "x"],[
-    dnl Sun Studio has a crashing bug with -xO4 in some cases. Keep this
-    dnl at -xO3 until a proper test to detect those crashes can be done.
-    CXXFLAGS="-g0 -xO3 -xlibmil -xdepend -xbuiltin -mt -template=no%extdef ${CXXFLAGS}"
-  ])
-
-  case $host_os in
-    *solaris*)
-      AC_CHECK_PROGS(ISAINFO, [isainfo], [no])
-      AS_IF([test "x$ISAINFO" != "xno"],
-            [isainfo_b=`${ISAINFO} -b`],
-            [isainfo_b="x"])
-
-      AS_IF([test "$isainfo_b" != "x"],[
-
-        isainfo_k=`${ISAINFO} -k`
-
-        AS_IF([test "x$ac_enable_64bit" = "xyes"],[
-
-          AS_IF([test "x$libdir" = "x\${exec_prefix}/lib"],[
-           dnl The user hasn't overridden the default libdir, so we'll
-           dnl the dir suffix to match solaris 32/64-bit policy
-           libdir="${libdir}/${isainfo_k}"
-          ])
-
-          dnl This should just be set in CPPFLAGS and in LDFLAGS, but libtool
-          dnl does the wrong thing if you don't put it into CXXFLAGS. sigh.
-          dnl (It also needs it in CFLAGS, or it does a different wrong thing!)
-          CXXFLAGS="${CXXFLAGS} -m64"
-          ac_cv_env_CXXFLAGS_set=set
-          ac_cv_env_CXXFLAGS_value='-m64'
-
-          CFLAGS="${CFLAGS} -m64"
-          ac_cv_env_CFLAGS_set=set
-          ac_cv_env_CFLAGS_value='-m64'
-
-          AS_IF([test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes" ],[
-            CXXFLAGS="-xmemalign=8s ${CXXFLAGS}"
-          ])
-        ])
-      ])
-    ;;
-  esac
-
-  AS_IF([test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes" ],[
-    CXXFLAGS="-xregs=no%appl ${CXXFLAGS}"
-  ])
-])
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
deleted file mode 100644
index d3288e2..0000000
--- a/m4/ax_cxx_compile_stdcxx.m4
+++ /dev/null
@@ -1,1001 +0,0 @@
-# ===========================================================================
-#   http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
-#
-# DESCRIPTION
-#
-#   Check for baseline language coverage in the compiler for the specified
-#   version of the C++ standard.  If necessary, add switches to CXX and
-#   CXXCPP to enable support.  VERSION may be '11' (for the C++11 standard)
-#   or '14' (for the C++14 standard).
-#
-#   The second argument, if specified, indicates whether you insist on an
-#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
-#   -std=c++11).  If neither is specified, you get whatever works, with
-#   preference for an extended mode.
-#
-#   The third argument, if specified 'mandatory' or if left unspecified,
-#   indicates that baseline support for the specified C++ standard is
-#   required and that the macro should error out if no mode with that
-#   support is found.  If specified 'optional', then configuration proceeds
-#   regardless, after defining HAVE_CXX${VERSION} if and only if a
-#   supporting mode is found.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
-#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
-#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
-#   Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
-#   Copyright (c) 2015 Paul Norman <penorman@mac.com>
-#   Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
-#   Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved.  This file is offered as-is, without any
-#   warranty.
-
-#serial 6
-
-dnl  This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
-dnl  (serial version number 13).
-
-AX_REQUIRE_DEFINED([AC_MSG_WARN])
-AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
-  m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
-        [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
-        [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
-        [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
-  m4_if([$2], [], [],
-        [$2], [ext], [],
-        [$2], [noext], [],
-        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
-  m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
-        [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
-        [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
-        [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
-  AC_LANG_PUSH([C++])dnl
-  ac_success=no
-  AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
-  ax_cv_cxx_compile_cxx$1,
-  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
-    [ax_cv_cxx_compile_cxx$1=yes],
-    [ax_cv_cxx_compile_cxx$1=no])])
-  if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
-    ac_success=yes
-  fi
-
-  m4_if([$2], [noext], [], [dnl
-  if test x$ac_success = xno; then
-    for alternative in ${ax_cxx_compile_alternatives}; do
-      switch="-std=gnu++${alternative}"
-      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
-      AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
-                     $cachevar,
-        [ac_save_CXX="$CXX"
-         CXX="$CXX $switch"
-         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
-          [eval $cachevar=yes],
-          [eval $cachevar=no])
-         CXX="$ac_save_CXX"])
-      if eval test x\$$cachevar = xyes; then
-        CXX="$CXX $switch"
-        if test -n "$CXXCPP" ; then
-          CXXCPP="$CXXCPP $switch"
-        fi
-        ac_success=yes
-        break
-      fi
-    done
-  fi])
-
-  m4_if([$2], [ext], [], [dnl
-  if test x$ac_success = xno; then
-    dnl HP's aCC needs +std=c++11 according to:
-    dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
-    dnl Cray's crayCC needs "-h std=c++11"
-    for alternative in ${ax_cxx_compile_alternatives}; do
-      for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
-        cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
-        AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
-                       $cachevar,
-          [ac_save_CXX="$CXX"
-           CXX="$CXX $switch"
-           AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
-            [eval $cachevar=yes],
-            [eval $cachevar=no])
-           CXX="$ac_save_CXX"])
-        if eval test x\$$cachevar = xyes; then
-          CXX="$CXX $switch"
-          if test -n "$CXXCPP" ; then
-            CXXCPP="$CXXCPP $switch"
-          fi
-          ac_success=yes
-          break
-        fi
-      done
-      if test x$ac_success = xyes; then
-        break
-      fi
-    done
-  fi])
-  AC_LANG_POP([C++])
-  if test x$ax_cxx_compile_cxx$1_required = xtrue; then
-    if test x$ac_success = xno; then
-      AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
-    fi
-  fi
-  if test x$ac_success = xno; then
-    HAVE_CXX$1=0
-    AC_MSG_NOTICE([No compiler with C++$1 support was found])
-  else
-    HAVE_CXX$1=1
-    AC_DEFINE(HAVE_CXX$1,1,
-              [define if the compiler supports basic C++$1 syntax])
-  fi
-  AC_SUBST(HAVE_CXX$1)
-  m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])])
-])
-
-
-dnl  Test body for checking C++11 support
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
-)
-
-
-dnl  Test body for checking C++14 support
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
-)
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
-  _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
-)
-
-dnl  Tests for new features in C++11
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
-
-// If the compiler admits that it is not ready for C++11, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus < 201103L
-
-#error "This is not a C++11 compiler"
-
-#else
-
-#include <utility>
-
-namespace cxx11
-{
-
-  namespace test_static_assert
-  {
-
-    template <typename T>
-    struct check
-    {
-      static_assert(sizeof(int) <= sizeof(T), "not big enough");
-    };
-
-  }
-
-  namespace test_final_override
-  {
-
-    struct Base
-    {
-      virtual void f() {}
-    };
-
-    struct Derived : public Base
-    {
-      virtual void f() override {}
-    };
-
-  }
-
-  namespace test_double_right_angle_brackets
-  {
-
-    template < typename T >
-    struct check {};
-
-    typedef check<void> single_type;
-    typedef check<check<void>> double_type;
-    typedef check<check<check<void>>> triple_type;
-    typedef check<check<check<check<void>>>> quadruple_type;
-
-  }
-
-  namespace test_decltype
-  {
-
-    int
-    f()
-    {
-      int a = 1;
-      decltype(a) b = 2;
-      return a + b;
-    }
-
-  }
-
-  namespace test_type_deduction
-  {
-
-    template < typename T1, typename T2 >
-    struct is_same
-    {
-      static const bool value = false;
-    };
-
-    template < typename T >
-    struct is_same<T, T>
-    {
-      static const bool value = true;
-    };
-
-    template < typename T1, typename T2 >
-    auto
-    add(T1 a1, T2 a2) -> decltype(a1 + a2)
-    {
-      return a1 + a2;
-    }
-
-    int
-    test(const int c, volatile int v)
-    {
-      static_assert(is_same<int, decltype(0)>::value == true, "");
-      static_assert(is_same<int, decltype(c)>::value == false, "");
-      static_assert(is_same<int, decltype(v)>::value == false, "");
-      auto ac = c;
-      auto av = v;
-      auto sumi = ac + av + 'x';
-      auto sumf = ac + av + 1.0;
-      static_assert(is_same<int, decltype(ac)>::value == true, "");
-      static_assert(is_same<int, decltype(av)>::value == true, "");
-      static_assert(is_same<int, decltype(sumi)>::value == true, "");
-      static_assert(is_same<int, decltype(sumf)>::value == false, "");
-      static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
-      return (sumf > 0.0) ? sumi : add(c, v);
-    }
-
-  }
-
-  namespace test_noexcept
-  {
-
-    int f() { return 0; }
-    int g() noexcept { return 0; }
-
-    static_assert(noexcept(f()) == false, "");
-    static_assert(noexcept(g()) == true, "");
-
-  }
-
-  namespace test_constexpr
-  {
-
-    template < typename CharT >
-    unsigned long constexpr
-    strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
-    {
-      return *s ? strlen_c_r(s + 1, acc + 1) : acc;
-    }
-
-    template < typename CharT >
-    unsigned long constexpr
-    strlen_c(const CharT *const s) noexcept
-    {
-      return strlen_c_r(s, 0UL);
-    }
-
-    static_assert(strlen_c("") == 0UL, "");
-    static_assert(strlen_c("1") == 1UL, "");
-    static_assert(strlen_c("example") == 7UL, "");
-    static_assert(strlen_c("another\0example") == 7UL, "");
-
-  }
-
-  namespace test_rvalue_references
-  {
-
-    template < int N >
-    struct answer
-    {
-      static constexpr int value = N;
-    };
-
-    answer<1> f(int&)       { return answer<1>(); }
-    answer<2> f(const int&) { return answer<2>(); }
-    answer<3> f(int&&)      { return answer<3>(); }
-
-    void
-    test()
-    {
-      int i = 0;
-      const int c = 0;
-      static_assert(decltype(f(i))::value == 1, "");
-      static_assert(decltype(f(c))::value == 2, "");
-      static_assert(decltype(f(0))::value == 3, "");
-    }
-
-  }
-
-  namespace test_uniform_initialization
-  {
-
-    struct test
-    {
-      static const int zero {};
-      static const int one {1};
-    };
-
-    static_assert(test::zero == 0, "");
-    static_assert(test::one == 1, "");
-
-  }
-
-  namespace test_lambdas
-  {
-
-    void
-    test1()
-    {
-      auto lambda1 = [](){};
-      auto lambda2 = lambda1;
-      lambda1();
-      lambda2();
-    }
-
-    int
-    test2()
-    {
-      auto a = [](int i, int j){ return i + j; }(1, 2);
-      auto b = []() -> int { return '0'; }();
-      auto c = [=](){ return a + b; }();
-      auto d = [&](){ return c; }();
-      auto e = [a, &b](int x) mutable {
-        const auto identity = [](int y){ return y; };
-        for (auto i = 0; i < a; ++i)
-          a += b--;
-        return x + identity(a + b);
-      }(0);
-      return a + b + c + d + e;
-    }
-
-    int
-    test3()
-    {
-      const auto nullary = [](){ return 0; };
-      const auto unary = [](int x){ return x; };
-      using nullary_t = decltype(nullary);
-      using unary_t = decltype(unary);
-      const auto higher1st = [](nullary_t f){ return f(); };
-      const auto higher2nd = [unary](nullary_t f1){
-        return [unary, f1](unary_t f2){ return f2(unary(f1())); };
-      };
-      return higher1st(nullary) + higher2nd(nullary)(unary);
-    }
-
-  }
-
-  namespace test_variadic_templates
-  {
-
-    template <int...>
-    struct sum;
-
-    template <int N0, int... N1toN>
-    struct sum<N0, N1toN...>
-    {
-      static constexpr auto value = N0 + sum<N1toN...>::value;
-    };
-
-    template <>
-    struct sum<>
-    {
-      static constexpr auto value = 0;
-    };
-
-    static_assert(sum<>::value == 0, "");
-    static_assert(sum<1>::value == 1, "");
-    static_assert(sum<23>::value == 23, "");
-    static_assert(sum<1, 2>::value == 3, "");
-    static_assert(sum<5, 5, 11>::value == 21, "");
-    static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
-
-  }
-
-  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
-  // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
-  // because of this.
-  namespace test_template_alias_sfinae
-  {
-
-    struct foo {};
-
-    template<typename T>
-    using member = typename T::member_type;
-
-    template<typename T>
-    void func(...) {}
-
-    template<typename T>
-    void func(member<T>*) {}
-
-    void test();
-
-    void test() { func<foo>(0); }
-
-  }
-
-  namespace test_std_move_and_forward
-  {
-    struct message {};
-    char foo(message&) { return '\0'; }
-    int foo(message&&) { return 0; }
-
-    template<typename Arg, typename RT>
-    void check(Arg&& arg, RT rt) {
-      static_assert(sizeof(rt) == sizeof(foo(std::forward<Arg>(arg))), "");
-    }
-    void test() {
-      message a;
-      check(a, char());
-      check(std::move(a), int());
-    }
-  }
-
-}  // namespace cxx11
-
-#endif  // __cplusplus >= 201103L
-
-]])
-
-
-dnl  Tests for new features in C++14
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
-
-// If the compiler admits that it is not ready for C++14, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus < 201402L
-
-#error "This is not a C++14 compiler"
-
-#else
-
-namespace cxx14
-{
-
-  namespace test_polymorphic_lambdas
-  {
-
-    int
-    test()
-    {
-      const auto lambda = [](auto&&... args){
-        const auto istiny = [](auto x){
-          return (sizeof(x) == 1UL) ? 1 : 0;
-        };
-        const int aretiny[] = { istiny(args)... };
-        return aretiny[0];
-      };
-      return lambda(1, 1L, 1.0f, '1');
-    }
-
-  }
-
-  namespace test_binary_literals
-  {
-
-    constexpr auto ivii = 0b0000000000101010;
-    static_assert(ivii == 42, "wrong value");
-
-  }
-
-  namespace test_generalized_constexpr
-  {
-
-    template < typename CharT >
-    constexpr unsigned long
-    strlen_c(const CharT *const s) noexcept
-    {
-      auto length = 0UL;
-      for (auto p = s; *p; ++p)
-        ++length;
-      return length;
-    }
-
-    static_assert(strlen_c("") == 0UL, "");
-    static_assert(strlen_c("x") == 1UL, "");
-    static_assert(strlen_c("test") == 4UL, "");
-    static_assert(strlen_c("another\0test") == 7UL, "");
-
-  }
-
-  namespace test_lambda_init_capture
-  {
-
-    int
-    test()
-    {
-      auto x = 0;
-      const auto lambda1 = [a = x](int b){ return a + b; };
-      const auto lambda2 = [a = lambda1(x)](){ return a; };
-      return lambda2();
-    }
-
-  }
-
-  namespace test_digit_separators
-  {
-
-    constexpr auto ten_million = 100'000'000;
-    static_assert(ten_million == 100000000, "");
-
-  }
-
-  namespace test_return_type_deduction
-  {
-
-    auto f(int& x) { return x; }
-    decltype(auto) g(int& x) { return x; }
-
-    template < typename T1, typename T2 >
-    struct is_same
-    {
-      static constexpr auto value = false;
-    };
-
-    template < typename T >
-    struct is_same<T, T>
-    {
-      static constexpr auto value = true;
-    };
-
-    int
-    test()
-    {
-      auto x = 0;
-      static_assert(is_same<int, decltype(f(x))>::value, "");
-      static_assert(is_same<int&, decltype(g(x))>::value, "");
-      return x;
-    }
-
-  }
-
-}  // namespace cxx14
-
-#endif  // __cplusplus >= 201402L
-
-]])
-
-
-dnl  Tests for new features in C++17
-
-m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
-
-// If the compiler admits that it is not ready for C++17, why torture it?
-// Hopefully, this will speed up the test.
-
-#ifndef __cplusplus
-
-#error "This is not a C++ compiler"
-
-#elif __cplusplus <= 201402L
-
-#error "This is not a C++17 compiler"
-
-#else
-
-#if defined(__clang__)
-  #define REALLY_CLANG
-#else
-  #if defined(__GNUC__)
-    #define REALLY_GCC
-  #endif
-#endif
-
-#include <initializer_list>
-#include <utility>
-#include <type_traits>
-
-namespace cxx17
-{
-
-#if !defined(REALLY_CLANG)
-  namespace test_constexpr_lambdas
-  {
-
-    // TODO: test it with clang++ from git
-
-    constexpr int foo = [](){return 42;}();
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-  namespace test::nested_namespace::definitions
-  {
-
-  }
-
-  namespace test_fold_expression
-  {
-
-    template<typename... Args>
-    int multiply(Args... args)
-    {
-      return (args * ... * 1);
-    }
-
-    template<typename... Args>
-    bool all(Args... args)
-    {
-      return (args && ...);
-    }
-
-  }
-
-  namespace test_extended_static_assert
-  {
-
-    static_assert (true);
-
-  }
-
-  namespace test_auto_brace_init_list
-  {
-
-    auto foo = {5};
-    auto bar {5};
-
-    static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
-    static_assert(std::is_same<int, decltype(bar)>::value);
-  }
-
-  namespace test_typename_in_template_template_parameter
-  {
-
-    template<template<typename> typename X> struct D;
-
-  }
-
-  namespace test_fallthrough_nodiscard_maybe_unused_attributes
-  {
-
-    int f1()
-    {
-      return 42;
-    }
-
-    [[nodiscard]] int f2()
-    {
-      [[maybe_unused]] auto unused = f1();
-
-      switch (f1())
-      {
-      case 17:
-        f1();
-        [[fallthrough]];
-      case 42:
-        f1();
-      }
-      return f1();
-    }
-
-  }
-
-  namespace test_extended_aggregate_initialization
-  {
-
-    struct base1
-    {
-      int b1, b2 = 42;
-    };
-
-    struct base2
-    {
-      base2() {
-        b3 = 42;
-      }
-      int b3;
-    };
-
-    struct derived : base1, base2
-    {
-        int d;
-    };
-
-    derived d1 {{1, 2}, {}, 4};  // full initialization
-    derived d2 {{}, {}, 4};      // value-initialized bases
-
-  }
-
-  namespace test_general_range_based_for_loop
-  {
-
-    struct iter
-    {
-      int i;
-
-      int& operator* ()
-      {
-        return i;
-      }
-
-      const int& operator* () const
-      {
-        return i;
-      }
-
-      iter& operator++()
-      {
-        ++i;
-        return *this;
-      }
-    };
-
-    struct sentinel
-    {
-      int i;
-    };
-
-    bool operator== (const iter& i, const sentinel& s)
-    {
-      return i.i == s.i;
-    }
-
-    bool operator!= (const iter& i, const sentinel& s)
-    {
-      return !(i == s);
-    }
-
-    struct range
-    {
-      iter begin() const
-      {
-        return {0};
-      }
-
-      sentinel end() const
-      {
-        return {5};
-      }
-    };
-
-    void f()
-    {
-      range r {};
-
-      for (auto i : r)
-      {
-        [[maybe_unused]] auto v = i;
-      }
-    }
-
-  }
-
-  namespace test_lambda_capture_asterisk_this_by_value
-  {
-
-    struct t
-    {
-      int i;
-      int foo()
-      {
-        return [*this]()
-        {
-          return i;
-        }();
-      }
-    };
-
-  }
-
-  namespace test_enum_class_construction
-  {
-
-    enum class byte : unsigned char
-    {};
-
-    byte foo {42};
-
-  }
-
-  namespace test_constexpr_if
-  {
-
-    template <bool cond>
-    int f ()
-    {
-      if constexpr(cond)
-      {
-        return 13;
-      }
-      else
-      {
-        return 42;
-      }
-    }
-
-  }
-
-  namespace test_selection_statement_with_initializer
-  {
-
-    int f()
-    {
-      return 13;
-    }
-
-    int f2()
-    {
-      if (auto i = f(); i > 0)
-      {
-        return 3;
-      }
-
-      switch (auto i = f(); i + 4)
-      {
-      case 17:
-        return 2;
-
-      default:
-        return 1;
-      }
-    }
-
-  }
-
-#if !defined(REALLY_CLANG)
-  namespace test_template_argument_deduction_for_class_templates
-  {
-
-    // TODO: test it with clang++ from git
-
-    template <typename T1, typename T2>
-    struct pair
-    {
-      pair (T1 p1, T2 p2)
-        : m1 {p1},
-          m2 {p2}
-      {}
-
-      T1 m1;
-      T2 m2;
-    };
-
-    void f()
-    {
-      [[maybe_unused]] auto p = pair{13, 42u};
-    }
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-  namespace test_non_type_auto_template_parameters
-  {
-
-    template <auto n>
-    struct B
-    {};
-
-    B<5> b1;
-    B<'a'> b2;
-
-  }
-
-#if !defined(REALLY_CLANG)
-  namespace test_structured_bindings
-  {
-
-    // TODO: test it with clang++ from git
-
-    int arr[2] = { 1, 2 };
-    std::pair<int, int> pr = { 1, 2 };
-
-    auto f1() -> int(&)[2]
-    {
-      return arr;
-    }
-
-    auto f2() -> std::pair<int, int>&
-    {
-      return pr;
-    }
-
-    struct S
-    {
-      int x1 : 2;
-      volatile double y1;
-    };
-
-    S f3()
-    {
-      return {};
-    }
-
-    auto [ x1, y1 ] = f1();
-    auto& [ xr1, yr1 ] = f1();
-    auto [ x2, y2 ] = f2();
-    auto& [ xr2, yr2 ] = f2();
-    const auto [ x3, y3 ] = f3();
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-#if !defined(REALLY_CLANG)
-  namespace test_exception_spec_type_system
-  {
-
-    // TODO: test it with clang++ from git
-
-    struct Good {};
-    struct Bad {};
-
-    void g1() noexcept;
-    void g2();
-
-    template<typename T>
-    Bad
-    f(T*, T*);
-
-    template<typename T1, typename T2>
-    Good
-    f(T1*, T2*);
-
-    static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
-
-  }
-#endif // !defined(REALLY_CLANG)
-
-  namespace test_inline_variables
-  {
-
-    template<class T> void f(T)
-    {}
-
-    template<class T> inline T g(T)
-    {
-      return T{};
-    }
-
-    template<> inline void f<>(int)
-    {}
-
-    template<> int g<>(int)
-    {
-      return 5;
-    }
-
-  }
-
-}  // namespace cxx17
-
-#endif  // __cplusplus <= 201402L
-
-]])
diff --git a/m4/ax_prog_cc_for_build.m4 b/m4/ax_prog_cc_for_build.m4
deleted file mode 100644
index 77fd346..0000000
--- a/m4/ax_prog_cc_for_build.m4
+++ /dev/null
@@ -1,125 +0,0 @@
-# ===========================================================================
-#   http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_PROG_CC_FOR_BUILD
-#
-# DESCRIPTION
-#
-#   This macro searches for a C compiler that generates native executables,
-#   that is a C compiler that surely is not a cross-compiler. This can be
-#   useful if you have to generate source code at compile-time like for
-#   example GCC does.
-#
-#   The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything
-#   needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).
-#   The value of these variables can be overridden by the user by specifying
-#   a compiler with an environment variable (like you do for standard CC).
-#
-#   It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object
-#   file extensions for the build platform, and GCC_FOR_BUILD to `yes' if
-#   the compiler we found is GCC. All these variables but GCC_FOR_BUILD are
-#   substituted in the Makefile.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 8
-
-AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
-AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_CPP])dnl
-AC_REQUIRE([AC_EXEEXT])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-
-dnl Use the standard macros, but make them use other variable names
-dnl
-pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
-pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
-pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
-pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
-pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
-pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
-pushdef([ac_cv_objext], ac_cv_build_objext)dnl
-pushdef([ac_exeext], ac_build_exeext)dnl
-pushdef([ac_objext], ac_build_objext)dnl
-pushdef([CC], CC_FOR_BUILD)dnl
-pushdef([CPP], CPP_FOR_BUILD)dnl
-pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
-pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
-pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
-pushdef([host], build)dnl
-pushdef([host_alias], build_alias)dnl
-pushdef([host_cpu], build_cpu)dnl
-pushdef([host_vendor], build_vendor)dnl
-pushdef([host_os], build_os)dnl
-pushdef([ac_cv_host], ac_cv_build)dnl
-pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
-pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
-pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
-pushdef([ac_cv_host_os], ac_cv_build_os)dnl
-pushdef([ac_cpp], ac_build_cpp)dnl
-pushdef([ac_compile], ac_build_compile)dnl
-pushdef([ac_link], ac_build_link)dnl
-
-save_cross_compiling=$cross_compiling
-save_ac_tool_prefix=$ac_tool_prefix
-cross_compiling=no
-ac_tool_prefix=
-
-AC_PROG_CC
-AC_PROG_CPP
-AC_EXEEXT
-
-ac_tool_prefix=$save_ac_tool_prefix
-cross_compiling=$save_cross_compiling
-
-dnl Restore the old definitions
-dnl
-popdef([ac_link])dnl
-popdef([ac_compile])dnl
-popdef([ac_cpp])dnl
-popdef([ac_cv_host_os])dnl
-popdef([ac_cv_host_vendor])dnl
-popdef([ac_cv_host_cpu])dnl
-popdef([ac_cv_host_alias])dnl
-popdef([ac_cv_host])dnl
-popdef([host_os])dnl
-popdef([host_vendor])dnl
-popdef([host_cpu])dnl
-popdef([host_alias])dnl
-popdef([host])dnl
-popdef([LDFLAGS])dnl
-popdef([CPPFLAGS])dnl
-popdef([CFLAGS])dnl
-popdef([CPP])dnl
-popdef([CC])dnl
-popdef([ac_objext])dnl
-popdef([ac_exeext])dnl
-popdef([ac_cv_objext])dnl
-popdef([ac_cv_exeext])dnl
-popdef([ac_cv_prog_cc_g])dnl
-popdef([ac_cv_prog_cc_cross])dnl
-popdef([ac_cv_prog_cc_works])dnl
-popdef([ac_cv_prog_gcc])dnl
-popdef([ac_cv_prog_CPP])dnl
-
-dnl Finally, set Makefile variables
-dnl
-BUILD_EXEEXT=$ac_build_exeext
-BUILD_OBJEXT=$ac_build_objext
-AC_SUBST(BUILD_EXEEXT)dnl
-AC_SUBST(BUILD_OBJEXT)dnl
-AC_SUBST([CFLAGS_FOR_BUILD])dnl
-AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
-AC_SUBST([LDFLAGS_FOR_BUILD])dnl
-])
diff --git a/m4/ax_prog_cxx_for_build.m4 b/m4/ax_prog_cxx_for_build.m4
deleted file mode 100644
index 8cc0f73..0000000
--- a/m4/ax_prog_cxx_for_build.m4
+++ /dev/null
@@ -1,110 +0,0 @@
-# ===========================================================================
-#   http://www.gnu.org/software/autoconf-archive/ax_prog_cxx_for_build.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_PROG_CXX_FOR_BUILD
-#
-# DESCRIPTION
-#
-#   This macro searches for a C++ compiler that generates native
-#   executables, that is a C++ compiler that surely is not a cross-compiler.
-#   This can be useful if you have to generate source code at compile-time
-#   like for example GCC does.
-#
-#   The macro sets the CXX_FOR_BUILD and CXXCPP_FOR_BUILD macros to anything
-#   needed to compile or link (CXX_FOR_BUILD) and preprocess
-#   (CXXCPP_FOR_BUILD). The value of these variables can be overridden by
-#   the user by specifying a compiler with an environment variable (like you
-#   do for standard CXX).
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
-#   Copyright (c) 2012 Avionic Design GmbH
-#
-#   Based on the AX_PROG_CC_FOR_BUILD macro by Paolo Bonzini.
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 2
-
-AU_ALIAS([AC_PROG_CXX_FOR_BUILD], [AX_PROG_CXX_FOR_BUILD])
-AC_DEFUN([AX_PROG_CXX_FOR_BUILD], [dnl
-AC_REQUIRE([AX_PROG_CC_FOR_BUILD])dnl
-AC_REQUIRE([AC_PROG_CXX])dnl
-AC_REQUIRE([AC_PROG_CXXCPP])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-
-dnl Use the standard macros, but make them use other variable names
-dnl
-pushdef([ac_cv_prog_CXXCPP], ac_cv_build_prog_CXXCPP)dnl
-pushdef([ac_cv_prog_gxx], ac_cv_build_prog_gxx)dnl
-pushdef([ac_cv_prog_cxx_works], ac_cv_build_prog_cxx_works)dnl
-pushdef([ac_cv_prog_cxx_cross], ac_cv_build_prog_cxx_cross)dnl
-pushdef([ac_cv_prog_cxx_g], ac_cv_build_prog_cxx_g)dnl
-pushdef([CXX], CXX_FOR_BUILD)dnl
-pushdef([CXXCPP], CXXCPP_FOR_BUILD)dnl
-pushdef([CXXFLAGS], CXXFLAGS_FOR_BUILD)dnl
-pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
-pushdef([CXXCPPFLAGS], CXXCPPFLAGS_FOR_BUILD)dnl
-pushdef([host], build)dnl
-pushdef([host_alias], build_alias)dnl
-pushdef([host_cpu], build_cpu)dnl
-pushdef([host_vendor], build_vendor)dnl
-pushdef([host_os], build_os)dnl
-pushdef([ac_cv_host], ac_cv_build)dnl
-pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
-pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
-pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
-pushdef([ac_cv_host_os], ac_cv_build_os)dnl
-pushdef([ac_cxxcpp], ac_build_cxxcpp)dnl
-pushdef([ac_compile], ac_build_compile)dnl
-pushdef([ac_link], ac_build_link)dnl
-
-save_cross_compiling=$cross_compiling
-save_ac_tool_prefix=$ac_tool_prefix
-cross_compiling=no
-ac_tool_prefix=
-
-AC_PROG_CXX
-AC_PROG_CXXCPP
-
-ac_tool_prefix=$save_ac_tool_prefix
-cross_compiling=$save_cross_compiling
-
-dnl Restore the old definitions
-dnl
-popdef([ac_link])dnl
-popdef([ac_compile])dnl
-popdef([ac_cxxcpp])dnl
-popdef([ac_cv_host_os])dnl
-popdef([ac_cv_host_vendor])dnl
-popdef([ac_cv_host_cpu])dnl
-popdef([ac_cv_host_alias])dnl
-popdef([ac_cv_host])dnl
-popdef([host_os])dnl
-popdef([host_vendor])dnl
-popdef([host_cpu])dnl
-popdef([host_alias])dnl
-popdef([host])dnl
-popdef([CXXCPPFLAGS])dnl
-popdef([CPPFLAGS])dnl
-popdef([CXXFLAGS])dnl
-popdef([CXXCPP])dnl
-popdef([CXX])dnl
-popdef([ac_cv_prog_cxx_g])dnl
-popdef([ac_cv_prog_cxx_cross])dnl
-popdef([ac_cv_prog_cxx_works])dnl
-popdef([ac_cv_prog_gxx])dnl
-popdef([ac_cv_prog_CXXCPP])dnl
-
-dnl Finally, set Makefile variables
-dnl
-AC_SUBST([CXXFLAGS_FOR_BUILD])dnl
-AC_SUBST([CXXCPPFLAGS_FOR_BUILD])dnl
-])
diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
deleted file mode 100644
index 1598d07..0000000
--- a/m4/ax_pthread.m4
+++ /dev/null
@@ -1,507 +0,0 @@
-# ===========================================================================
-#        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
-#
-# DESCRIPTION
-#
-#   This macro figures out how to build C programs using POSIX threads. It
-#   sets the PTHREAD_LIBS output variable to the threads library and linker
-#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler
-#   flags that are needed. (The user can also force certain compiler
-#   flags/libs to be tested by setting these environment variables.)
-#
-#   Also sets PTHREAD_CC to any special C compiler that is needed for
-#   multi-threaded programs (defaults to the value of CC otherwise). (This
-#   is necessary on AIX to use the special cc_r compiler alias.)
-#
-#   NOTE: You are assumed to not only compile your program with these flags,
-#   but also to link with them as well. For example, you might link with
-#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
-#
-#   If you are only building threaded programs, you may wish to use these
-#   variables in your default LIBS, CFLAGS, and CC:
-#
-#     LIBS="$PTHREAD_LIBS $LIBS"
-#     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-#     CC="$PTHREAD_CC"
-#
-#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
-#   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
-#   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
-#
-#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
-#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with
-#   PTHREAD_CFLAGS.
-#
-#   ACTION-IF-FOUND is a list of shell commands to run if a threads library
-#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
-#   is not found. If ACTION-IF-FOUND is not specified, the default action
-#   will define HAVE_PTHREAD.
-#
-#   Please let the authors know if this macro fails on any platform, or if
-#   you have any other suggestions or comments. This macro was based on work
-#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
-#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
-#   Alejandro Forero Cuervo to the autoconf macro repository. We are also
-#   grateful for the helpful feedback of numerous users.
-#
-#   Updated for Autoconf 2.68 by Daniel Richard G.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
-#   Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <https://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-#serial 27
-
-AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
-AC_DEFUN([AX_PTHREAD], [
-AC_REQUIRE([AC_CANONICAL_HOST])
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_PROG_SED])
-AC_LANG_PUSH([C])
-ax_pthread_ok=no
-
-# We used to check for pthread.h first, but this fails if pthread.h
-# requires special compiler flags (e.g. on Tru64 or Sequent).
-# It gets checked for in the link test anyway.
-
-# First of all, check if the user has set any of the PTHREAD_LIBS,
-# etcetera environment variables, and if threads linking works using
-# them:
-if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
-        ax_pthread_save_CC="$CC"
-        ax_pthread_save_CFLAGS="$CFLAGS"
-        ax_pthread_save_LIBS="$LIBS"
-        AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
-        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-        LIBS="$PTHREAD_LIBS $LIBS"
-        AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
-        AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
-        AC_MSG_RESULT([$ax_pthread_ok])
-        if test "x$ax_pthread_ok" = "xno"; then
-                PTHREAD_LIBS=""
-                PTHREAD_CFLAGS=""
-        fi
-        CC="$ax_pthread_save_CC"
-        CFLAGS="$ax_pthread_save_CFLAGS"
-        LIBS="$ax_pthread_save_LIBS"
-fi
-
-# We must check for the threads library under a number of different
-# names; the ordering is very important because some systems
-# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
-# libraries is broken (non-POSIX).
-
-# Create a list of thread flags to try. Items with a "," contain both
-# C compiler flags (before ",") and linker flags (after ","). Other items
-# starting with a "-" are C compiler flags, and remaining items are
-# library names, except for "none" which indicates that we try without
-# any flags at all, and "pthread-config" which is a program returning
-# the flags for the Pth emulation library.
-
-ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
-
-# The ordering *is* (sometimes) important.  Some notes on the
-# individual items follow:
-
-# pthreads: AIX (must check this before -lpthread)
-# none: in case threads are in libc; should be tried before -Kthread and
-#       other compiler flags to prevent continual compiler warnings
-# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
-# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
-#           (Note: HP C rejects this with "bad form for `-t' option")
-# -pthreads: Solaris/gcc (Note: HP C also rejects)
-# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
-#      doesn't hurt to check since this sometimes defines pthreads and
-#      -D_REENTRANT too), HP C (must be checked before -lpthread, which
-#      is present but should not be used directly; and before -mthreads,
-#      because the compiler interprets this as "-mt" + "-hreads")
-# -mthreads: Mingw32/gcc, Lynx/gcc
-# pthread: Linux, etcetera
-# --thread-safe: KAI C++
-# pthread-config: use pthread-config program (for GNU Pth library)
-
-case $host_os in
-
-        freebsd*)
-
-        # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
-        # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
-
-        ax_pthread_flags="-kthread lthread $ax_pthread_flags"
-        ;;
-
-        hpux*)
-
-        # From the cc(1) man page: "[-mt] Sets various -D flags to enable
-        # multi-threading and also sets -lpthread."
-
-        ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
-        ;;
-
-        openedition*)
-
-        # IBM z/OS requires a feature-test macro to be defined in order to
-        # enable POSIX threads at all, so give the user a hint if this is
-        # not set. (We don't define these ourselves, as they can affect
-        # other portions of the system API in unpredictable ways.)
-
-        AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
-            [
-#            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
-             AX_PTHREAD_ZOS_MISSING
-#            endif
-            ],
-            [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
-        ;;
-
-        solaris*)
-
-        # On Solaris (at least, for some versions), libc contains stubbed
-        # (non-functional) versions of the pthreads routines, so link-based
-        # tests will erroneously succeed. (N.B.: The stubs are missing
-        # pthread_cleanup_push, or rather a function called by this macro,
-        # so we could check for that, but who knows whether they'll stub
-        # that too in a future libc.)  So we'll check first for the
-        # standard Solaris way of linking pthreads (-mt -lpthread).
-
-        ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
-        ;;
-esac
-
-# Are we compiling with Clang?
-
-AC_CACHE_CHECK([whether $CC is Clang],
-    [ax_cv_PTHREAD_CLANG],
-    [ax_cv_PTHREAD_CLANG=no
-     # Note that Autoconf sets GCC=yes for Clang as well as GCC
-     if test "x$GCC" = "xyes"; then
-        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
-            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
-#            if defined(__clang__) && defined(__llvm__)
-             AX_PTHREAD_CC_IS_CLANG
-#            endif
-            ],
-            [ax_cv_PTHREAD_CLANG=yes])
-     fi
-    ])
-ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
-
-
-# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
-
-# Note that for GCC and Clang -pthread generally implies -lpthread,
-# except when -nostdlib is passed.
-# This is problematic using libtool to build C++ shared libraries with pthread:
-# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
-# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
-# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
-# To solve this, first try -pthread together with -lpthread for GCC
-
-AS_IF([test "x$GCC" = "xyes"],
-      [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
-
-# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
-
-AS_IF([test "x$ax_pthread_clang" = "xyes"],
-      [ax_pthread_flags="-pthread,-lpthread -pthread"])
-
-
-# The presence of a feature test macro requesting re-entrant function
-# definitions is, on some systems, a strong hint that pthreads support is
-# correctly enabled
-
-case $host_os in
-        darwin* | hpux* | linux* | osf* | solaris*)
-        ax_pthread_check_macro="_REENTRANT"
-        ;;
-
-        aix*)
-        ax_pthread_check_macro="_THREAD_SAFE"
-        ;;
-
-        *)
-        ax_pthread_check_macro="--"
-        ;;
-esac
-AS_IF([test "x$ax_pthread_check_macro" = "x--"],
-      [ax_pthread_check_cond=0],
-      [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
-
-
-if test "x$ax_pthread_ok" = "xno"; then
-for ax_pthread_try_flag in $ax_pthread_flags; do
-
-        case $ax_pthread_try_flag in
-                none)
-                AC_MSG_CHECKING([whether pthreads work without any flags])
-                ;;
-
-                *,*)
-                PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
-                PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
-                AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
-                ;;
-
-                -*)
-                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
-                PTHREAD_CFLAGS="$ax_pthread_try_flag"
-                ;;
-
-                pthread-config)
-                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
-                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
-                PTHREAD_CFLAGS="`pthread-config --cflags`"
-                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
-                ;;
-
-                *)
-                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
-                PTHREAD_LIBS="-l$ax_pthread_try_flag"
-                ;;
-        esac
-
-        ax_pthread_save_CFLAGS="$CFLAGS"
-        ax_pthread_save_LIBS="$LIBS"
-        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-        LIBS="$PTHREAD_LIBS $LIBS"
-
-        # Check for various functions.  We must include pthread.h,
-        # since some functions may be macros.  (On the Sequent, we
-        # need a special flag -Kthread to make this header compile.)
-        # We check for pthread_join because it is in -lpthread on IRIX
-        # while pthread_create is in libc.  We check for pthread_attr_init
-        # due to DEC craziness with -lpthreads.  We check for
-        # pthread_cleanup_push because it is one of the few pthread
-        # functions on Solaris that doesn't have a non-functional libc stub.
-        # We try pthread_create on general principles.
-
-        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
-#                       if $ax_pthread_check_cond
-#                        error "$ax_pthread_check_macro must be defined"
-#                       endif
-                        static void *some_global = NULL;
-                        static void routine(void *a)
-                          {
-                             /* To avoid any unused-parameter or
-                                unused-but-set-parameter warning.  */
-                             some_global = a;
-                          }
-                        static void *start_routine(void *a) { return a; }],
-                       [pthread_t th; pthread_attr_t attr;
-                        pthread_create(&th, 0, start_routine, 0);
-                        pthread_join(th, 0);
-                        pthread_attr_init(&attr);
-                        pthread_cleanup_push(routine, 0);
-                        pthread_cleanup_pop(0) /* ; */])],
-            [ax_pthread_ok=yes],
-            [])
-
-        CFLAGS="$ax_pthread_save_CFLAGS"
-        LIBS="$ax_pthread_save_LIBS"
-
-        AC_MSG_RESULT([$ax_pthread_ok])
-        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
-
-        PTHREAD_LIBS=""
-        PTHREAD_CFLAGS=""
-done
-fi
-
-
-# Clang needs special handling, because older versions handle the -pthread
-# option in a rather... idiosyncratic way
-
-if test "x$ax_pthread_clang" = "xyes"; then
-
-        # Clang takes -pthread; it has never supported any other flag
-
-        # (Note 1: This will need to be revisited if a system that Clang
-        # supports has POSIX threads in a separate library.  This tends not
-        # to be the way of modern systems, but it's conceivable.)
-
-        # (Note 2: On some systems, notably Darwin, -pthread is not needed
-        # to get POSIX threads support; the API is always present and
-        # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
-        # -pthread does define _REENTRANT, and while the Darwin headers
-        # ignore this macro, third-party headers might not.)
-
-        # However, older versions of Clang make a point of warning the user
-        # that, in an invocation where only linking and no compilation is
-        # taking place, the -pthread option has no effect ("argument unused
-        # during compilation").  They expect -pthread to be passed in only
-        # when source code is being compiled.
-        #
-        # Problem is, this is at odds with the way Automake and most other
-        # C build frameworks function, which is that the same flags used in
-        # compilation (CFLAGS) are also used in linking.  Many systems
-        # supported by AX_PTHREAD require exactly this for POSIX threads
-        # support, and in fact it is often not straightforward to specify a
-        # flag that is used only in the compilation phase and not in
-        # linking.  Such a scenario is extremely rare in practice.
-        #
-        # Even though use of the -pthread flag in linking would only print
-        # a warning, this can be a nuisance for well-run software projects
-        # that build with -Werror.  So if the active version of Clang has
-        # this misfeature, we search for an option to squash it.
-
-        AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
-            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
-            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
-             # Create an alternate version of $ac_link that compiles and
-             # links in two steps (.c -> .o, .o -> exe) instead of one
-             # (.c -> exe), because the warning occurs only in the second
-             # step
-             ax_pthread_save_ac_link="$ac_link"
-             ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
-             ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
-             ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
-             ax_pthread_save_CFLAGS="$CFLAGS"
-             for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
-                AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
-                CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
-                ac_link="$ax_pthread_save_ac_link"
-                AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
-                    [ac_link="$ax_pthread_2step_ac_link"
-                     AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
-                         [break])
-                    ])
-             done
-             ac_link="$ax_pthread_save_ac_link"
-             CFLAGS="$ax_pthread_save_CFLAGS"
-             AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
-             ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
-            ])
-
-        case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
-                no | unknown) ;;
-                *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
-        esac
-
-fi # $ax_pthread_clang = yes
-
-
-
-# Various other checks:
-if test "x$ax_pthread_ok" = "xyes"; then
-        ax_pthread_save_CFLAGS="$CFLAGS"
-        ax_pthread_save_LIBS="$LIBS"
-        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
-        LIBS="$PTHREAD_LIBS $LIBS"
-
-        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
-        AC_CACHE_CHECK([for joinable pthread attribute],
-            [ax_cv_PTHREAD_JOINABLE_ATTR],
-            [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
-             for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
-                 AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
-                                                 [int attr = $ax_pthread_attr; return attr /* ; */])],
-                                [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
-                                [])
-             done
-            ])
-        AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
-               test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
-               test "x$ax_pthread_joinable_attr_defined" != "xyes"],
-              [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
-                                  [$ax_cv_PTHREAD_JOINABLE_ATTR],
-                                  [Define to necessary symbol if this constant
-                                   uses a non-standard name on your system.])
-               ax_pthread_joinable_attr_defined=yes
-              ])
-
-        AC_CACHE_CHECK([whether more special flags are required for pthreads],
-            [ax_cv_PTHREAD_SPECIAL_FLAGS],
-            [ax_cv_PTHREAD_SPECIAL_FLAGS=no
-             case $host_os in
-             solaris*)
-             ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
-             ;;
-             esac
-            ])
-        AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
-               test "x$ax_pthread_special_flags_added" != "xyes"],
-              [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
-               ax_pthread_special_flags_added=yes])
-
-        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
-            [ax_cv_PTHREAD_PRIO_INHERIT],
-            [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
-                                             [[int i = PTHREAD_PRIO_INHERIT;
-                                               return i;]])],
-                            [ax_cv_PTHREAD_PRIO_INHERIT=yes],
-                            [ax_cv_PTHREAD_PRIO_INHERIT=no])
-            ])
-        AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
-               test "x$ax_pthread_prio_inherit_defined" != "xyes"],
-              [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
-               ax_pthread_prio_inherit_defined=yes
-              ])
-
-        CFLAGS="$ax_pthread_save_CFLAGS"
-        LIBS="$ax_pthread_save_LIBS"
-
-        # More AIX lossage: compile with *_r variant
-        if test "x$GCC" != "xyes"; then
-            case $host_os in
-                aix*)
-                AS_CASE(["x/$CC"],
-                    [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
-                    [#handle absolute path differently from PATH based program lookup
-                     AS_CASE(["x$CC"],
-                         [x/*],
-                         [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
-                         [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
-                ;;
-            esac
-        fi
-fi
-
-test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
-
-AC_SUBST([PTHREAD_LIBS])
-AC_SUBST([PTHREAD_CFLAGS])
-AC_SUBST([PTHREAD_CC])
-
-# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
-if test "x$ax_pthread_ok" = "xyes"; then
-        ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
-        :
-else
-        ax_pthread_ok=no
-        $2
-fi
-AC_LANG_POP
-])dnl AX_PTHREAD
diff --git a/m4/stl_hash.m4 b/m4/stl_hash.m4
deleted file mode 100644
index d7def1a..0000000
--- a/m4/stl_hash.m4
+++ /dev/null
@@ -1,71 +0,0 @@
-# We check two things: where the include file is for
-# unordered_map/hash_map (we prefer the first form), and what
-# namespace unordered/hash_map lives in within that include file.  We
-# include AC_TRY_COMPILE for all the combinations we've seen in the
-# wild.  We define HASH_MAP_H to the location of the header file, and
-# HASH_NAMESPACE to the namespace the class (unordered_map or
-# hash_map) is in.
-
-# This also checks if unordered map exists.
-AC_DEFUN([AC_CXX_STL_HASH],
-  [
-   AC_MSG_CHECKING(the location of hash_map)
-   AC_LANG_SAVE
-   AC_LANG_CPLUSPLUS
-   ac_cv_cxx_hash_map=""
-   # First try unordered_map, but not on gcc's before 4.2 -- I've
-   # seen unexplainable unordered_map bugs with -O2 on older gcc's.
-   AC_TRY_COMPILE([#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
-                   # error GCC too old for unordered_map
-                   #endif
-                   ],
-                   [/* no program body necessary */],
-                   [stl_hash_old_gcc=no],
-                   [stl_hash_old_gcc=yes])
-   for location in unordered_map tr1/unordered_map; do
-     for namespace in std std::tr1; do
-       if test -z "$ac_cv_cxx_hash_map" -a "$stl_hash_old_gcc" != yes; then
-         # Some older gcc's have a buggy tr1, so test a bit of code.
-         AC_TRY_COMPILE([#include <$location>],
-                        [const ${namespace}::unordered_map<int, int> t;
-                         return t.find(5) == t.end();],
-                        [ac_cv_cxx_hash_map="<$location>";
-                         ac_cv_cxx_hash_namespace="$namespace";
-                         ac_cv_cxx_hash_map_class="unordered_map";])
-       fi
-     done
-   done
-   # Now try hash_map
-   for location in ext/hash_map hash_map; do
-     for namespace in __gnu_cxx "" std stdext; do
-       if test -z "$ac_cv_cxx_hash_map"; then
-         AC_TRY_COMPILE([#include <$location>],
-                        [${namespace}::hash_map<int, int> t],
-                        [ac_cv_cxx_hash_map="<$location>";
-                         ac_cv_cxx_hash_namespace="$namespace";
-                         ac_cv_cxx_hash_map_class="hash_map";])
-       fi
-     done
-   done
-   ac_cv_cxx_hash_set=`echo "$ac_cv_cxx_hash_map" | sed s/map/set/`;
-   ac_cv_cxx_hash_set_class=`echo "$ac_cv_cxx_hash_map_class" | sed s/map/set/`;
-   if test -n "$ac_cv_cxx_hash_map"; then
-      AC_DEFINE(HAVE_HASH_MAP, 1, [define if the compiler has hash_map])
-      AC_DEFINE(HAVE_HASH_SET, 1, [define if the compiler has hash_set])
-      AC_DEFINE_UNQUOTED(HASH_MAP_H,$ac_cv_cxx_hash_map,
-                         [the location of <unordered_map> or <hash_map>])
-      AC_DEFINE_UNQUOTED(HASH_SET_H,$ac_cv_cxx_hash_set,
-                         [the location of <unordered_set> or <hash_set>])
-      AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace,
-                         [the namespace of hash_map/hash_set])
-      AC_DEFINE_UNQUOTED(HASH_MAP_CLASS,$ac_cv_cxx_hash_map_class,
-                         [the name of <hash_map>])
-      AC_DEFINE_UNQUOTED(HASH_SET_CLASS,$ac_cv_cxx_hash_set_class,
-                         [the name of <hash_set>])
-      AC_MSG_RESULT([$ac_cv_cxx_hash_map])
-   else
-      AC_MSG_RESULT()
-      AC_MSG_WARN([could not find an STL hash_map])
-   fi
-])
-
diff --git a/maven_install.json b/maven_install.json
index 9c5860a..1a938af 100644
--- a/maven_install.json
+++ b/maven_install.json
@@ -1,24 +1,251 @@
 {
     "dependency_tree": {
         "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
-        "__INPUT_ARTIFACTS_HASH": -228414992,
-        "__RESOLVED_ARTIFACTS_HASH": -722345565,
+        "__INPUT_ARTIFACTS_HASH": 579287445,
+        "__RESOLVED_ARTIFACTS_HASH": -1248440885,
         "conflict_resolution": {
-            "com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.11.0",
-            "junit:junit:4.12": "junit:junit:4.13.2"
+            "com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.11.0"
         },
         "dependencies": [
             {
-                "coord": "com.google.auto.value:auto-value-annotations:1.7.4",
+                "coord": "com.google.auto.value:auto-value-annotations:1.8.1",
                 "dependencies": [],
                 "directDependencies": [],
-                "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar",
+                "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar",
                 "mirror_urls": [
-                    "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar",
-                    "https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
+                    "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar"
                 ],
-                "sha256": "fedd59b0b4986c342f6ab2d182f2a4ee9fceb2c7e2d5bdc4dc764c92394a23d3",
-                "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
+                "sha256": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852",
+                "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar"
+            },
+            {
+                "coord": "com.google.caliper:caliper-api:1.0-beta-3",
+                "dependencies": [
+                    "com.google.guava:guava:31.1-jre",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "directDependencies": [
+                    "com.google.guava:guava:31.1-jre",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar"
+                ],
+                "sha256": "374f0c6c0c1f8784cb69d885e1dcbb7498c34ca20369e0597264568530642928",
+                "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-api/1.0-beta-3/caliper-api-1.0-beta-3.jar"
+            },
+            {
+                "coord": "com.google.caliper:caliper-core:1.0-beta-3",
+                "dependencies": [
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.code.gson:gson:2.8.9",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "com.squareup.okio:okio:1.6.0",
+                    "javax.inject:javax.inject:1",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "directDependencies": [
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar"
+                ],
+                "sha256": "514deac8f8b09dd4262733e0a4406a333208c899dc7ea726b03600b9bb94f192",
+                "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-core/1.0-beta-3/caliper-core-1.0-beta-3.jar"
+            },
+            {
+                "coord": "com.google.caliper:caliper-runner:1.0-beta-3",
+                "dependencies": [
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.code.gson:gson:2.8.9",
+                    "com.google.dagger:dagger-producers:2.22.1",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "com.squareup.okio:okio:1.6.0",
+                    "javax.inject:javax.inject:1",
+                    "joda-time:joda-time:2.10.10",
+                    "org.checkerframework:checker-compat-qual:2.5.3"
+                ],
+                "directDependencies": [
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.dagger:dagger-producers:2.22.1",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar"
+                ],
+                "sha256": "3ab58890aa01343361adedf859500d280f67813df0cedfcd165b169533b9b1fa",
+                "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-runner/1.0-beta-3/caliper-runner-1.0-beta-3.jar"
+            },
+            {
+                "coord": "com.google.caliper:caliper-util:1.0-beta-3",
+                "dependencies": [
+                    "com.google.code.gson:gson:2.8.9",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "javax.inject:javax.inject:1",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "directDependencies": [
+                    "com.google.code.gson:gson:2.8.9",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar"
+                ],
+                "sha256": "6e9af500c7020450dfdb5003d09501d512d395f431c54c7ee8f79e712463fe66",
+                "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-util/1.0-beta-3/caliper-util-1.0-beta-3.jar"
+            },
+            {
+                "coord": "com.google.caliper:caliper-worker-jvm:1.0-beta-3",
+                "dependencies": [
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.caliper:caliper-worker:1.0-beta-3",
+                    "com.google.code.gson:gson:2.8.9",
+                    "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "com.squareup.okio:okio:1.6.0",
+                    "com.sun.jersey:jersey-client:1.19.4",
+                    "com.sun.jersey:jersey-core:1.19.4",
+                    "javax.annotation:javax.annotation-api:1.3.2",
+                    "javax.inject:javax.inject:1",
+                    "javax.ws.rs:jsr311-api:1.1.1",
+                    "joda-time:joda-time:2.10.10",
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-commons:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm-util:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "directDependencies": [
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-worker:1.0-beta-3",
+                    "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.sun.jersey:jersey-client:1.19.4"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar"
+                ],
+                "sha256": "e14e1ecfdf939c82abdb902105be41ff3f83c18cb968116232015f2662d065a4",
+                "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker-jvm/1.0-beta-3/caliper-worker-jvm-1.0-beta-3.jar"
+            },
+            {
+                "coord": "com.google.caliper:caliper-worker:1.0-beta-3",
+                "dependencies": [
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.code.gson:gson:2.8.9",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "com.squareup.okio:okio:1.6.0",
+                    "javax.inject:javax.inject:1",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "directDependencies": [
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "joda-time:joda-time:2.10.10"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar"
+                ],
+                "sha256": "315d8e51df1f60551645a0e3bf2c504d2c79762f688e6f728eb9d1d9cd9a491b",
+                "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper-worker/1.0-beta-3/caliper-worker-1.0-beta-3.jar"
+            },
+            {
+                "coord": "com.google.caliper:caliper:1.0-beta-3",
+                "dependencies": [
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
+                    "com.google.caliper:caliper-api:1.0-beta-3",
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-runner:1.0-beta-3",
+                    "com.google.caliper:caliper-util:1.0-beta-3",
+                    "com.google.caliper:caliper-worker-jvm:1.0-beta-3",
+                    "com.google.caliper:caliper-worker:1.0-beta-3",
+                    "com.google.code.gson:gson:2.8.9",
+                    "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+                    "com.google.dagger:dagger-producers:2.22.1",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.squareup.okhttp:okhttp:2.7.5",
+                    "com.squareup.okio:okio:1.6.0",
+                    "com.sun.jersey:jersey-client:1.19.4",
+                    "com.sun.jersey:jersey-core:1.19.4",
+                    "javax.annotation:javax.annotation-api:1.3.2",
+                    "javax.inject:javax.inject:1",
+                    "javax.ws.rs:jsr311-api:1.1.1",
+                    "joda-time:joda-time:2.10.10",
+                    "org.checkerframework:checker-compat-qual:2.5.3",
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-commons:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm-util:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "directDependencies": [
+                    "com.google.caliper:caliper-core:1.0-beta-3",
+                    "com.google.caliper:caliper-runner:1.0-beta-3",
+                    "com.google.caliper:caliper-worker-jvm:1.0-beta-3",
+                    "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.sun.jersey:jersey-client:1.19.4"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar"
+                ],
+                "sha256": "d54e1bfdbe9359a79e175c217b8d472555cf20da9c5c0a18bdb1ea7db979ed8e",
+                "url": "https://repo1.maven.org/maven2/com/google/caliper/caliper/1.0-beta-3/caliper-1.0-beta-3.jar"
             },
             {
                 "coord": "com.google.code.findbugs:jsr305:3.0.2",
@@ -45,6 +272,72 @@
                 "url": "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar"
             },
             {
+                "coord": "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0",
+                "dependencies": [
+                    "com.google.guava:guava:31.1-jre",
+                    "javax.annotation:javax.annotation-api:1.3.2",
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-commons:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm-util:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "directDependencies": [
+                    "com.google.guava:guava:31.1-jre",
+                    "javax.annotation:javax.annotation-api:1.3.2",
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-commons:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm-util:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar"
+                ],
+                "sha256": "1ef5535a8bd41cf3072469f381b9ee6ab28275311a7499f53d6e52adf976fef0",
+                "url": "https://repo1.maven.org/maven2/com/google/code/java-allocation-instrumenter/java-allocation-instrumenter/3.3.0/java-allocation-instrumenter-3.3.0.jar"
+            },
+            {
+                "coord": "com.google.dagger:dagger-producers:2.22.1",
+                "dependencies": [
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "javax.inject:javax.inject:1",
+                    "org.checkerframework:checker-compat-qual:2.5.3"
+                ],
+                "directDependencies": [
+                    "com.google.dagger:dagger:2.22.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "javax.inject:javax.inject:1",
+                    "org.checkerframework:checker-compat-qual:2.5.3"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar"
+                ],
+                "sha256": "f834a0082014213a68ff06a0f048d750178d02196c58b0b15beb367d32b97e35",
+                "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.22.1/dagger-producers-2.22.1.jar"
+            },
+            {
+                "coord": "com.google.dagger:dagger:2.22.1",
+                "dependencies": [
+                    "javax.inject:javax.inject:1"
+                ],
+                "directDependencies": [
+                    "javax.inject:javax.inject:1"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar",
+                    "https://repo.maven.apache.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar"
+                ],
+                "sha256": "329d4340f24c4f5717af016c097e90668bfea2a5376e6aa9964b01cef3fd241a",
+                "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.22.1/dagger-2.22.1.jar"
+            },
+            {
                 "coord": "com.google.errorprone:error_prone_annotations:2.11.0",
                 "dependencies": [],
                 "directDependencies": [],
@@ -150,7 +443,7 @@
             {
                 "coord": "com.google.truth:truth:1.1.2",
                 "dependencies": [
-                    "com.google.auto.value:auto-value-annotations:1.7.4",
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
                     "com.google.errorprone:error_prone_annotations:2.11.0",
                     "com.google.guava:guava:31.1-jre",
                     "junit:junit:4.13.2",
@@ -158,7 +451,7 @@
                     "org.ow2.asm:asm:9.0"
                 ],
                 "directDependencies": [
-                    "com.google.auto.value:auto-value-annotations:1.7.4",
+                    "com.google.auto.value:auto-value-annotations:1.8.1",
                     "com.google.errorprone:error_prone_annotations:2.11.0",
                     "com.google.guava:guava:31.1-jre",
                     "junit:junit:4.13.2",
@@ -174,6 +467,115 @@
                 "url": "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.2/truth-1.1.2.jar"
             },
             {
+                "coord": "com.squareup.okhttp:okhttp:2.7.5",
+                "dependencies": [
+                    "com.squareup.okio:okio:1.6.0"
+                ],
+                "directDependencies": [
+                    "com.squareup.okio:okio:1.6.0"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar",
+                    "https://repo.maven.apache.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar"
+                ],
+                "sha256": "88ac9fd1bb51f82bcc664cc1eb9c225c90dc4389d660231b4cc737bebfe7d0aa",
+                "url": "https://repo1.maven.org/maven2/com/squareup/okhttp/okhttp/2.7.5/okhttp-2.7.5.jar"
+            },
+            {
+                "coord": "com.squareup.okio:okio:1.6.0",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar",
+                    "https://repo.maven.apache.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar"
+                ],
+                "sha256": "114bdc1f47338a68bcbc95abf2f5cdc72beeec91812f2fcd7b521c1937876266",
+                "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.6.0/okio-1.6.0.jar"
+            },
+            {
+                "coord": "com.sun.jersey:jersey-client:1.19.4",
+                "dependencies": [
+                    "com.sun.jersey:jersey-core:1.19.4",
+                    "javax.ws.rs:jsr311-api:1.1.1"
+                ],
+                "directDependencies": [
+                    "com.sun.jersey:jersey-core:1.19.4"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar",
+                    "https://repo.maven.apache.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar"
+                ],
+                "sha256": "639c825c5db580f8115bf49ffc893093526d2ed1079fbc929b6a5fbd0b2eda40",
+                "url": "https://repo1.maven.org/maven2/com/sun/jersey/jersey-client/1.19.4/jersey-client-1.19.4.jar"
+            },
+            {
+                "coord": "com.sun.jersey:jersey-core:1.19.4",
+                "dependencies": [
+                    "javax.ws.rs:jsr311-api:1.1.1"
+                ],
+                "directDependencies": [
+                    "javax.ws.rs:jsr311-api:1.1.1"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar",
+                    "https://repo.maven.apache.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar"
+                ],
+                "sha256": "64b03198e0264849d0fc341857ebcc9c882b1909a2dc35a0972fe7d901b826e5",
+                "url": "https://repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.19.4/jersey-core-1.19.4.jar"
+            },
+            {
+                "coord": "javax.annotation:javax.annotation-api:1.3.2",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
+                    "https://repo.maven.apache.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
+                ],
+                "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b",
+                "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
+            },
+            {
+                "coord": "javax.inject:javax.inject:1",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",
+                    "https://repo.maven.apache.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar"
+                ],
+                "sha256": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff",
+                "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar"
+            },
+            {
+                "coord": "javax.ws.rs:jsr311-api:1.1.1",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar",
+                    "https://repo.maven.apache.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar"
+                ],
+                "sha256": "ab1534b73b5fa055808e6598a5e73b599ccda28c3159c3c0908977809422ee4a",
+                "url": "https://repo1.maven.org/maven2/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar"
+            },
+            {
+                "coord": "joda-time:joda-time:2.10.10",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar",
+                    "https://repo.maven.apache.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar"
+                ],
+                "sha256": "dd8e7c92185a678d1b7b933f31209b6203c8ffa91e9880475a1be0346b9617e3",
+                "url": "https://repo1.maven.org/maven2/joda-time/joda-time/2.10.10/joda-time-2.10.10.jar"
+            },
+            {
                 "coord": "junit:junit:4.13.2",
                 "dependencies": [
                     "org.hamcrest:hamcrest-core:1.3"
@@ -214,6 +616,18 @@
                 "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.12.7/byte-buddy-1.12.7.jar"
             },
             {
+                "coord": "org.checkerframework:checker-compat-qual:2.5.3",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar",
+                    "https://repo.maven.apache.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar"
+                ],
+                "sha256": "d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d",
+                "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.3/checker-compat-qual-2.5.3.jar"
+            },
+            {
                 "coord": "org.checkerframework:checker-qual:3.12.0",
                 "dependencies": [],
                 "directDependencies": [],
@@ -270,6 +684,79 @@
                 "url": "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.jar"
             },
             {
+                "coord": "org.ow2.asm:asm-analysis:7.2",
+                "dependencies": [
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "directDependencies": [
+                    "org.ow2.asm:asm-tree:7.2"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar",
+                    "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar"
+                ],
+                "sha256": "be922aae60ff1ff1768e8e6544a38a7f92bd0a6d6b0b9791f94955d1bd453de2",
+                "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/7.2/asm-analysis-7.2.jar"
+            },
+            {
+                "coord": "org.ow2.asm:asm-commons:7.2",
+                "dependencies": [
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "directDependencies": [
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar",
+                    "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar"
+                ],
+                "sha256": "0e86b8b179c5fb223d1a880a0ff4960b6978223984b94e62e71135f2d8ea3558",
+                "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/7.2/asm-commons-7.2.jar"
+            },
+            {
+                "coord": "org.ow2.asm:asm-tree:7.2",
+                "dependencies": [
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "directDependencies": [
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar",
+                    "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar"
+                ],
+                "sha256": "c063f5a67fa03cdc9bd79fd1c2ea6816cc4a19473ecdfbd9e9153b408c6f2656",
+                "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/7.2/asm-tree-7.2.jar"
+            },
+            {
+                "coord": "org.ow2.asm:asm-util:7.2",
+                "dependencies": [
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "directDependencies": [
+                    "org.ow2.asm:asm-analysis:7.2",
+                    "org.ow2.asm:asm-tree:7.2",
+                    "org.ow2.asm:asm:9.0"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar",
+                    "https://repo.maven.apache.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar"
+                ],
+                "sha256": "6e24913b021ffacfe8e7e053d6e0ccc731941148cfa078d4f1ed3d96904530f8",
+                "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/7.2/asm-util-7.2.jar"
+            },
+            {
                 "coord": "org.ow2.asm:asm:9.0",
                 "dependencies": [],
                 "directDependencies": [],
diff --git a/objectivec/BUILD.bazel b/objectivec/BUILD.bazel
index c18788f..153894f 100644
--- a/objectivec/BUILD.bazel
+++ b/objectivec/BUILD.bazel
@@ -1,5 +1,6 @@
 load("@rules_cc//cc:defs.bzl", "objc_library")
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//conformance:defs.bzl", "conformance_test")
 
 objc_library(
     name = "objectivec",
@@ -90,6 +91,20 @@
     visibility = ["//visibility:public"],
 )
 
+################################################################################
+# Tests
+################################################################################
+
+conformance_test(
+    name = "conformance_test",
+    failure_list = "//conformance:failure_list_objc.txt",
+    testee = "//conformance:conformance_objc",
+)
+
+################################################################################
+# Distribution files
+################################################################################
+
 pkg_files(
     name = "dist_files",
     srcs = glob([
diff --git a/objectivec/DevTools/compile_testing_protos.sh b/objectivec/DevTools/compile_testing_protos.sh
index 69c32f9..eb43cae 100755
--- a/objectivec/DevTools/compile_testing_protos.sh
+++ b/objectivec/DevTools/compile_testing_protos.sh
@@ -89,7 +89,8 @@
 # Move to the top of the protobuf directories and ensure there is a protoc
 # binary to use.
 cd "${SRCROOT}/.."
-[[ -x src/protoc ]] || \
+readonly PROTOC="bazel-bin/protoc"
+[[ -x $PROTOC ]] || \
   die "Could not find the protoc binary; make sure you have built it (objectivec/DevTools/full_mac_build.sh -h)."
 
 # -----------------------------------------------------------------------------
@@ -120,7 +121,7 @@
   readonly NewestInput=$(find \
      src/google/protobuf/*.proto \
      objectivec/Tests/*.proto \
-     src/.libs src/*.la src/protoc \
+     src/.libs src/*.la $PROTOC \
      objectivec/DevTools/compile_testing_protos.sh \
         -type f -print0 \
         | xargs -0 stat -f "%m %N" \
@@ -152,7 +153,7 @@
 # -----------------------------------------------------------------------------
 # Helper to invoke protoc
 compile_protos() {
-  src/protoc                                   \
+  $PROTOC                                  \
     --objc_out="${OUTPUT_DIR}/google/protobuf" \
     --proto_path=src/google/protobuf/          \
     --proto_path=src                           \
diff --git a/objectivec/DevTools/full_mac_build.sh b/objectivec/DevTools/full_mac_build.sh
index 0e183f2..0af0e40 100755
--- a/objectivec/DevTools/full_mac_build.sh
+++ b/objectivec/DevTools/full_mac_build.sh
@@ -8,6 +8,7 @@
 # Some base locations.
 readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")
 readonly ProtoRootDir="${ScriptDir}/../.."
+readonly BazelFlags="-k --test_output=streamed --macos_minimum_os=10.9"
 
 printUsage() {
   NAME=$(basename "${0}")
@@ -24,8 +25,6 @@
          Show this message
    -c, --clean
          Issue a clean before the normal build.
-   -a, --autogen
-         Start by rerunning autogen & configure.
    -r, --regenerate-descriptors
          Run generate_descriptor_proto.sh to regenerate all the checked in
          proto sources.
@@ -60,25 +59,7 @@
   echo "========================================================================"
 }
 
-# Thanks to libtool, builds can fail in odd ways and since it eats some output
-# it can be hard to spot, so force error output if make exits with a non zero.
-wrapped_make() {
-  set +e  # Don't stop if the command fails.
-  make $*
-  MAKE_EXIT_STATUS=$?
-  if [ ${MAKE_EXIT_STATUS} -ne 0 ]; then
-    echo "Error: 'make $*' exited with status ${MAKE_EXIT_STATUS}"
-    exit ${MAKE_EXIT_STATUS}
-  fi
-  set -e
-}
-
-NUM_MAKE_JOBS=$(/usr/sbin/sysctl -n hw.ncpu)
-if [[ "${NUM_MAKE_JOBS}" -lt 2 ]] ; then
-  NUM_MAKE_JOBS=2
-fi
-
-DO_AUTOGEN=no
+NUM_JOBS=auto
 DO_CLEAN=no
 REGEN_DESCRIPTORS=no
 CORE_ONLY=no
@@ -98,15 +79,12 @@
     -c | --clean )
       DO_CLEAN=yes
       ;;
-    -a | --autogen )
-      DO_AUTOGEN=yes
-      ;;
     -r | --regenerate-descriptors )
       REGEN_DESCRIPTORS=yes
       ;;
     -j | --jobs )
       shift
-      NUM_MAKE_JOBS="${1}"
+      NUM_JOBS="${1}"
       ;;
     --core-only )
       CORE_ONLY=yes
@@ -154,21 +132,9 @@
 # Into the proto dir.
 cd "${ProtoRootDir}"
 
-# if no Makefile, force the autogen.
-if [[ ! -f Makefile ]] ; then
-  DO_AUTOGEN=yes
-fi
-
-if [[ "${DO_AUTOGEN}" == "yes" ]] ; then
-  header "Running autogen & configure"
-  ./autogen.sh
-  ./configure \
-    CPPFLAGS="-mmacosx-version-min=10.9 -Wunused-const-variable -Wunused-function"
-fi
-
 if [[ "${DO_CLEAN}" == "yes" ]] ; then
   header "Cleaning"
-  wrapped_make clean
+  bazel clean
   if [[ "${DO_XCODE_IOS_TESTS}" == "yes" ]] ; then
     XCODEBUILD_CLEAN_BASE_IOS=(
       xcodebuild
@@ -212,26 +178,23 @@
 
 if [[ "${REGEN_DESCRIPTORS}" == "yes" ]] ; then
   header "Regenerating the descriptor sources."
-  ./generate_descriptor_proto.sh -j "${NUM_MAKE_JOBS}"
+  ./generate_descriptor_proto.sh -j "${NUM_JOBS}"
 fi
 
 if [[ "${CORE_ONLY}" == "yes" ]] ; then
   header "Building core Only"
-  wrapped_make -j "${NUM_MAKE_JOBS}"
+  bazel build //:protoc //:protobuf //:protobuf_lite -j "${NUM_JOBS}" $BazelFlags
 else
   header "Building"
   # Can't issue these together, when fully parallel, something sometimes chokes
   # at random.
-  wrapped_make -j "${NUM_MAKE_JOBS}" all
-  wrapped_make -j "${NUM_MAKE_JOBS}" check
+  bazel test //src/... $BazelFlags
   # Fire off the conformance tests also.
-  cd conformance
-  wrapped_make -j "${NUM_MAKE_JOBS}" test_cpp
-  cd ..
+  bazel test //objectivec:conformance_test $BazelFlags
 fi
 
 # Ensure the WKT sources checked in are current.
-objectivec/generate_well_known_types.sh --check-only -j "${NUM_MAKE_JOBS}"
+objectivec/generate_well_known_types.sh --check-only -j "${NUM_JOBS}"
 
 header "Checking on the ObjC Runtime Code"
 # Some of the kokoro machines don't have python3 yet, so fall back to python if need be.
@@ -295,7 +258,7 @@
           -disable-concurrent-destination-testing
       )
       ;;
-    11.* | 12.* | 13.*)
+    11.* | 12.* | 13.* | 14.*)
       # Dropped 32bit as Apple doesn't seem support the simulators either.
       XCODEBUILD_TEST_BASE_IOS+=(
           -destination "platform=iOS Simulator,name=iPhone 8,OS=latest" # 64bit
@@ -391,9 +354,7 @@
 
 if [[ "${DO_OBJC_CONFORMANCE_TESTS}" == "yes" ]] ; then
   header "Running ObjC Conformance Tests"
-  cd conformance
-  wrapped_make -j "${NUM_MAKE_JOBS}" test_objc
-  cd ..
+  bazel test //objectivec:conformance_test $BazelFlags
 fi
 
 echo ""
diff --git a/objectivec/README.md b/objectivec/README.md
index f2c2a84..25e6b23 100644
--- a/objectivec/README.md
+++ b/objectivec/README.md
@@ -25,7 +25,7 @@
 
      $ objectivec/DevTools/full_mac_build.sh
 
-This will generate the `src/protoc` binary.
+This will generate the `protoc` binary.
 
 Building
 --------
diff --git a/objectivec/generate_well_known_types.sh b/objectivec/generate_well_known_types.sh
index e6c9b04..10b2a10 100755
--- a/objectivec/generate_well_known_types.sh
+++ b/objectivec/generate_well_known_types.sh
@@ -4,7 +4,7 @@
 # the protocol compiler changes.
 
 # HINT:  Flags passed to generate_well_known_types.sh will be passed directly
-#   to make when building protoc.  This is particularly useful for passing
+#   to bazel when building protoc.  This is particularly useful for passing
 #   -j4 to run 4 jobs simultaneously.
 
 set -eu
@@ -30,18 +30,10 @@
   exit 1
 fi
 
-if [[ ! -e src/Makefile ]]; then
-  cat >&2 << __EOF__
-Could not find src/Makefile.  You must run ./configure (and perhaps
-./autogen.sh) first.
-__EOF__
-  exit 1
-fi
-
 # Make sure the compiler is current.
-cd src
-make $@ protoc
+bazel build $@ //:protoc
 
+cd src
 declare -a RUNTIME_PROTO_FILES=( \
   google/protobuf/any.proto \
   google/protobuf/api.proto \
@@ -59,7 +51,7 @@
 # Generate to a temp directory to see if they match.
 TMP_DIR=$(mktemp -d)
 trap "rm -rf ${TMP_DIR}" EXIT
-./protoc --objc_out="${TMP_DIR}" ${RUNTIME_PROTO_FILES[@]}
+${ProtoRootDir}/bazel-bin/protoc --objc_out="${TMP_DIR}" ${RUNTIME_PROTO_FILES[@]}
 
 DID_COPY=0
 for PROTO_FILE in "${RUNTIME_PROTO_FILES[@]}"; do
diff --git a/php/BUILD.bazel b/php/BUILD.bazel
index dfb0976..28b085a 100644
--- a/php/BUILD.bazel
+++ b/php/BUILD.bazel
@@ -3,19 +3,103 @@
 # See also code generation logic under /src/google/protobuf/compiler/php.
 
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:internal_shell.bzl", "inline_sh_binary")
+load("//conformance:defs.bzl", "conformance_test")
+
+filegroup(
+    name = "source_files",
+    visibility = [
+        "//benchmarks/php:__pkg__",
+        "//conformance:__pkg__",
+        "//php:__pkg__",
+    ],
+    srcs = glob([
+        "ext/google/protobuf/*.h",
+        "ext/google/protobuf/*.c",
+        "src/GPBMetadata/Google/Protobuf/**/*.php",
+        "src/Google/Protobuf/**/*.php",
+    ]) + [
+        "composer.json",
+        "ext/google/protobuf/wkt.inc",
+        "ext/google/protobuf/config.m4",
+        "ext/google/protobuf/package.xml",
+    ],
+)
+
+################################################################################
+# PHP Extension
+################################################################################
+
+inline_sh_binary(
+    name = "build_extension",
+    cmd = """
+        mkdir -p php/ext/google/protobuf/third_party/utf8_range
+        cp third_party/utf8_range/* php/ext/google/protobuf/third_party/utf8_range
+
+        pushd  php/ext/google/protobuf
+        phpize
+        ./configure --with-php-config=$$(which php-config)
+        make
+        popd
+    """,
+)
+
+genrule(
+    name = "extension",
+    srcs = [
+        ":source_files",
+        "//third_party/utf8_range:all_files",
+    ],
+    tools = [":build_extension"],
+    outs = ["protobuf.so"],
+    cmd = """
+        ./$(execpath :build_extension) $@
+        cp php/ext/google/protobuf/modules/protobuf.so $(OUTS)
+    """,
+    visibility = ["//visibility:public"],
+)
+
+################################################################################
+# Tests
+################################################################################
+
+conformance_test(
+    name = "conformance_test",
+    failure_list = "//conformance:failure_list_php.txt",
+    testee = "//conformance:conformance_php",
+    text_format_failure_list = "//conformance:text_format_failure_list_php.txt",
+    target_compatible_with = select({
+        "@platforms//os:osx": ["@platforms//:incompatible"],
+        "//conditions:default": [],
+    }),
+)
+
+conformance_test(
+    name = "conformance_test_c",
+    failure_list = "//conformance:failure_list_php_c.txt",
+    testee = "//conformance:conformance_php_c",
+    text_format_failure_list = "//conformance:text_format_failure_list_php.txt",
+    target_compatible_with = select({
+        "@platforms//os:osx": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
+)
+
+################################################################################
+# Distribution files
+################################################################################
 
 pkg_files(
     name = "dist_files",
     srcs = glob([
         "ext/google/protobuf/**/*",
-        "src/GPBMetadata/Google/Protobuf/**/*.php",
-        "src/Google/Protobuf/**/*.php",
         "tests/*.php",
         "tests/*.sh",
         "tests/generated_previous/**/*.php",
         "tests/proto/**/*.proto",
         "tests/proto_previous/*.proto",
     ]) + [
+        ":source_files",
         "BUILD.bazel",
         "README.md",
         "REFCOUNTING.md",
diff --git a/php/README.md b/php/README.md
index c4292cf..775fbc8 100644
--- a/php/README.md
+++ b/php/README.md
@@ -26,8 +26,6 @@
 #### Prerequirements
 
 To install the c extension, the following tools are needed:
-* autoconf
-* automake
 * libtool
 * make
 * gcc
@@ -36,7 +34,7 @@
 
 On Ubuntu, you can install them with:
 ```
-sudo apt-get install -y php-pear php5-dev autoconf automake libtool make gcc
+sudo apt-get install -y php-pear php-dev libtool make gcc
 ```
 On other platforms, please use the corresponding package managing tool to
 install them before proceeding.
@@ -98,24 +96,18 @@
 
 ## Development
 
-### Docker Image
-
-We provide a docker image for php development, which is also used in our automatic tests:
-```
-docker run --security-opt seccomp=unconfined -it protobuftesting/php_8dbe419c6df1a8b3af0ae3a267c112efb436b45c
-```
-
 ### Test Native PHP
 
 ```
+# Install Dependencies (Linux)
+apt-get install bazel composer php-dev
+
 # Download protobuf
 git clone https://github.com/protocolbuffers/protobuf.git
 cd protobuf
 
 # Build protoc
-./autogen.sh
-./configure
-make -j4
+bazel build :protoc
 
 # Test native php
 cd php
diff --git a/php/generate_descriptor_protos.sh b/php/generate_descriptor_protos.sh
index 9feaa96..2239312 100755
--- a/php/generate_descriptor_protos.sh
+++ b/php/generate_descriptor_protos.sh
@@ -5,6 +5,12 @@
 
 set -e
 
+PROTOC=protoc
+if [ ! -f $PROTOC ]; then
+  bazel build -c opt //:protoc
+  PROTOC=bazel-bin/protoc
+fi
+
 if test ! -e src/google/protobuf/stubs/common.h; then
   cat >&2 << __EOF__
 Could not find source code.  Make sure you are running this script from the
@@ -13,17 +19,16 @@
   exit 1
 fi
 
-pushd src
-./protoc --php_out=internal:../php/src google/protobuf/descriptor.proto
-./protoc --php_out=internal_generate_c_wkt:../php/src \
-  google/protobuf/any.proto \
-  google/protobuf/api.proto \
-  google/protobuf/duration.proto \
-  google/protobuf/empty.proto \
-  google/protobuf/field_mask.proto \
-  google/protobuf/source_context.proto \
-  google/protobuf/struct.proto \
-  google/protobuf/type.proto \
-  google/protobuf/timestamp.proto \
-  google/protobuf/wrappers.proto
+$PROTOC --php_out=internal:php/src google/protobuf/descriptor.proto
+$PROTOC --php_out=internal_generate_c_wkt:php/src \
+  src/google/protobuf/any.proto \
+  src/google/protobuf/api.proto \
+  src/google/protobuf/duration.proto \
+  src/google/protobuf/empty.proto \
+  src/google/protobuf/field_mask.proto \
+  src/google/protobuf/source_context.proto \
+  src/google/protobuf/struct.proto \
+  src/google/protobuf/type.proto \
+  src/google/protobuf/timestamp.proto \
+  src/google/protobuf/wrappers.proto
 popd
diff --git a/php/generate_test_protos.sh b/php/generate_test_protos.sh
index 8607499..565c7ec 100755
--- a/php/generate_test_protos.sh
+++ b/php/generate_test_protos.sh
@@ -2,19 +2,15 @@
 
 set -ex
 
-cd `dirname $0`
+cd `dirname $0`/..
 
-if ../src/protoc --help > /dev/null; then
-  PROTOC=src/protoc
-else
-  # Bazel seems to be creating a problematic symlink in
-  # _build/out/external/com_google_protobuf, so we remove the _build directory
-  # before building protoc.
-  (cd .. && bazel build -c opt :protoc)
-  PROTOC=bazel-bin/protoc
+PROTOC=$(pwd)/protoc
+if [ ! -f $PROTOC ]; then
+  bazel build -c opt //:protoc
+  PROTOC=$(pwd)/bazel-bin/protoc
 fi
 
-if [[ -d tmp && -z $(find tests/proto ../$PROTOC -newer tmp) ]]; then
+if [[ -d php/tmp && -z $(find php/tests/proto $PROTOC -newer php/tmp) ]]; then
   # Generated protos are already present and up to date, so we can skip protoc.
   #
   # Protoc is very fast, but sometimes it is not available (like if we haven't
@@ -23,10 +19,9 @@
   exit 0
 fi
 
-rm -rf tmp
-mkdir -p tmp
+rm -rf php/tmp
+mkdir -p php/tmp
 
-cd ..
 find php/tests/proto -type f -name "*.proto"| xargs $PROTOC --php_out=php/tmp -Isrc -Iphp/tests
 
 if [ "$1" = "--aggregate_metadata" ]; then
diff --git a/php/tests/compatibility_test.sh b/php/tests/compatibility_test.sh
deleted file mode 100755
index 7e44cce..0000000
--- a/php/tests/compatibility_test.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/bin/bash
-
-function generate_proto() {
-  PROTOC1=$1
-  PROTOC2=$2
-
-  rm -rf generated
-  mkdir generated
-
-  $PROTOC1 --php_out=generated proto/test_include.proto
-  $PROTOC2 --php_out=generated                 \
-    -I../../src -I.                            \
-    proto/empty/echo.proto                     \
-    proto/test.proto                           \
-    proto/test_no_namespace.proto              \
-    proto/test_prefix.proto                    \
-    proto/test_php_namespace.proto             \
-    proto/test_empty_php_namespace.proto       \
-    proto/test_reserved_enum_lower.proto       \
-    proto/test_reserved_enum_upper.proto       \
-    proto/test_reserved_enum_value_lower.proto \
-    proto/test_reserved_enum_value_upper.proto \
-    proto/test_reserved_message_lower.proto    \
-    proto/test_reserved_message_upper.proto    \
-    proto/test_service.proto                   \
-    proto/test_service_namespace.proto         \
-    proto/test_wrapper_type_setters.proto      \
-    proto/test_descriptors.proto
-
-  pushd ../../src
-  $PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto
-  popd
-}
-
-# Remove tests to expect error. These were added to API tests by mistake.
-function remove_error_test() {
-  local TEMPFILE=`tempfile`
-  cat $1 | \
-  awk -v file=`basename $1` -v dir=`basename $(dirname $1)` '
-    BEGIN {
-      show = 1
-    }
-    /@expectedException PHPUnit_Framework_Error/ { show = 0; next; }
-    / *\*\//                                     { print; next; }
-    / *}/ {
-      if (!show) {
-        show = 1;
-        next;
-      }
-    }
-    show { print }
-  ' > $TEMPFILE
-  cp $TEMPFILE $1
-}
-
-set -ex
-
-# Change to the script's directory.
-cd $(dirname $0)
-
-OLD_VERSION=$1
-OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/$OLD_VERSION/protoc-$OLD_VERSION-linux-x86_64.exe
-
-# Extract the latest protobuf version number.
-VERSION_NUMBER=`grep "PHP_PROTOBUF_VERSION" ../ext/google/protobuf/protobuf.h | sed "s|#define PHP_PROTOBUF_VERSION \"\(.*\)\"|\1|"`
-
-echo "Running compatibility tests between current $VERSION_NUMBER and released $OLD_VERSION"
-
-# Check protoc
-[ -f ../../src/protoc ] || {
-  echo "[ERROR]: Please build protoc first."
-  exit 1
-}
-
-# Download old test.
-rm -rf protobuf
-git clone https://github.com/protocolbuffers/protobuf.git
-pushd protobuf
-git checkout v$OLD_VERSION
-popd
-
-# Build and copy the new runtime
-pushd ../ext/google/protobuf
-make clean || true
-phpize && ./configure && make
-popd
-
-rm -rf protobuf/php/ext
-rm -rf protobuf/php/src
-cp -r ../ext protobuf/php/ext/
-cp -r ../src protobuf/php/src/
-
-# Download old version protoc compiler (for linux)
-wget $OLD_VERSION_PROTOC -O old_protoc
-chmod +x old_protoc
-
-NEW_PROTOC=`pwd`/../../src/protoc
-OLD_PROTOC=`pwd`/old_protoc
-cd protobuf/php
-composer install
-
-# Remove implementation detail tests.
-# TODO(teboring): Temporarily disable encode_decode_test.php. In 3.13.0-rc1,
-# repeated primitive field encoding is changed to packed, which is a bug fix.
-# However, this fails the compatibility test which hard coded old encoding.
-# Will re-enable the test after making a release. After the version bump, the
-# compatibility test will use the updated test code.
-tests=( array_test.php generated_class_test.php map_field_test.php well_known_test.php )
-sed -i.bak '/php_implementation_test.php/d' phpunit.xml
-sed -i.bak '/generated_phpdoc_test.php/d' phpunit.xml
-sed -i.bak '/encode_decode_test.php/d' phpunit.xml
-sed -i.bak 's/generated_phpdoc_test.php//g' tests/test.sh
-sed -i.bak 's/generated_service_test.php//g' tests/test.sh
-sed -i.bak 's/encode_decode_test.php//g' tests/test.sh
-sed -i.bak '/memory_leak_test.php/d' tests/test.sh
-sed -i.bak '/^    public function testTimestamp()$/,/^    }$/d' tests/well_known_test.php
-sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/array_test.php
-sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/map_field_test.php
-sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/test_base.php
-for t in "${tests[@]}"
-do
-  remove_error_test tests/$t
-done
-
-cd tests
-
-# Test A.1:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use old version
-generate_proto $OLD_PROTOC $OLD_PROTOC
-./test.sh
-pushd ..
-./vendor/bin/phpunit
-popd
-
-# Test A.2:
-#   proto set 1: use new version
-#   proto set 2 which may import protos in set 1: use old version
-generate_proto $NEW_PROTOC $OLD_PROTOC
-./test.sh
-pushd ..
-./vendor/bin/phpunit
-popd
-
-# Test A.3:
-#   proto set 1: use old version
-#   proto set 2 which may import protos in set 1: use new version
-generate_proto $OLD_PROTOC $NEW_PROTOC
-./test.sh
-pushd ..
-./vendor/bin/phpunit
-popd
diff --git a/pkg/BUILD.bazel b/pkg/BUILD.bazel
index dd31f7d..6f35175 100644
--- a/pkg/BUILD.bazel
+++ b/pkg/BUILD.bazel
@@ -7,7 +7,7 @@
     "strip_prefix",
 )
 load("//:protobuf_release.bzl", "package_naming")
-load(":build_systems.bzl", "gen_automake_file_lists", "gen_file_lists")
+load(":build_systems.bzl", "gen_file_lists")
 load(":cc_dist_library.bzl", "cc_dist_library")
 
 package_naming(
@@ -92,6 +92,7 @@
         "//build_defs:dist_files",
         "//conformance:all_dist_files",
         "//src:all_dist_files",
+        "//third_party/utf8_range:dist_files",
         "@com_google_protobuf_examples//:dist_files",
     ],
 )
@@ -334,26 +335,6 @@
     },
 )
 
-gen_automake_file_lists(
-    name = "gen_automake_extra_dist_lists",
-    testonly = 1,
-    out = "extra_dist_file_lists.am",
-    src_libs = {
-        # source rule: name in generated file
-        "//:common_dist_files": "dist_common",
-        "//conformance:dist_files": "dist_conformance",
-        "//benchmarks:all_dist_files": "dist_benchmark",
-        "@com_google_protobuf_examples//:dist_files": "dist_example",
-        "//:csharp_dist_files": "dist_csharp",
-        "//csharp:dist_files": "dist_csharp2",
-        "//:objectivec_dist_files": "dist_objectivec",
-        "//objectivec:dist_files": "dist_objectivec2",
-        "//php:dist_files": "dist_php",
-        "//python:dist_files": "dist_python",
-        "//ruby:dist_files": "dist_ruby",
-    },
-)
-
 ################################################################################
 # Protobuf runtime libraries.
 ################################################################################
diff --git a/pkg/build_systems.bzl b/pkg/build_systems.bzl
index 40bdaad..cb8ad11 100644
--- a/pkg/build_systems.bzl
+++ b/pkg/build_systems.bzl
@@ -14,17 +14,10 @@
         source_prefix = "${protobuf_SOURCE_DIR}/",
         **kwargs
     )
-    gen_automake_file_lists(
-        name = name + "_automake",
-        out = out_stem + ".am",
-        source_prefix = "$(top_srcdir)/",
-        **kwargs
-    )
     native.filegroup(
         name = name,
         srcs = [
             out_stem + ".cmake",
-            out_stem + ".am",
         ],
     )
 
@@ -331,75 +324,3 @@
         ),
     ),
 )
-
-################################################################################
-# Automake source lists generation
-################################################################################
-
-def _automake_var_fragment(owner, varname, prefix, entries):
-    """Returns a single variable assignment fragment (Automake syntax).
-
-    Args:
-      owner: Label, the rule that owns these srcs.
-      varname: str, the var name to set.
-      prefix: str, prefix to prepend to each of `entries`.
-      entries: [str], the entries in the list.
-
-    Returns:
-      A string.
-    """
-    if len(entries) == 0:
-        # A backslash followed by a blank line is illegal. We still want
-        # to emit the variable, though.
-        return "# {owner}\n{varname} =\n".format(
-            owner = owner,
-            varname = varname,
-        )
-    fragment = (
-        "# {owner}\n" +
-        "{varname} = \\\n" +
-        "{entries}"
-    ).format(
-        owner = owner,
-        varname = varname,
-        entries = " \\\n".join(["  %s%s" % (prefix, f) for f in entries]),
-    )
-    return fragment.rstrip("\\ ") + "\n"
-
-def _automake_file_list_impl(ctx):
-    _create_file_list_impl(ctx, _automake_var_fragment)
-
-gen_automake_file_lists = rule(
-    doc = """
-Generates an Automake-syntax file with lists of files.
-
-The generated file defines variables with lists of files from `srcs`. The
-intent is for these files to be included from a non-generated Makefile.am
-file which actually defines the libraries based on these lists.
-
-For C++ rules, the following are generated:
-    {libname}_srcs: contains srcs.
-    {libname}_hdrs: contains hdrs and textual_hdrs.
-
-For proto_library, the following are generated:
-    {libname}_proto_srcs: contains the srcs from the `proto_library` rule.
-    {libname}_srcs: contains syntesized paths for generated C++ sources.
-    {libname}_hdrs: contains syntesized paths for generated C++ headers.
-
-""",
-    implementation = _automake_file_list_impl,
-    attrs = dict(
-        _source_list_common_attrs.items(),
-        _header = attr.string(
-            default = """\
-# Auto-generated by %s
-#
-# This file contains lists of sources based on Bazel rules. It should
-# be included from a hand-written Makefile.am that defines targets.
-#
-# Changes to this file will be overwritten based on Bazel definitions.
-
-""",
-        ),
-    ),
-)
diff --git a/post_process_dist.sh b/post_process_dist.sh
deleted file mode 100755
index 2630f97..0000000
--- a/post_process_dist.sh
+++ /dev/null
@@ -1,64 +0,0 @@
-#! /bin/sh
-
-# This script takes the result of "make dist" and:
-# 1) Unpacks it.
-# 2) Ensures all contents are user-writable.  Some version control systems
-#    keep code read-only until you explicitly ask to edit it, and the normal
-#    "make dist" process does not correct for this, so the result is that
-#    the entire dist is still marked read-only when unpacked, which is
-#    annoying.  So, we fix it.
-# 3) Convert MSVC project files to MSVC 2005, so that anyone who has version
-#    2005 *or* 2008 can open them.  (In version control, we keep things in
-#    MSVC 2008 format since that's what we use in development.)
-# 4) Uses the result to create .tar.gz, .tar.bz2, and .zip versions and
-#    deposits them in the "dist" directory.  In the .zip version, all
-#    non-testdata .txt files are converted to Windows-style line endings.
-# 5) Cleans up after itself.
-
-if [ "$1" == "" ]; then
-  echo "USAGE:  $0 DISTFILE" >&2
-  exit 1
-fi
-
-if [ ! -e $1 ]; then
-  echo $1": File not found." >&2
-  exit 1
-fi
-
-set -ex
-
-LANGUAGES="cpp csharp java objectivec python ruby php all"
-BASENAME=`basename $1 .tar.gz`
-VERSION=${BASENAME:9}
-
-# Create a directory called "dist", copy the tarball there and unpack it.
-mkdir dist
-cp $1 dist
-cd dist
-tar zxvf $BASENAME.tar.gz
-rm $BASENAME.tar.gz
-
-# Set the entire contents to be user-writable.
-chmod -R u+w $BASENAME
-cd $BASENAME
-
-for LANG in $LANGUAGES; do
-  # Build the dist again in .tar.gz
-  ./configure DIST_LANG=$LANG
-  make dist-gzip
-  mv $BASENAME.tar.gz ../protobuf-$LANG-$VERSION.tar.gz
-done
-
-# Convert all text files to use DOS-style line endings, then build a .zip
-# distribution.
-todos *.txt */*.txt
-
-for LANG in $LANGUAGES; do
-  # Build the dist again in .zip
-  ./configure DIST_LANG=$LANG
-  make dist-zip
-  mv $BASENAME.zip ../protobuf-$LANG-$VERSION.zip
-done
-
-cd ..
-rm -rf $BASENAME
diff --git a/protobuf-lite.pc.in b/protobuf-lite.pc.in
deleted file mode 100644
index f92e4ad..0000000
--- a/protobuf-lite.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Protocol Buffers
-Description: Google's Data Interchange Format
-Version: @VERSION@
-Libs: -L${libdir} -lprotobuf-lite
-Cflags: -I${includedir}
-Conflicts: protobuf
diff --git a/protobuf.bzl b/protobuf.bzl
index 243341d..2cb1cdd 100644
--- a/protobuf.bzl
+++ b/protobuf.bzl
@@ -1,5 +1,6 @@
 load("@bazel_skylib//lib:versions.bzl", "versions")
-load("@rules_cc//cc:defs.bzl", "cc_library")
+load("@bazel_skylib//lib:collections.bzl", "collections")
+load("@rules_cc//cc:defs.bzl", "cc_library", "objc_library")
 load("@rules_proto//proto:defs.bzl", "ProtoInfo")
 load("@rules_python//python:defs.bzl", "py_library", "py_test")
 
@@ -37,20 +38,23 @@
         return _GetPath(ctx, ctx.attr.includes[0])
     return _GetPath(ctx, ctx.label.package + "/" + ctx.attr.includes[0])
 
-def _CcHdrs(srcs, use_grpc_plugin = False):
-    ret = [s[:-len(".proto")] + ".pb.h" for s in srcs]
-    if use_grpc_plugin:
-        ret += [s[:-len(".proto")] + ".grpc.pb.h" for s in srcs]
-    return ret
+def _ObjcBase(srcs):
+    return [
+        "".join([token.capitalize() for token in src[:-len(".proto")].split("_")])
+    for src in srcs]
 
-def _CcSrcs(srcs, use_grpc_plugin = False):
-    ret = [s[:-len(".proto")] + ".pb.cc" for s in srcs]
-    if use_grpc_plugin:
-        ret += [s[:-len(".proto")] + ".grpc.pb.cc" for s in srcs]
-    return ret
+def _ObjcHdrs(srcs):
+    return[src + ".pbobjc.h" for src in _ObjcBase(srcs)]
 
-def _CcOuts(srcs, use_grpc_plugin = False):
-    return _CcHdrs(srcs, use_grpc_plugin) + _CcSrcs(srcs, use_grpc_plugin)
+def _ObjcSrcs(srcs):
+    return[src + ".pbobjc.m" for src in _ObjcBase(srcs)]
+
+def _ObjcOuts(srcs, out_type):
+    if out_type == "hdrs":
+        return _ObjcHdrs(srcs)
+    if out_type == "srcs":
+        return _ObjcSrcs(srcs)
+    return _ObjcHdrs(srcs) + _ObjcSrcs(srcs)
 
 def _PyOuts(srcs, use_grpc_plugin = False):
     ret = [s[:-len(".proto")] + "_pb2.py" for s in srcs]
@@ -58,6 +62,14 @@
         ret += [s[:-len(".proto")] + "_pb2_grpc.py" for s in srcs]
     return ret
 
+def _RubyOuts(srcs):
+    return [s[:-len(".proto")] + "_pb.rb" for s in srcs]
+
+def _CsharpOuts(srcs):
+    return [
+        "".join([token.capitalize() for token in src[:-len(".proto")].split("_")]) + ".cs"
+    for src in srcs]
+
 ProtoGenInfo = provider(
     fields = ["srcs", "import_flags", "deps"],
 )
@@ -65,6 +77,8 @@
 def _proto_gen_impl(ctx):
     """General implementation for generating protos"""
     srcs = ctx.files.srcs
+    langs = ctx.attr.langs or []
+    out_type = ctx.attr.out_type
     deps = depset(direct = ctx.files.srcs)
     source_dir = _SourceDir(ctx)
     gen_dir = _GenDir(ctx).rstrip("/")
@@ -81,6 +95,10 @@
     if has_generated:
         import_flags += ["-I" + gen_dir]
 
+    if ctx.attr.includes:
+        for include in ctx.attr.includes:
+            import_flags += ["-I"+_GetPath(ctx,include)]
+
     import_flags = depset(direct = import_flags)
 
     for dep in ctx.attr.deps:
@@ -99,7 +117,7 @@
         else:
             deps = depset(transitive = [deps, dep_proto.deps])
 
-    if not ctx.attr.gen_cc and not ctx.attr.gen_py and not ctx.executable.plugin:
+    if not langs and not ctx.executable.plugin:
         return [
             ProtoGenInfo(
                 srcs = srcs,
@@ -119,16 +137,24 @@
                 path = f.replace("-I", "")
                 import_flags_real.append("-I$(realpath -s %s)" % path)
 
-        outs = []
         use_grpc_plugin = (ctx.attr.plugin_language == "grpc" and ctx.attr.plugin)
         path_tpl = "$(realpath %s)" if in_gen_dir else "%s"
-        if ctx.attr.gen_cc:
-            args += [("--cpp_out=" + path_tpl) % gen_dir]
-            outs.extend(_CcOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
-        if ctx.attr.gen_py:
-            args += [("--python_out=" + path_tpl) % gen_dir]
-            outs.extend(_PyOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
 
+        outs = []
+        for lang in langs:
+            if lang == "csharp":
+                outs.extend(_CsharpOuts([src.basename]))
+            elif lang == "objc":
+                outs.extend(_ObjcOuts([src.basename], out_type = out_type))
+            elif lang == "python":
+                outs.extend(_PyOuts([src.basename], use_grpc_plugin = use_grpc_plugin))
+            elif lang == "ruby":
+                outs.extend(_RubyOuts([src.basename]))
+            # Otherwise, rely on user-supplied outs.
+            args += [("--%s_out=" + path_tpl) % (lang, gen_dir)]
+
+        if ctx.attr.outs:
+            outs.extend(ctx.attr.outs)
         outs = [ctx.actions.declare_file(out, sibling = src) for out in outs]
         generated_files.extend(outs)
 
@@ -193,7 +219,29 @@
         DefaultInfo(files = depset(generated_files)),
     ]
 
-proto_gen = rule(
+"""Generates codes from Protocol Buffers definitions.
+
+This rule helps you to implement Skylark macros specific to the target
+language. You should prefer more specific `cc_proto_library `,
+`py_proto_library` and others unless you are adding such wrapper macros.
+
+Args:
+  srcs: Protocol Buffers definition files (.proto) to run the protocol compiler
+    against.
+  deps: a list of dependency labels; must be other proto libraries.
+  includes: a list of include paths to .proto files.
+  protoc: the label of the protocol compiler to generate the sources.
+  plugin: the label of the protocol compiler plugin to be passed to the protocol
+    compiler.
+  plugin_language: the language of the generated sources
+  plugin_options: a list of options to be passed to the plugin
+  langs: generates sources in addition to the ones from the plugin for each
+    specified language.
+  outs: a list of labels of the expected outputs from the protocol compiler.
+  out_type: only generated a single type of source file for languages that have
+    split sources (e.g. *.h and *.cc in C++)
+"""
+_proto_gen = rule(
     attrs = {
         "srcs": attr.label_list(allow_files = True),
         "deps": attr.label_list(providers = [ProtoGenInfo]),
@@ -211,124 +259,15 @@
         ),
         "plugin_language": attr.string(),
         "plugin_options": attr.string_list(),
-        "gen_cc": attr.bool(),
-        "gen_py": attr.bool(),
-        "outs": attr.label_list(),
+        "langs": attr.string_list(),
+        "outs": attr.string_list(),
+        "out_type": attr.string(
+            default = "all"
+        ),
     },
     output_to_genfiles = True,
     implementation = _proto_gen_impl,
 )
-"""Generates codes from Protocol Buffers definitions.
-
-This rule helps you to implement Skylark macros specific to the target
-language. You should prefer more specific `cc_proto_library `,
-`py_proto_library` and others unless you are adding such wrapper macros.
-
-Args:
-  srcs: Protocol Buffers definition files (.proto) to run the protocol compiler
-    against.
-  deps: a list of dependency labels; must be other proto libraries.
-  includes: a list of include paths to .proto files.
-  protoc: the label of the protocol compiler to generate the sources.
-  plugin: the label of the protocol compiler plugin to be passed to the protocol
-    compiler.
-  plugin_language: the language of the generated sources
-  plugin_options: a list of options to be passed to the plugin
-  gen_cc: generates C++ sources in addition to the ones from the plugin.
-  gen_py: generates Python sources in addition to the ones from the plugin.
-  outs: a list of labels of the expected outputs from the protocol compiler.
-"""
-
-def _adapt_proto_library_impl(ctx):
-    deps = [dep[ProtoInfo] for dep in ctx.attr.deps]
-
-    srcs = [src for dep in deps for src in dep.direct_sources]
-    return struct(
-        proto = struct(
-            srcs = srcs,
-            import_flags = ["-I{}".format(path) for dep in deps for path in dep.transitive_proto_path.to_list()],
-            deps = srcs,
-        ),
-    )
-
-adapt_proto_library = rule(
-    implementation = _adapt_proto_library_impl,
-    attrs = {
-        "deps": attr.label_list(
-            mandatory = True,
-            providers = [ProtoInfo],
-        ),
-    },
-    doc = "Adapts `proto_library` from `@rules_proto` to be used with `{cc,py}_proto_library` from this file.",
-)
-
-def cc_proto_library(
-        name,
-        srcs = [],
-        deps = [],
-        cc_libs = [],
-        include = None,
-        protoc = "@com_google_protobuf//:protoc",
-        use_grpc_plugin = False,
-        default_runtime = "@com_google_protobuf//:protobuf",
-        **kargs):
-    """Bazel rule to create a C++ protobuf library from proto source files
-
-    NOTE: the rule is only an internal workaround to generate protos. The
-    interface may change and the rule may be removed when bazel has introduced
-    the native rule.
-
-    Args:
-      name: the name of the cc_proto_library.
-      srcs: the .proto files of the cc_proto_library.
-      deps: a list of dependency labels; must be cc_proto_library.
-      cc_libs: a list of other cc_library targets depended by the generated
-          cc_library.
-      include: a string indicating the include path of the .proto files.
-      protoc: the label of the protocol compiler to generate the sources.
-      use_grpc_plugin: a flag to indicate whether to call the grpc C++ plugin
-          when processing the proto files.
-      default_runtime: the implicitly default runtime which will be depended on by
-          the generated cc_library target.
-      **kargs: other keyword arguments that are passed to cc_library.
-    """
-
-    includes = []
-    if include != None:
-        includes = [include]
-
-    grpc_cpp_plugin = None
-    if use_grpc_plugin:
-        grpc_cpp_plugin = "//external:grpc_cpp_plugin"
-
-    gen_srcs = _CcSrcs(srcs, use_grpc_plugin)
-    gen_hdrs = _CcHdrs(srcs, use_grpc_plugin)
-    outs = gen_srcs + gen_hdrs
-
-    proto_gen(
-        name = name + "_genproto",
-        srcs = srcs,
-        deps = [s + "_genproto" for s in deps],
-        includes = includes,
-        protoc = protoc,
-        plugin = grpc_cpp_plugin,
-        plugin_language = "grpc",
-        gen_cc = 1,
-        visibility = ["//visibility:public"],
-    )
-
-    if default_runtime and not default_runtime in cc_libs:
-        cc_libs = cc_libs + [default_runtime]
-    if use_grpc_plugin:
-        cc_libs = cc_libs + ["//external:grpc_lib"]
-    cc_library(
-        name = name,
-        srcs = gen_srcs,
-        hdrs = gen_hdrs,
-        deps = cc_libs + deps,
-        includes = includes,
-        **kargs
-    )
 
 def _internal_gen_well_known_protos_java_impl(ctx):
     args = ctx.actions.args()
@@ -454,7 +393,97 @@
     },
 )
 
-def py_proto_library(
+def internal_objc_proto_library(
+        name,
+        srcs = [],
+        deps = [],
+        outs = [],
+        proto_deps = [],
+        includes = ["."],
+        default_runtime = "@com_google_protobuf//:protobuf_objc",
+        protoc = "@com_google_protobuf//:protoc",
+        testonly = None,
+        visibility = ["//visibility:public"],
+        **kwargs):
+    """Bazel rule to create a Objective-C protobuf library from proto sourc
+    files
+
+    NOTE: the rule is only an internal workaround to generate protos. The
+    interface may change and the rule may be removed when bazel has introduced
+    the native rule.
+
+    Args:
+      name: the name of the objc_proto_library.
+      srcs: the .proto files to compile.
+      deps: a list of dependency labels; must be objc_proto_library.
+      outs: a list of expected output files.
+      proto_deps: a list of proto file dependencies that don't have a
+        objc_proto_library rule.
+      include: a string indicating the include path of the .proto files.
+      default_runtime: the Objective-C Protobuf runtime
+      protoc: the label of the protocol compiler to generate the sources.
+      testonly: common rule attribute (see:
+          https://bazel.build/reference/be/common-definitions#common-attributes)
+      visibility: the visibility of the generated files.
+      **kwargs: other keyword arguments that are passed to py_library.
+
+    """
+    full_deps = [d + "_genproto" for d in deps]
+
+    if proto_deps:
+        _proto_gen(
+            name = name + "_deps_genproto",
+            testonly = testonly,
+            srcs = proto_deps,
+            protoc = protoc,
+            includes = includes,
+        )
+        full_deps.append(":%s_deps_genproto" % name)
+
+    # Note: we need to run the protoc build twice to get separate targets for
+    # the generated header and the source files.
+    _proto_gen(
+        name = name + "_genproto_hdrs",
+        srcs = srcs,
+        deps = full_deps,
+        langs = ["objc"],
+        out_type = "hdrs",
+        includes = includes,
+        protoc = protoc,
+        testonly = testonly,
+        visibility = visibility,
+        tags = ["manual"],
+    )
+
+    _proto_gen(
+        name = name + "_genproto",
+        srcs = srcs,
+        deps = full_deps,
+        langs = ["objc"],
+        out_type = "srcs",
+        includes = includes,
+        protoc = protoc,
+        testonly = testonly,
+        visibility = visibility,
+        tags = ["manual"],
+    )
+
+    objc_library(
+        name = name,
+        hdrs = [name + "_genproto_hdrs"],
+        non_arc_srcs = [name + "_genproto"],
+        deps = [default_runtime],
+        includes = includes,
+        testonly = testonly,
+        visibility = visibility,
+        # Don't auto-expand these targets until target_compatible_with
+        # works.  See https://github.com/bazelbuild/bazel/issues/12897.
+        tags = ["manual"],
+        target_compatible_with = ["@platforms//os:osx"],
+        **kwargs
+    )
+
+def internal_py_proto_library(
         name,
         srcs = [],
         deps = [],
@@ -502,14 +531,14 @@
         # is not explicitly listed in py_libs. Instead, host system is assumed to
         # have grpc installed.
 
-    proto_gen(
+    _proto_gen(
         name = name + "_genproto",
         testonly = testonly,
         srcs = srcs,
         deps = [s + "_genproto" for s in deps],
         includes = includes,
         protoc = protoc,
-        gen_py = 1,
+        langs = ["python"],
         visibility = ["//visibility:public"],
         plugin = grpc_python_plugin,
         plugin_language = "grpc",
@@ -526,6 +555,137 @@
         **kargs
     )
 
+def _source_proto_library(
+        name,
+        srcs = [],
+        deps = [],
+        proto_deps = [],
+        outs = [],
+        lang = None,
+        includes = ["."],
+        protoc = "@com_google_protobuf//:protoc",
+        testonly = None,
+        visibility = ["//visibility:public"],
+        **kwargs):
+    """Bazel rule to create generated protobuf code from proto source files for
+    languages not well supported by Bazel yet.  This will output the generated
+    code as-is without any compilation.  This is most useful for interpreted
+    languages that don't require it.
+
+    NOTE: the rule is only an internal workaround to generate protos. The
+    interface may change and the rule may be removed when bazel has introduced
+    the native rule.
+
+    Args:
+      name: the name of the unsupported_proto_library.
+      srcs: the .proto files to compile.  Note, that for languages where out
+        needs to be provided, only a single source file is allowed.
+      deps: a list of dependency labels; must be unsupported_proto_library.
+      proto_deps: a list of proto file dependencies that don't have a
+        unsupported_proto_library rule.
+      lang: the language to (optionally) generate code for.
+      outs: a list of expected output files.  This is only required for
+        languages where we can't predict the outputs.
+      includes: strings indicating the include path of the .proto files.
+      protoc: the label of the protocol compiler to generate the sources.
+      testonly: common rule attribute (see:
+          https://bazel.build/reference/be/common-definitions#common-attributes)
+      visibility: the visibility of the generated files.
+      **kwargs: other keyword arguments that are passed to py_library.
+
+    """
+    if outs and len(srcs) != 1:
+        fail("Custom outputs only allowed for single proto targets.")
+
+    langs = []
+    if lang != None:
+        langs = [lang]
+
+    full_deps = [d + "_genproto" for d in deps]
+
+    if proto_deps:
+        _proto_gen(
+            name = name + "_deps_genproto",
+            testonly = testonly,
+            srcs = proto_deps,
+            protoc = protoc,
+            includes = includes,
+        )
+        full_deps.append(":%s_deps_genproto" % name)
+
+    _proto_gen(
+        name = name + "_genproto",
+        srcs = srcs,
+        deps = full_deps,
+        langs = langs,
+        outs = outs,
+        includes = includes,
+        protoc = protoc,
+        testonly = testonly,
+        visibility = visibility,
+    )
+
+    native.filegroup(
+        name = name,
+        srcs = [":%s_genproto"%name],
+        testonly = testonly,
+        visibility = visibility,
+        **kwargs
+    )
+
+def internal_csharp_proto_library(**kwargs):
+    """Bazel rule to create a C# protobuf library from proto source files
+
+    NOTE: the rule is only an internal workaround to generate protos. The
+    interface may change and the rule may be removed when bazel has introduced
+    the native rule.
+
+    Args:
+      **kwargs: arguments that are passed to unsupported_proto_library.
+
+    """
+
+    _source_proto_library(
+        lang = "csharp",
+        **kwargs
+    )
+
+def internal_php_proto_library(**kwargs):
+    """Bazel rule to create a PHP protobuf library from proto source files
+
+    NOTE: the rule is only an internal workaround to generate protos. The
+    interface may change and the rule may be removed when bazel has introduced
+    the native rule.
+
+    Args:
+      **kwargs: arguments that are passed to unsupported_proto_library.
+
+    """
+    if not kwargs.get("outs"):
+        fail("Unable to predict the outputs for php_proto_library.  Please specify them via `outs`.")
+
+    _source_proto_library(
+        lang = "php",
+        **kwargs
+    )
+
+def internal_ruby_proto_library(**kwargs):
+    """Bazel rule to create a Ruby protobuf library from proto source files
+
+    NOTE: the rule is only an internal workaround to generate protos. The
+    interface may change and the rule may be removed when bazel has introduced
+    the native rule.
+
+    Args:
+      **kwargs: arguments that are passed to unsupported_proto_library.
+
+    """
+
+    _source_proto_library(
+        lang = "ruby",
+        **kwargs
+    )
+
 def check_protobuf_required_bazel_version():
     """For WORKSPACE files, to check the installed version of bazel.
 
diff --git a/protobuf.pc.in b/protobuf.pc.in
deleted file mode 100644
index e9bef5d..0000000
--- a/protobuf.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Protocol Buffers
-Description: Google's Data Interchange Format
-Version: @VERSION@
-Libs: -L${libdir} -lprotobuf
-Libs.private: @LIBS@
-
-Cflags: -I${includedir}
-Conflicts: protobuf-lite
diff --git a/protobuf_deps.bzl b/protobuf_deps.bzl
index 0d2611f..d002ef3 100644
--- a/protobuf_deps.bzl
+++ b/protobuf_deps.bzl
@@ -3,6 +3,7 @@
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
 PROTOBUF_MAVEN_ARTIFACTS = [
+    "com.google.caliper:caliper:1.0-beta-3",
     "com.google.code.findbugs:jsr305:3.0.2",
     "com.google.code.gson:gson:2.8.9",
     "com.google.errorprone:error_prone_annotations:2.3.2",
@@ -114,6 +115,6 @@
         _github_archive(
             name = "upb",
             repo = "https://github.com/protocolbuffers/upb",
-            commit = "17b6451684ffcf6e77d10a5def9bf19af57eccd3",
-            sha256 = "655c30a01c8ab56680c154baded548c5df8f726305d3338d0885cbb1f700ec10",
+            commit = "63a4a7d74bcbc8c6b94e6b18e599ffc68c71b91c",
+            sha256 = "9c921e799c4a5446b7164368a6579e20121103646045cd93986ba5bb8b376b29",
         )
diff --git a/protoc-artifacts/Dockerfile b/protoc-artifacts/Dockerfile
deleted file mode 100644
index 278bc74..0000000
--- a/protoc-artifacts/Dockerfile
+++ /dev/null
@@ -1,55 +0,0 @@
-FROM centos:6.9
-
-RUN yum install -y git \
-                   tar \
-                   wget \
-                   make \
-                   autoconf \
-                   curl-devel \
-                   unzip \
-                   automake \
-                   libtool \
-                   glibc-static.i686 \
-                   glibc-devel \
-                   glibc-devel.i686 \
-                   && \
-    yum clean all
-
-# Install Java 8
-RUN wget -q --no-cookies --no-check-certificate \
-    --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \
-    "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz" \
-    -O - | tar xz -C /var/local
-ENV JAVA_HOME /var/local/jdk1.8.0_131
-ENV PATH $JAVA_HOME/bin:$PATH
-
-# Install Maven
-RUN wget -q http://apache.cs.utah.edu/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -O - | \
-    tar xz -C /var/local
-ENV PATH /var/local/apache-maven-3.3.9/bin:$PATH
-
-# Install GCC 4.8 to support -static-libstdc++
-RUN wget http://people.centos.org/tru/devtools-2/devtools-2.repo -P /etc/yum.repos.d && \
-    bash -c 'echo "enabled=1" >> /etc/yum.repos.d/devtools-2.repo' && \
-    bash -c "sed -e 's/\$basearch/i386/g' /etc/yum.repos.d/devtools-2.repo > /etc/yum.repos.d/devtools-i386-2.repo" && \
-    sed -e 's/testing-/testing-i386-/g' -i /etc/yum.repos.d/devtools-i386-2.repo && \
-    rpm --rebuilddb
-
-RUN yum install -y devtoolset-2-gcc \
-                   devtoolset-2-gcc-c++ \
-                   devtoolset-2-binutils \
-                   devtoolset-2-libstdc++-devel \
-                   devtoolset-2-libatomic-devel \
-                   libatomic \
-                   devtoolset-2-gcc.i686 \
-                   devtoolset-2-gcc-c++.i686 \
-                   devtoolset-2-binutils.i686 \
-                   devtoolset-2-libstdc++-devel.i686 \
-                   devtoolset-2-libatomic-devel.i686 \
-                   libatomic.i686 && \
-    yum clean all
-
-COPY scl-enable-devtoolset.sh /var/local/
-
-# Start in devtoolset environment that uses GCC 4.7
-ENTRYPOINT ["/var/local/scl-enable-devtoolset.sh"]
diff --git a/protoc-artifacts/README.md b/protoc-artifacts/README.md
index 8fc3669..5511f9a 100644
--- a/protoc-artifacts/README.md
+++ b/protoc-artifacts/README.md
@@ -43,13 +43,13 @@
 ## Building from a freshly checked-out source
 
 If you just checked out the Protobuf source from github, you need to
-generate the configure script.
+pull in any submodules.
 
 Under the protobuf project directory:
 
 
 ```
-$ ./autogen.sh
+git submodule update --init --recursive
 ```
 
 ### Build the artifact for each platform
diff --git a/protoc-artifacts/build-protoc.sh b/protoc-artifacts/build-protoc.sh
index 4602842..d304d5f 100755
--- a/protoc-artifacts/build-protoc.sh
+++ b/protoc-artifacts/build-protoc.sh
@@ -19,28 +19,20 @@
 #   macos  osx     x86_64
 #   mingw  windows x86_32
 #   mingw  windows x86_64
-#
-# Before running this script, make sure you have generated the configure script
-# in the parent directory (i.e., run ./autogen.sh there).
 
 OS=$1
 ARCH=$2
-MAKE_TARGET=$3
+BAZEL_TARGET=$3
 
 if [[ $# < 3 ]]; then
   echo "Not enough arguments provided."
   exit 1
 fi
 
-case $MAKE_TARGET in
-  protoc-gen-javalite)
-    ;;
-  protoc)
-    ;;
-  *)
-    echo "Target ""$MAKE_TARGET"" invalid."
+if [[ $BAZEL_TARGET != protoc ]]; then
+    echo "Target ""$BAZEL_TARGET"" invalid."
     exit 1
-esac
+fi
 
 # Under Cygwin, bash doesn't have these in PATH when called from Maven which
 # runs in Windows version of Java.
@@ -146,22 +138,22 @@
     host_machine="$(uname -m)";
     dump_cmd='ldd '"$1"
     if [[ "$ARCH" == x86_32 ]]; then
-      white_list="linux-gate\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux\.so\.2"
+      white_list="linux-gate\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|ld-linux\.so\.2"
     elif [[ "$ARCH" == x86_64 ]]; then
-      white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-x86-64\.so\.2"
+      white_list="linux-vdso\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|ld-linux-x86-64\.so\.2"
     elif [[ "$ARCH" == s390_64 ]]; then
       if [[ $host_machine != s390x ]];then
         dump_cmd='objdump -p '"$1"' | grep NEEDED'
       fi
-      white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libz\.so\.1\|ld64\.so\.1"
+      white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|libz\.so\.1\|ld64\.so\.1"
     elif [[ "$ARCH" == ppcle_64 ]]; then
       if [[ $host_machine != ppc64le ]];then
         dump_cmd='objdump -p '"$1"' | grep NEEDED'
       fi
-      white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libz\.so\.1\|ld64\.so\.2"
+      white_list="linux-vdso64\.so\.1\|libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|libz\.so\.1\|ld64\.so\.2"
     elif [[ "$ARCH" == aarch_64 ]]; then
       dump_cmd='objdump -p '"$1"' | grep NEEDED'
-      white_list="libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-aarch64\.so\.1"
+      white_list="libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|libgcc_s\.so\.1\|libstdc++\.so\.6\|ld-linux-aarch64\.so\.1"
     fi
   elif [[ "$OS" == osx ]]; then
     dump_cmd='otool -L '"$1"' | fgrep dylib'
@@ -185,19 +177,14 @@
 }
 ############################################################################
 
-echo "Building protoc, OS=$OS ARCH=$ARCH TARGET=$MAKE_TARGET"
+echo "Building protoc, OS=$OS ARCH=$ARCH TARGET=$BAZEL_TARGET"
 
-CONFIGURE_ARGS="--disable-shared"
+BAZEL_ARGS=("--dynamic_mode=off" "--compilation_mode=opt" "--copt=-g0" "--copt=-fpic")
 
 if [[ "$OS" == windows ]]; then
-  MAKE_TARGET="${MAKE_TARGET}.exe"
+  BAZEL_TARGET="${BAZEL_TARGET}.exe"
 fi
 
-# Override the default value set in configure.ac that has '-g' which produces
-# huge binary.
-CXXFLAGS="-DNDEBUG"
-LDFLAGS=""
-
 if [[ "$(uname)" == CYGWIN* ]]; then
   assertEq "$OS" windows $LINENO
   # Use mingw32 compilers because executables produced by Cygwin compiler
@@ -217,28 +204,13 @@
   assertEq "$ARCH" x86_64 $LINENO
 elif [[ "$(uname)" == Linux* ]]; then
   if [[ "$OS" == linux ]]; then
-    if [[ "$ARCH" == x86_64 ]]; then
-      CXXFLAGS="$CXXFLAGS -m64"
-    elif [[ "$ARCH" == x86_32 ]]; then
-      CXXFLAGS="$CXXFLAGS -m32"
-    elif [[ "$ARCH" == aarch_64 ]]; then
-      CONFIGURE_ARGS="$CONFIGURE_ARGS --host=aarch64-linux-gnu"
-    elif [[ "$ARCH" == ppcle_64 ]]; then
-      CXXFLAGS="$CXXFLAGS -m64"
-      CONFIGURE_ARGS="$CONFIGURE_ARGS --host=powerpc64le-linux-gnu"
-    elif [[ "$ARCH" == s390_64 ]]; then
-      CXXFLAGS="$CXXFLAGS -m64"
-      CONFIGURE_ARGS="$CONFIGURE_ARGS --host=s390x-linux-gnu"
-    else
-      fail "Unsupported arch: $ARCH"
-    fi
+    BAZEL_ARGS+=("--config=linux-$ARCH")
   elif [[ "$OS" == windows ]]; then
     # Cross-compilation for Windows
-    CONFIGURE_ARGS="$CONFIGURE_ARGS"
     if [[ "$ARCH" == x86_64 ]]; then
-      CONFIGURE_ARGS="$CONFIGURE_ARGS --host=x86_64-w64-mingw32"
+      BAZEL_ARGS+=("--config=win64")
     elif [[ "$ARCH" == x86_32 ]]; then
-      CONFIGURE_ARGS="$CONFIGURE_ARGS --host=i686-w64-mingw32"
+      BAZEL_ARGS+=("--config=win32")
     else
       fail "Unsupported arch: $ARCH"
     fi
@@ -248,43 +220,24 @@
 elif [[ "$(uname)" == Darwin* ]]; then
   assertEq "$OS" osx $LINENO
   # Make the binary compatible with OSX 10.7 and later
-  CXXFLAGS="$CXXFLAGS -mmacosx-version-min=10.7"
-  if [[ "$ARCH" == x86_64 ]]; then
-    CXXFLAGS="$CXXFLAGS -m64"
-  elif [[ "$ARCH" == x86_32 ]]; then
-    CXXFLAGS="$CXXFLAGS -m32"
-  else
-    fail "Unsupported arch: $ARCH"
-  fi
+  BAZEL_ARGS+=("--config=osx-$ARCH" "--macos_minimum_os=10.7")
 else
   fail "Unsupported system: $(uname)"
 fi
 
-# Statically link libgcc and libstdc++.
-# -s to produce stripped binary.
-if [[ "$OS" == windows ]]; then
-  # Also static link libpthread required by mingw64
-  LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -s"
-elif [[ "$OS" != osx ]]; then
-  # And they don't work under Mac.
-  LDFLAGS="$LDFLAGS -static-libgcc -static-libstdc++ -s"
-fi
-
-export CXXFLAGS LDFLAGS
-
 # Nested double quotes are unintuitive, but it works.
 cd "$(dirname "$0")"
 
 WORKING_DIR="$(pwd)"
-BUILD_DIR="build/$OS/$ARCH"
-TARGET_FILE="target/$OS/$ARCH/$MAKE_TARGET.exe"
+TARGET_FILE="target/$OS/$ARCH/$BAZEL_TARGET.exe"
+DOCKER_IMAGE=gcr.io/protobuf-build/bazel/linux@sha256:2bfd061284eff8234f2fcca16d71d43c69ccf3a22206628b54c204a6a9aac277
 
-mkdir -p "$BUILD_DIR" && cd "$BUILD_DIR" &&
-  ../../../../configure $CONFIGURE_ARGS &&
-  cd src && make $MAKE_TARGET -j8 &&
-  cd "$WORKING_DIR" && mkdir -p $(dirname $TARGET_FILE) &&
-  cp $BUILD_DIR/src/$MAKE_TARGET $TARGET_FILE ||
-  exit 1
+tmpfile=$(mktemp -u) &&
+docker run --cidfile $tmpfile -v $WORKING_DIR/..:/workspace $DOCKER_IMAGE \
+    build //:$BAZEL_TARGET "${BAZEL_ARGS[@]}" &&
+mkdir -p $(dirname $TARGET_FILE) &&
+docker cp \
+  `cat $tmpfile`:/workspace/bazel-bin/$BAZEL_TARGET $TARGET_FILE || exit 1
 
 if [[ "$OS" == osx ]]; then
   # Since Mac linker doesn't accept "-s", we need to run strip
diff --git a/python/BUILD.bazel b/python/BUILD.bazel
index 06c8a5d..75d3a5d 100644
--- a/python/BUILD.bazel
+++ b/python/BUILD.bazel
@@ -9,8 +9,9 @@
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 load("@rules_proto//proto:defs.bzl", "proto_library")
 load("@rules_python//python:defs.bzl", "py_library")
-load("//:protobuf.bzl", "py_proto_library")
+load("//:protobuf.bzl", "internal_py_proto_library")
 load("//build_defs:cpp_opts.bzl", "COPTS")
+load("//conformance:defs.bzl", "conformance_test")
 load(":internal.bzl", "internal_copy_files")
 
 py_library(
@@ -36,7 +37,7 @@
     },
 )
 
-py_proto_library(
+internal_py_proto_library(
     name = "well_known_types_py_pb2",
     srcs = [":copied_wkt_proto_files"],
     include = ".",
@@ -167,7 +168,25 @@
     strip_prefix = "src",
 )
 
-py_proto_library(
+internal_copy_files(
+    name = "copied_test_messages_proto2_files",
+    testonly = 1,
+    srcs = [
+        "//src/google/protobuf:test_messages_proto2.proto",
+    ],
+    strip_prefix = "src",
+)
+
+internal_copy_files(
+    name = "copied_test_messages_proto3_files",
+    testonly = 1,
+    srcs = [
+        "//src/google/protobuf:test_messages_proto3.proto",
+    ],
+    strip_prefix = "src",
+)
+
+internal_py_proto_library(
     name = "python_common_test_protos",
     testonly = 1,
     srcs = [":copied_test_proto_files"],
@@ -179,7 +198,7 @@
     deps = [":well_known_types_py_pb2"],
 )
 
-py_proto_library(
+internal_py_proto_library(
     name = "python_specific_test_protos",
     testonly = 1,
     srcs = glob([
@@ -194,6 +213,33 @@
     deps = [":python_common_test_protos"],
 )
 
+internal_py_proto_library(
+    name = "test_messages_proto2_py_proto",
+    testonly = 1,
+    visibility = [
+        "//conformance:__pkg__",
+        "//python:__subpackages__",
+    ],
+    srcs = [":copied_test_messages_proto2_files"],
+    include = ".",
+    default_runtime = "//:protobuf_python",
+    protoc = "//:protoc",
+)
+
+internal_py_proto_library(
+    name = "test_messages_proto3_py_proto",
+    testonly = 1,
+    visibility = [
+        "//conformance:__pkg__",
+        "//python:__subpackages__",
+    ],
+    srcs = [":copied_test_messages_proto3_files"],
+    deps = [":well_known_types_py_pb2"],
+    include = ".",
+    default_runtime = "//:protobuf_python",
+    protoc = "//:protoc",
+)
+
 py_library(
     name = "python_test_lib",
     testonly = 1,
@@ -237,6 +283,13 @@
 )
 
 py_test(
+    name = "import_test",
+    srcs = ["google/protobuf/internal/import_test.py"],
+    imports = ["."],
+    deps = [":python_test_lib"],
+)
+
+py_test(
     name = "json_format_test",
     srcs = ["google/protobuf/internal/json_format_test.py"],
     imports = ["."],
@@ -244,6 +297,13 @@
 )
 
 py_test(
+    name = "keywords_test",
+    srcs = ["google/protobuf/internal/keywords_test.py"],
+    imports = ["."],
+    deps = [":python_test_lib"],
+)
+
+py_test(
     name = "message_factory_test",
     srcs = ["google/protobuf/internal/message_factory_test.py"],
     imports = ["."],
@@ -311,6 +371,13 @@
 )
 
 py_test(
+    name = "well_known_types_test",
+    srcs = ["google/protobuf/internal/well_known_types_test.py"],
+    imports = ["."],
+    deps = [":python_test_lib"],
+)
+
+py_test(
     name = "wire_format_test",
     srcs = ["google/protobuf/internal/wire_format_test.py"],
     imports = ["."],
@@ -319,13 +386,43 @@
 
 cc_library(
     name = "proto_api",
-    hdrs = ["python/google/protobuf/proto_api.h"],
+    hdrs = ["google/protobuf/proto_api.h"],
     visibility = ["//visibility:public"],
     deps = [
         "//external:python_headers",
     ],
 )
 
+py_test(
+    name = "python_version",
+    srcs = ["python_version.py"],
+)
+
+conformance_test(
+    name = "conformance_test",
+    failure_list = "//conformance:failure_list_python.txt",
+    testee = "//conformance:conformance_python",
+    text_format_failure_list = "//conformance:text_format_failure_list_python.txt",
+    env = {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "python"},
+    target_compatible_with = select({
+        ":use_fast_cpp_protos": ["@platforms//:incompatible"],
+        "//conditions:default": [],
+    }),
+)
+
+# Note: this requires --define=use_fast_cpp_protos=true
+conformance_test(
+    name = "conformance_test_cpp",
+    failure_list = "//conformance:failure_list_python.txt",
+    testee = "//conformance:conformance_python",
+    text_format_failure_list = "//conformance:text_format_failure_list_python_cpp.txt",
+    env = {"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": "cpp"},
+    target_compatible_with = select({
+        ":use_fast_cpp_protos": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
+)
+
 ################################################################################
 # Distribution files
 ################################################################################
@@ -347,6 +444,7 @@
         "google/protobuf/python_protobuf.h",
         "internal.bzl",
         "mox.py",
+        "python_version.py",
         "release.sh",
         "setup.cfg",
         "setup.py",
diff --git a/python/README.md b/python/README.md
index c7f7828..6549fb6 100644
--- a/python/README.md
+++ b/python/README.md
@@ -30,33 +30,33 @@
 
        $ python -V
 
-2) If you do not have setuptools installed, note that it will be
+2) Make sure you have Bazel 0.5.4 or later (or CMake 3.5 or later).
+
+3) If you do not have setuptools installed, note that it will be
    downloaded and installed automatically as soon as you run `setup.py`.
    If you would rather install it manually, you may do so by following
    the instructions on [this page](https://packaging.python.org/en/latest/tutorials/installing-packages/).
 
-3) Build the C++ code, or install a binary distribution of `protoc`.  If
+4) Build the C++ code, or install a binary distribution of `protoc`.  If
    you install a binary distribution, make sure that it is the same
    version as this package.  If in doubt, run:
 
        $ protoc --version
 
-4) Build and run the tests:
+5) Build and run the tests:
 
        $ python setup.py build
        $ python setup.py test
 
    To build, test, and use the C++ implementation, you must first compile
-   `libprotobuf.so`:
-
-       $ (cd .. && make)
+   `libprotobuf.so` using either [Bazel](../README.md) or [CMake](../src/README.md):
 
    On OS X:
 
    If you are running a Homebrew-provided Python, you must make sure another
    version of protobuf is not already installed, as Homebrew's Python will
-   search `/usr/local/lib` for `libprotobuf.so` before it searches
-   `../src/.libs`.
+   search `/usr/local/lib` for `libprotobuf.so` before it searches the compiled
+   binaries.
 
    You can either unlink Homebrew's protobuf or install the `libprotobuf` you
    built earlier:
@@ -65,18 +65,18 @@
 
    or
 
-       $ (cd .. && make install)
+       $ (cd .. && cmake . && make install)
 
     On other *nix:
 
     You must make `libprotobuf.so` dynamically available. You can either
     install libprotobuf you built earlier, or set `LD_LIBRARY_PATH`:
 
-       $ export LD_LIBRARY_PATH=../src/.libs
+       $ (cd .. && cmake . && make -j20 install)
 
     or
 
-       $ (cd .. && make install)
+       $ export LD_LIBRARY_PATH=../bazel-bin
 
    To build the C++ implementation run:
 
@@ -98,7 +98,7 @@
    We do not know if or when it might be fixed.  We also do not know
    how likely it is that this bug will affect users in practice.
 
-5) Install:
+6) Install:
 
        $ python setup.py install
 
diff --git a/python/python_version.py b/python/python_version.py
new file mode 100644
index 0000000..5c2b5a6
--- /dev/null
+++ b/python/python_version.py
@@ -0,0 +1,51 @@
+# Protocol Buffers - Google's data interchange format
+# Copyright 2008 Google Inc.  All rights reserved.
+# https://developers.google.com/protocol-buffers/
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Test that Kokoro is using the expected version of python."""
+
+import os
+import unittest
+import sys
+
+class PythonVersionTest(unittest.TestCase):
+
+  def testPython3(self):
+    """Test that we can import nested import public messages."""
+
+    exp = os.getenv('KOKORO_PYTHON_VERSION', '')
+    if exp == '':
+      print("No kokoro python version found, skipping check", file=sys.stderr)
+      return
+    self.assertTrue(sys.version.startswith(exp),
+      "Expected Python %s but found Python %s" % (exp, sys.version))
+
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/python/setup.py b/python/setup.py
index 302c82b..283c99a 100755
--- a/python/setup.py
+++ b/python/setup.py
@@ -29,10 +29,14 @@
 # Find the Protocol Compiler.
 if 'PROTOC' in os.environ and os.path.exists(os.environ['PROTOC']):
   protoc = os.environ['PROTOC']
-elif os.path.exists('../src/protoc'):
-  protoc = '../src/protoc'
-elif os.path.exists('../src/protoc.exe'):
-  protoc = '../src/protoc.exe'
+elif os.path.exists('../bazel-bin/protoc'):
+  protoc = '../bazel-bin/protoc'
+elif os.path.exists('../bazel-bin/protoc.exe'):
+  protoc = '../bazel-bin/protoc.exe'
+elif os.path.exists('protoc'):
+  protoc = '../protoc'
+elif os.path.exists('protoc.exe'):
+  protoc = '../protoc.exe'
 elif os.path.exists('../vsprojects/Debug/protoc.exe'):
   protoc = '../vsprojects/Debug/protoc.exe'
 elif os.path.exists('../vsprojects/Release/protoc.exe'):
@@ -203,13 +207,13 @@
 
 
 class TestConformanceCmd(_build_py):
-  target = 'test_python'
+  target = '//python:conformance_test'
 
   def run(self):
     # Python 2.6 dodges these extra failures.
     os.environ['CONFORMANCE_PYTHON_EXTRA_FAILURES'] = (
         '--failure_list failure_list_python-post26.txt')
-    cmd = 'cd ../conformance && make %s' % (TestConformanceCmd.target,)
+    cmd = 'bazel test %s' % (TestConformanceCmd.target,)
     subprocess.check_call(cmd, shell=True)
 
 
@@ -289,16 +293,20 @@
       libraries = None
       library_dirs = None
       if not HasStaticLibprotobufOpt():
-        extra_objects = ['../src/.libs/libprotobuf.a',
-                         '../src/.libs/libprotobuf-lite.a']
+        if os.path.exists('../bazel-bin/src/google/protobuf/libprotobuf.a'):
+          extra_objects = ['../bazel-bin/src/google/protobuf/libprotobuf.a']
+        else:
+          extra_objects = ['../libprotobuf.a']
     else:
       libraries = ['protobuf']
       if HasLibraryDirsOpt():
         library_dirs = None
+      elif os.path.exists('../bazel-bin/src/google/protobuf/libprotobuf.a'):
+        library_dirs = ['../bazel-bin/src/google/protobuf']
       else:
-        library_dirs = ['../src/.libs']
+        library_dirs = ['..']
 
-    TestConformanceCmd.target = 'test_python_cpp'
+    TestConformanceCmd.target = '//python:conformance_test_cpp --define=use_fast_cpp_protos=true'
 
     extra_compile_args = []
 
diff --git a/python/tox.ini b/python/tox.ini
index b923a4a..346ce21 100644
--- a/python/tox.ini
+++ b/python/tox.ini
@@ -5,10 +5,10 @@
 [testenv]
 usedevelop=true
 passenv =
-    CC KOKORO_BUILD_ID KOKORO_BUILD_NUMBER
+    CC PYTHONPATH KOKORO_BUILD_ID KOKORO_BUILD_NUMBER
 setenv =
-    cpp: LD_LIBRARY_PATH={toxinidir}/../src/.libs
-    cpp: DYLD_LIBRARY_PATH={toxinidir}/../src/.libs
+    cpp: LD_LIBRARY_PATH={toxinidir}/../bazel-bin/src/google
+    cpp: DYLD_LIBRARY_PATH={toxinidir}/../bazel-bin/src/google
     cpp: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp
     python: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
 commands =
diff --git a/ruby/BUILD.bazel b/ruby/BUILD.bazel
index fe336e5..d014402 100644
--- a/ruby/BUILD.bazel
+++ b/ruby/BUILD.bazel
@@ -3,30 +3,180 @@
 # See also code generation logic under /src/google/protobuf/compiler/ruby.
 
 load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+load("//conformance:defs.bzl", "conformance_test")
+load("//:protobuf.bzl", "internal_ruby_proto_library")
+load(":internal.bzl", "internal_ruby_extension")
+
+################################################################################
+# Ruby Runtime
+################################################################################
+
+config_setting(
+    name = "java_ruby",
+    values = {"define": "ruby_platform=java"},
+)
+
+config_setting(
+    name = "c_ruby",
+    values = {"define": "ruby_platform=c"},
+)
+
+filegroup(
+    name = "srcs",
+    srcs = glob([
+        "lib/**/*.rb",
+        "src/**/*.proto",
+    ]) + [
+        "Gemfile",
+        "Rakefile",
+        "google-protobuf.gemspec",
+        "pom.xml",
+    ],
+)
+
+internal_ruby_extension(
+    name = "protobuf_c_mac",
+    extension = "lib/google/protobuf_c.bundle",
+    deps = glob(["ext/google/protobuf_c/*"]),
+    target_compatible_with = select({
+        ":java_ruby": ["@platforms//:incompatible"],
+        "//conditions:default": ["@platforms//os:osx"],
+    }),
+)
+
+internal_ruby_extension(
+    name = "protobuf_c",
+    extension = "lib/google/protobuf_c.so",
+    deps = glob(["ext/google/protobuf_c/*"]),
+    target_compatible_with = select({
+        ":java_ruby": ["@platforms//:incompatible"],
+        "@platforms//os:osx": ["@platforms//:incompatible"],
+        "//conditions:default": [],
+    }),
+)
+
+internal_ruby_extension(
+    name = "protobuf_java",
+    extension = "lib/google/protobuf_java.jar",
+    deps = glob(["src/**/*.java"]),
+    target_compatible_with = select({
+        ":java_ruby": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
+)
+
+filegroup(
+    name = "protobuf",
+    srcs = [
+        ":srcs",
+        "//third_party/utf8_range:all_files",
+    ] + select({
+        ":java_ruby": [":protobuf_java"],
+        "@bazel_tools//src/conditions:darwin": [":protobuf_c_mac"],
+        "//conditions:default": [":protobuf_c"],
+    }),
+    visibility = [
+        "//conformance:__subpackages__",
+        "//ruby:__subpackages__",
+    ],
+)
+
+################################################################################
+# Tests
+################################################################################
+
+filegroup(
+  name = "tests",
+  srcs = glob(["tests/*.rb"]),
+)
+
+filegroup(
+  name = "test_protos",
+  srcs = glob(["tests/*.proto"]),
+)
+
+internal_ruby_proto_library(
+    name = "test_ruby_protos",
+    srcs = [":test_protos"],
+    proto_deps = ["//:well_known_protos"],
+    includes = [".", "src", "ruby/tests"],
+)
+
+inline_sh_test(
+    name = "test",
+    srcs = [
+        "Rakefile",
+    ],
+    deps = [
+        ":protobuf",
+        ":test_ruby_protos",
+        ":tests",
+        "//:well_known_ruby_protos",
+    ],
+    cmd = """
+        pushd `dirname $(location Rakefile)`
+        RUBYLIB=../src:tests:. BAZEL=true rake test
+        popd
+    """,
+)
+
+inline_sh_test(
+    name = "gc_test",
+    srcs = [
+        "Rakefile",
+    ],
+    deps = [
+        ":protobuf",
+        ":test_ruby_protos",
+        ":tests",
+        "//:well_known_ruby_protos",
+    ],
+    cmd = """
+        pushd `dirname $(location Rakefile)`
+        RUBYLIB=../src:tests:. BAZEL=true rake gc_test
+        popd
+    """,
+)
+
+conformance_test(
+    name = "conformance_test",
+    failure_list = "//conformance:failure_list_ruby.txt",
+    testee = "//conformance:conformance_ruby",
+    text_format_failure_list = "//conformance:text_format_failure_list_ruby.txt",
+    target_compatible_with = select({
+        ":java_ruby": ["@platforms//:incompatible"],
+        "//conditions:default": [],
+    }),
+)
+
+conformance_test(
+    name = "conformance_test_jruby",
+    failure_list = "//conformance:failure_list_jruby.txt",
+    testee = "//conformance:conformance_ruby",
+    text_format_failure_list = "//conformance:text_format_failure_list_jruby.txt",
+    target_compatible_with = select({
+        ":java_ruby": [],
+        "//conditions:default": ["@platforms//:incompatible"],
+    }),
+)
+
+################################################################################
+# Distribution files
+################################################################################
 
 pkg_files(
     name = "dist_files",
     srcs = glob([
-        "compatibility_tests/v3.0.0/**/*",
-        "ext/google/protobuf_c/*",
-        "src/main/java/com/google/protobuf/jruby/*.java",
         "tests/*.proto",
         "tests/*.rb",
     ]) + [
+        ":srcs",
         ".gitignore",
         "BUILD.bazel",
+        "internal.bzl",
         "Gemfile",
         "README.md",
-        "Rakefile",
-        "google-protobuf.gemspec",
-        "lib/google/protobuf.rb",
-        "lib/google/protobuf/descriptor_dsl.rb",
-        "lib/google/protobuf/message_exts.rb",
-        "lib/google/protobuf/repeated_field.rb",
-        "lib/google/protobuf/well_known_types.rb",
-        "pom.xml",
-        "src/main/java/google/ProtobufJavaService.java",
-        "src/main/sentinel.proto",
         "travis-test.sh",
     ],
     strip_prefix = strip_prefix.from_root(""),
diff --git a/ruby/Rakefile b/ruby/Rakefile
index d8ac763..89a00e1 100644
--- a/ruby/Rakefile
+++ b/ruby/Rakefile
@@ -39,8 +39,8 @@
 
 if !ENV['PROTOC'].nil?
   protoc_command = ENV['PROTOC']
-elsif system('../src/protoc --version')
-  protoc_command = '../src/protoc'
+elsif system('../bazel-bin/protoc --version')
+  protoc_command = '../bazel-bin/protoc'
 else
   protoc_command = 'protoc'
 end
@@ -49,7 +49,7 @@
 
 # We won't have access to .. from within docker, but the proto files
 # will be there, thanks to the :genproto rule dependency for gem:native.
-unless ENV['IN_DOCKER'] == 'true'
+unless ENV['IN_DOCKER'] == 'true' or ENV['BAZEL'] == 'true'
   well_known_protos.each do |proto_file|
     input_file = "../src/" + proto_file
     output_file = "lib/" + proto_file.sub(/\.proto$/, "_pb.rb")
@@ -153,13 +153,15 @@
 Gem::PackageTask.new(spec) do |pkg|
 end
 
-Rake::TestTask.new(:test => [:build, :genproto]) do |t|
+# Skip build/genproto in Bazel builds, where we expect this to
+# be done already.
+Rake::TestTask.new(:test => ENV['BAZEL'] == 'true' ? [] : [:build, :genproto]) do |t|
   t.test_files = FileList["tests/*.rb"].exclude("tests/gc_test.rb", "tests/common_tests.rb")
 end
 
 # gc_test needs to be split out to ensure the generated file hasn't been
 # imported by other tests.
-Rake::TestTask.new(:gc_test => :build) do |t|
+Rake::TestTask.new(:gc_test => ENV['BAZEL'] == 'true' ? [] : :build) do |t|
   t.test_files = FileList["tests/gc_test.rb"]
 end
 
diff --git a/ruby/compatibility_tests/v3.0.0/BUILD.bazel b/ruby/compatibility_tests/v3.0.0/BUILD.bazel
new file mode 100644
index 0000000..b5fcede
--- /dev/null
+++ b/ruby/compatibility_tests/v3.0.0/BUILD.bazel
@@ -0,0 +1,56 @@
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
+load("//build_defs:internal_shell.bzl", "inline_sh_test")
+load("//:protobuf.bzl", "internal_ruby_proto_library")
+
+filegroup(
+  name = "tests",
+  srcs = glob(["tests/*.rb"]),
+)
+
+filegroup(
+  name = "test_protos",
+  srcs = glob(["tests/*.proto"]),
+)
+
+internal_ruby_proto_library(
+    name = "test_ruby_protos",
+    srcs = [":test_protos"],
+    includes = ["."],
+)
+
+inline_sh_test(
+    name = "test",
+    srcs = [
+        "Rakefile",
+    ],
+    deps = [
+        ":test_ruby_protos",
+        ":tests",
+        "//:well_known_ruby_protos",
+        "//ruby:protobuf",
+    ],
+    cmd = """
+        pushd `dirname $(location Rakefile)`
+        RUBYLIB=.:tests:../../lib:../../../src BAZEL=true rake test
+        popd
+    """,
+)
+
+################################################################################
+# Distribution files
+############################################################################
+
+pkg_files(
+    name = "dist_files",
+    srcs = glob([
+        "**/*.rb",
+        "**/*.proto"
+    ]) + [
+        "BUILD.bazel",
+        "Rakefile",
+        "README.md",
+        "test.sh",
+    ],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//pkg:__pkg__"],
+)
diff --git a/ruby/compatibility_tests/v3.0.0/Rakefile b/ruby/compatibility_tests/v3.0.0/Rakefile
index 19a4ba1..f72bed2 100644
--- a/ruby/compatibility_tests/v3.0.0/Rakefile
+++ b/ruby/compatibility_tests/v3.0.0/Rakefile
@@ -2,14 +2,17 @@
 
 # Proto for tests.
 genproto_output = []
-genproto_output << "tests/generated_code.rb"
-genproto_output << "tests/test_import.rb"
-file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
-  sh "./protoc --ruby_out=. tests/generated_code.proto"
-end
 
-file "tests/test_import.rb" => "tests/test_import.proto" do |file_task|
-  sh "./protoc --ruby_out=. tests/test_import.proto"
+unless ENV['BAZEL'] == 'true'
+  genproto_output << "tests/generated_code.rb"
+  genproto_output << "tests/test_import.rb"
+  file "tests/generated_code.rb" => "tests/generated_code.proto" do |file_task|
+    sh "./protoc --ruby_out=. tests/generated_code.proto"
+  end
+
+  file "tests/test_import.rb" => "tests/test_import.proto" do |file_task|
+    sh "./protoc --ruby_out=. tests/test_import.proto"
+  end
 end
 
 task :genproto => genproto_output
diff --git a/ruby/ext/google/protobuf_c/extconf.rb b/ruby/ext/google/protobuf_c/extconf.rb
index 8bc96ae..5cc4533 100755
--- a/ruby/ext/google/protobuf_c/extconf.rb
+++ b/ruby/ext/google/protobuf_c/extconf.rb
@@ -25,4 +25,4 @@
          "repeated_field.c", "map.c", "ruby-upb.c", "wrap_memcpy.c",
          "naive.c", "range2-neon.c", "range2-sse.c"]
 
-create_makefile(ext_name)
+create_makefile(ext_name, Dir.pwd+"/../../../../ext/google/protobuf_c")
diff --git a/ruby/internal.bzl b/ruby/internal.bzl
new file mode 100644
index 0000000..74a2d10
--- /dev/null
+++ b/ruby/internal.bzl
@@ -0,0 +1,35 @@
+def internal_ruby_extension(
+        name,
+        extension,
+        deps = [],
+        **kwargs):
+    """Bazel rule to wrap up a generated ruby extension.
+
+    NOTE: the rule is only an internal workaround. The interface may change and
+    the rule may be removed when everything is properly "Bazelified".
+
+    Args:
+      name: the name of the target.
+      extension: the path of the extension file.
+      deps: extra dependencies to add.
+      **kwargs: extra arguments to forward to the genrule.
+    """
+
+
+    native.genrule(
+        name = name,
+        srcs = deps + [
+            "Rakefile",
+            ":srcs",
+            ":test_ruby_protos",
+            ":tests",
+            "//third_party/utf8_range:all_files",
+        ],
+        tags = ["manual"],
+        outs = [extension],
+        cmd = "pushd `dirname $(location Rakefile)`\n" +
+              "BAZEL=true rake\n" +
+              "popd\n" +
+              "cp `dirname $(location Rakefile)`/%s $(OUTS)\n" % extension,
+        **kwargs,
+    )
diff --git a/ruby/tests/ruby_version.rb b/ruby/tests/ruby_version.rb
new file mode 100644
index 0000000..eb98960
--- /dev/null
+++ b/ruby/tests/ruby_version.rb
@@ -0,0 +1,33 @@
+#!/usr/bin/ruby
+
+# Test that Kokoro is using the expected version of ruby.
+
+require 'test/unit'
+
+class RubyVersionTest < Test::Unit::TestCase
+
+  def test_ruby_version
+    return if RUBY_PLATFORM == "java"
+    if not ENV["KOKORO_RUBY_VERSION"]
+      STDERR.puts("No kokoro ruby version found, skipping check")
+      return
+    end
+
+    actual = RUBY_VERSION
+    expected = ENV["KOKORO_RUBY_VERSION"].delete_prefix("ruby-")
+    assert actual.start_with?(expected), "Version #{actual} found, expecting #{expected}"
+  end
+
+  def test_jruby_version
+    return if RUBY_PLATFORM != "java"
+    if not ENV["KOKORO_RUBY_VERSION"]
+      STDERR.puts("No kokoro ruby version found, skipping check")
+      return
+    end
+
+    expected = ENV["KOKORO_RUBY_VERSION"].delete_prefix("jruby-")
+    actual = JRUBY_VERSION
+    assert actual.start_with?(expected), "Version #{actual} found, expecting #{expected}"
+  end
+
+end
diff --git a/ruby/travis-test.sh b/ruby/travis-test.sh
index f7fa815..6e9c612 100755
--- a/ruby/travis-test.sh
+++ b/ruby/travis-test.sh
@@ -5,8 +5,12 @@
 
 test_version() {
   version=$1
-
-  RUBY_CONFORMANCE=test_ruby
+  bazel_args=" \
+    -k --test_output=streamed \
+    --action_env=PATH \
+    --action_env=GEM_PATH \
+    --action_env=GEM_HOME \
+    --test_env=KOKORO_RUBY_VERSION=$version"
 
   if [[ $version == jruby-9* ]] ; then
     bash --login -c \
@@ -14,21 +18,14 @@
        which ruby && \
        git clean -f && \
        gem install --no-document bundler && bundle && \
-       rake test && \
-       rake gc_test && \
-       cd ../conformance && make test_jruby && \
-       cd ../ruby/compatibility_tests/v3.0.0 && ./test.sh"
+       bazel test //ruby/... $bazel_args --define=ruby_platform=java"
   else
     bash --login -c \
       "rvm install $version && rvm use $version && \
        which ruby && \
        git clean -f && \
        gem install --no-document bundler -v 1.17.3 && bundle && \
-       rake test && \
-       rake gc_test && \
-       cd ../conformance && make ${RUBY_CONFORMANCE} && \
-       cd ../ruby/compatibility_tests/v3.0.0 && \
-       cp -R ../../lib lib && ./test.sh"
+       bazel test //ruby/... $bazel_args --define=ruby_platform=c"
   fi
 }
 
diff --git a/src/BUILD.bazel b/src/BUILD.bazel
index bd43afb..a34c021 100644
--- a/src/BUILD.bazel
+++ b/src/BUILD.bazel
@@ -4,6 +4,7 @@
 
 # Most rules are under google/protobuf. This package exists for convenience.
 load("@rules_pkg//:mappings.bzl", "pkg_filegroup", "pkg_files", "strip_prefix")
+load("//conformance:defs.bzl", "conformance_test")
 
 pkg_files(
     name = "dist_files",
@@ -33,3 +34,10 @@
     ],
     visibility = ["//pkg:__pkg__"],
 )
+
+conformance_test(
+    name = "conformance_test",
+    failure_list = "//conformance:failure_list_cpp.txt",
+    testee = "//conformance:conformance_cpp",
+    text_format_failure_list = "//conformance:text_format_failure_list_cpp.txt",
+)
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644
index dcf43bc..0000000
--- a/src/Makefile.am
+++ /dev/null
@@ -1,942 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-if HAVE_ZLIB
-GZCHECKPROGRAMS = zcgzip zcgunzip
-GZHEADERS = google/protobuf/io/gzip_stream.h
-GZTESTS = google/protobuf/io/gzip_stream_unittest.sh
-ZLIB_DEF = -DHAVE_ZLIB=1
-else
-GZCHECKPROGRAMS =
-GZHEADERS =
-GZTESTS =
-ZLIB_DEF =
-endif
-
-if HAVE_PTHREAD
-PTHREAD_DEF = -DHAVE_PTHREAD=1
-else
-PTHREAD_DEF =
-endif
-
-PROTOBUF_VERSION = 3.21.5
-
-if GCC
-# Turn on all warnings except for sign comparison (we ignore sign comparison
-# in Google so our code base have tons of such warnings).
-NO_OPT_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF) -Wall -Wno-sign-compare
-else
-NO_OPT_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF)
-endif
-
-AM_CXXFLAGS = $(NO_OPT_CXXFLAGS) $(PROTOBUF_OPT_FLAG)
-
-AM_LDFLAGS = $(PTHREAD_CFLAGS) ${LIBLOG_LIBS}
-
-# If I say "dist_include_DATA", automake complains that $(includedir) is not
-# a "legitimate" directory for DATA.  Screw you, automake.
-protodir = $(includedir)
-
-# If you are adding new files here, also remember to change the build files for
-# all other languages, //protoc-artifacts/build-zip.sh and run
-# //update_file_list.sh for bazel.
-nobase_dist_proto_DATA =                \
-  google/protobuf/any.proto             \
-  google/protobuf/api.proto             \
-  google/protobuf/compiler/plugin.proto \
-  google/protobuf/descriptor.proto      \
-  google/protobuf/duration.proto        \
-  google/protobuf/empty.proto           \
-  google/protobuf/field_mask.proto      \
-  google/protobuf/source_context.proto  \
-  google/protobuf/struct.proto          \
-  google/protobuf/timestamp.proto       \
-  google/protobuf/type.proto            \
-  google/protobuf/wrappers.proto
-
-# Not sure why these don't get cleaned automatically.
-clean-local:
-	rm -f *.loT
-
-CLEANFILES = $(protoc_outputs) unittest_proto_middleman \
-             testzip.jar testzip.list testzip.proto testzip.zip \
-             no_warning_test.cc
-
-MAINTAINERCLEANFILES =   \
-  Makefile.in
-
-nobase_include_HEADERS =                                         \
-  google/protobuf/any.h                                          \
-  google/protobuf/any.pb.h                                       \
-  google/protobuf/api.pb.h                                       \
-  google/protobuf/arena.h                                        \
-  google/protobuf/arena_impl.h                                   \
-  google/protobuf/arenastring.h                                  \
-  google/protobuf/arenaz_sampler.h                               \
-  google/protobuf/compiler/code_generator.h                      \
-  google/protobuf/compiler/command_line_interface.h              \
-  google/protobuf/compiler/cpp/cpp_generator.h                   \
-  google/protobuf/compiler/cpp/file.h                            \
-  google/protobuf/compiler/cpp/generator.h                       \
-  google/protobuf/compiler/cpp/helpers.h                         \
-  google/protobuf/compiler/cpp/names.h                           \
-  google/protobuf/compiler/csharp/csharp_doc_comment.h           \
-  google/protobuf/compiler/csharp/csharp_generator.h             \
-  google/protobuf/compiler/csharp/csharp_names.h                 \
-  google/protobuf/compiler/csharp/csharp_options.h               \
-  google/protobuf/compiler/importer.h                            \
-  google/protobuf/compiler/java/generator.h                      \
-  google/protobuf/compiler/java/java_generator.h                 \
-  google/protobuf/compiler/java/kotlin_generator.h               \
-  google/protobuf/compiler/java/names.h                          \
-  google/protobuf/compiler/objectivec/objectivec_generator.h     \
-  google/protobuf/compiler/objectivec/objectivec_helpers.h       \
-  google/protobuf/compiler/parser.h                              \
-  google/protobuf/compiler/php/php_generator.h                   \
-  google/protobuf/compiler/plugin.h                              \
-  google/protobuf/compiler/plugin.pb.h                           \
-  google/protobuf/compiler/python/generator.h                    \
-  google/protobuf/compiler/python/pyi_generator.h                \
-  google/protobuf/compiler/python/python_generator.h             \
-  google/protobuf/compiler/ruby/ruby_generator.h                 \
-  google/protobuf/descriptor.h                                   \
-  google/protobuf/descriptor.pb.h                                \
-  google/protobuf/descriptor_database.h                          \
-  google/protobuf/duration.pb.h                                  \
-  google/protobuf/dynamic_message.h                              \
-  google/protobuf/empty.pb.h                                     \
-  google/protobuf/endian.h                                       \
-  google/protobuf/explicitly_constructed.h                       \
-  google/protobuf/extension_set.h                                \
-  google/protobuf/extension_set_inl.h                            \
-  google/protobuf/field_access_listener.h                        \
-  google/protobuf/field_mask.pb.h                                \
-  google/protobuf/generated_enum_reflection.h                    \
-  google/protobuf/generated_enum_util.h                          \
-  google/protobuf/generated_message_bases.h                      \
-  google/protobuf/generated_message_reflection.h                 \
-  google/protobuf/generated_message_tctable_decl.h               \
-  google/protobuf/generated_message_tctable_gen.h                \
-  google/protobuf/generated_message_tctable_impl.h               \
-  google/protobuf/generated_message_util.h                       \
-  google/protobuf/has_bits.h                                     \
-  google/protobuf/implicit_weak_message.h                        \
-  google/protobuf/inlined_string_field.h                         \
-  google/protobuf/io/coded_stream.h                              \
-  $(GZHEADERS)                                                   \
-  google/protobuf/io/io_win32.h                                  \
-  google/protobuf/io/printer.h                                   \
-  google/protobuf/io/strtod.h                                    \
-  google/protobuf/io/tokenizer.h                                 \
-  google/protobuf/io/zero_copy_stream.h                          \
-  google/protobuf/io/zero_copy_stream_impl.h                     \
-  google/protobuf/io/zero_copy_stream_impl_lite.h                \
-  google/protobuf/map.h                                          \
-  google/protobuf/map_entry.h                                    \
-  google/protobuf/map_entry_lite.h                               \
-  google/protobuf/map_field.h                                    \
-  google/protobuf/map_field_inl.h                                \
-  google/protobuf/map_field_lite.h                               \
-  google/protobuf/map_type_handler.h                             \
-  google/protobuf/message.h                                      \
-  google/protobuf/message_lite.h                                 \
-  google/protobuf/metadata.h                                     \
-  google/protobuf/metadata_lite.h                                \
-  google/protobuf/parse_context.h                                \
-  google/protobuf/port.h                                         \
-  google/protobuf/port_def.inc                                   \
-  google/protobuf/port_undef.inc                                 \
-  google/protobuf/reflection.h                                   \
-  google/protobuf/reflection_internal.h                          \
-  google/protobuf/reflection_ops.h                               \
-  google/protobuf/repeated_field.h                               \
-  google/protobuf/repeated_ptr_field.h                           \
-  google/protobuf/service.h                                      \
-  google/protobuf/source_context.pb.h                            \
-  google/protobuf/struct.pb.h                                    \
-  google/protobuf/stubs/bytestream.h                             \
-  google/protobuf/stubs/callback.h                               \
-  google/protobuf/stubs/casts.h                                  \
-  google/protobuf/stubs/common.h                                 \
-  google/protobuf/stubs/hash.h                                   \
-  google/protobuf/stubs/logging.h                                \
-  google/protobuf/stubs/macros.h                                 \
-  google/protobuf/stubs/map_util.h                               \
-  google/protobuf/stubs/mutex.h                                  \
-  google/protobuf/stubs/once.h                                   \
-  google/protobuf/stubs/platform_macros.h                        \
-  google/protobuf/stubs/port.h                                   \
-  google/protobuf/stubs/status.h                                 \
-  google/protobuf/stubs/stl_util.h                               \
-  google/protobuf/stubs/stringpiece.h                            \
-  google/protobuf/stubs/strutil.h                                \
-  google/protobuf/stubs/template_util.h                          \
-  google/protobuf/text_format.h                                  \
-  google/protobuf/timestamp.pb.h                                 \
-  google/protobuf/type.pb.h                                      \
-  google/protobuf/unknown_field_set.h                            \
-  google/protobuf/util/delimited_message_util.h                  \
-  google/protobuf/util/field_comparator.h                        \
-  google/protobuf/util/field_mask_util.h                         \
-  google/protobuf/util/json_util.h                               \
-  google/protobuf/util/zero_copy_sink.h                          \
-  google/protobuf/util/message_differencer.h                     \
-  google/protobuf/util/time_util.h                               \
-  google/protobuf/util/type_resolver.h                           \
-  google/protobuf/util/type_resolver_util.h                      \
-  google/protobuf/wire_format.h                                  \
-  google/protobuf/wire_format_lite.h                             \
-  google/protobuf/wrappers.pb.h
-
-lib_LTLIBRARIES = libprotobuf-lite.la libprotobuf.la libprotoc.la
-
-libprotobuf_lite_la_LIBADD = $(PTHREAD_LIBS) $(LIBATOMIC_LIBS)
-libprotobuf_lite_la_LDFLAGS = -release $(PROTOBUF_VERSION) -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotobuf_lite_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotobuf-lite.map
-EXTRA_libprotobuf_lite_la_DEPENDENCIES = libprotobuf-lite.map
-endif
-libprotobuf_lite_la_SOURCES =                                  \
-  google/protobuf/any_lite.cc                                  \
-  google/protobuf/arena.cc                                     \
-  google/protobuf/arenastring.cc                               \
-  google/protobuf/arenaz_sampler.cc                            \
-  google/protobuf/extension_set.cc                             \
-  google/protobuf/generated_enum_util.cc                       \
-  google/protobuf/generated_message_tctable_lite.cc            \
-  google/protobuf/generated_message_util.cc                    \
-  google/protobuf/implicit_weak_message.cc                     \
-  google/protobuf/inlined_string_field.cc                      \
-  google/protobuf/io/coded_stream.cc                           \
-  google/protobuf/io/io_win32.cc                               \
-  google/protobuf/io/strtod.cc                                 \
-  google/protobuf/io/zero_copy_stream.cc                       \
-  google/protobuf/io/zero_copy_stream_impl.cc                  \
-  google/protobuf/io/zero_copy_stream_impl_lite.cc             \
-  google/protobuf/map.cc                                       \
-  google/protobuf/message_lite.cc                              \
-  google/protobuf/parse_context.cc                             \
-  google/protobuf/repeated_field.cc                            \
-  google/protobuf/repeated_ptr_field.cc                        \
-  google/protobuf/string_member_robber.h                       \
-  google/protobuf/stubs/bytestream.cc                          \
-  google/protobuf/stubs/common.cc                              \
-  google/protobuf/stubs/int128.cc                              \
-  google/protobuf/stubs/int128.h                               \
-  google/protobuf/stubs/mathutil.h                             \
-  google/protobuf/stubs/status.cc                              \
-  google/protobuf/stubs/status_macros.h                        \
-  google/protobuf/stubs/statusor.cc                            \
-  google/protobuf/stubs/statusor.h                             \
-  google/protobuf/stubs/stringpiece.cc                         \
-  google/protobuf/stubs/stringprintf.cc                        \
-  google/protobuf/stubs/stringprintf.h                         \
-  google/protobuf/stubs/structurally_valid.cc                  \
-  google/protobuf/stubs/strutil.cc                             \
-  google/protobuf/stubs/time.cc                                \
-  google/protobuf/stubs/time.h                                 \
-  google/protobuf/wire_format_lite.cc
-
-libprotobuf_la_LIBADD = $(PTHREAD_LIBS) $(LIBATOMIC_LIBS)
-libprotobuf_la_LDFLAGS = -release $(PROTOBUF_VERSION) -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotobuf_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotobuf.map
-EXTRA_libprotobuf_la_DEPENDENCIES = libprotobuf.map
-endif
-libprotobuf_la_SOURCES =                                       \
-  $(libprotobuf_lite_la_SOURCES)                               \
-  google/protobuf/any.cc                                       \
-  google/protobuf/any.pb.cc                                    \
-  google/protobuf/api.pb.cc                                    \
-  google/protobuf/compiler/importer.cc                         \
-  google/protobuf/compiler/parser.cc                           \
-  google/protobuf/descriptor.cc                                \
-  google/protobuf/descriptor.pb.cc                             \
-  google/protobuf/descriptor_database.cc                       \
-  google/protobuf/duration.pb.cc                               \
-  google/protobuf/dynamic_message.cc                           \
-  google/protobuf/empty.pb.cc                                  \
-  google/protobuf/extension_set_heavy.cc                       \
-  google/protobuf/field_mask.pb.cc                             \
-  google/protobuf/generated_message_bases.cc                   \
-  google/protobuf/generated_message_reflection.cc              \
-  google/protobuf/generated_message_tctable_gen.cc             \
-  google/protobuf/generated_message_tctable_full.cc            \
-  google/protobuf/io/gzip_stream.cc                            \
-  google/protobuf/io/printer.cc                                \
-  google/protobuf/io/tokenizer.cc                              \
-  google/protobuf/map_field.cc                                 \
-  google/protobuf/message.cc                                   \
-  google/protobuf/reflection_ops.cc                            \
-  google/protobuf/service.cc                                   \
-  google/protobuf/source_context.pb.cc                         \
-  google/protobuf/struct.pb.cc                                 \
-  google/protobuf/stubs/substitute.cc                          \
-  google/protobuf/stubs/substitute.h                           \
-  google/protobuf/text_format.cc                               \
-  google/protobuf/timestamp.pb.cc                              \
-  google/protobuf/type.pb.cc                                   \
-  google/protobuf/unknown_field_set.cc                         \
-  google/protobuf/util/delimited_message_util.cc               \
-  google/protobuf/util/field_comparator.cc                     \
-  google/protobuf/util/field_mask_util.cc                      \
-  google/protobuf/util/internal/constants.h                    \
-  google/protobuf/util/internal/datapiece.cc                   \
-  google/protobuf/util/internal/datapiece.h                    \
-  google/protobuf/util/internal/default_value_objectwriter.cc  \
-  google/protobuf/util/internal/default_value_objectwriter.h   \
-  google/protobuf/util/internal/error_listener.cc              \
-  google/protobuf/util/internal/error_listener.h               \
-  google/protobuf/util/internal/expecting_objectwriter.h       \
-  google/protobuf/util/internal/field_mask_utility.cc          \
-  google/protobuf/util/internal/field_mask_utility.h           \
-  google/protobuf/util/internal/json_escaping.cc               \
-  google/protobuf/util/internal/json_escaping.h                \
-  google/protobuf/util/internal/json_objectwriter.cc           \
-  google/protobuf/util/internal/json_objectwriter.h            \
-  google/protobuf/util/internal/json_stream_parser.cc          \
-  google/protobuf/util/internal/json_stream_parser.h           \
-  google/protobuf/util/internal/location_tracker.h             \
-  google/protobuf/util/internal/mock_error_listener.h          \
-  google/protobuf/util/internal/object_location_tracker.h      \
-  google/protobuf/util/internal/object_source.h                \
-  google/protobuf/util/internal/object_writer.cc               \
-  google/protobuf/util/internal/object_writer.h                \
-  google/protobuf/util/internal/proto_writer.cc                \
-  google/protobuf/util/internal/proto_writer.h                 \
-  google/protobuf/util/internal/protostream_objectsource.cc    \
-  google/protobuf/util/internal/protostream_objectsource.h     \
-  google/protobuf/util/internal/protostream_objectwriter.cc    \
-  google/protobuf/util/internal/protostream_objectwriter.h     \
-  google/protobuf/util/internal/structured_objectwriter.h      \
-  google/protobuf/util/internal/type_info.cc                   \
-  google/protobuf/util/internal/type_info.h                    \
-  google/protobuf/util/internal/type_info_test_helper.h        \
-  google/protobuf/util/internal/utility.cc                     \
-  google/protobuf/util/internal/utility.h                      \
-  google/protobuf/util/json_util.cc                            \
-  google/protobuf/util/zero_copy_sink.cc                       \
-  google/protobuf/util/message_differencer.cc                  \
-  google/protobuf/util/time_util.cc                            \
-  google/protobuf/util/type_resolver_util.cc                   \
-  google/protobuf/wire_format.cc                               \
-  google/protobuf/wrappers.pb.cc
-
-nodist_libprotobuf_la_SOURCES = $(nodist_libprotobuf_lite_la_SOURCES)
-
-libprotoc_la_LIBADD = $(PTHREAD_LIBS) libprotobuf.la
-libprotoc_la_LDFLAGS = -release $(PROTOBUF_VERSION) -export-dynamic -no-undefined
-if HAVE_LD_VERSION_SCRIPT
-libprotoc_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libprotoc.map
-EXTRA_libprotoc_la_DEPENDENCIES = libprotoc.map
-endif
-libprotoc_la_SOURCES =                                         \
-  google/protobuf/compiler/code_generator.cc                   \
-  google/protobuf/compiler/command_line_interface.cc           \
-  google/protobuf/compiler/cpp/enum.cc                         \
-  google/protobuf/compiler/cpp/enum.h                          \
-  google/protobuf/compiler/cpp/enum_field.cc                   \
-  google/protobuf/compiler/cpp/enum_field.h                    \
-  google/protobuf/compiler/cpp/extension.cc                    \
-  google/protobuf/compiler/cpp/extension.h                     \
-  google/protobuf/compiler/cpp/field.cc                        \
-  google/protobuf/compiler/cpp/field.h                         \
-  google/protobuf/compiler/cpp/file.cc                         \
-  google/protobuf/compiler/cpp/generator.cc                    \
-  google/protobuf/compiler/cpp/helpers.cc                      \
-  google/protobuf/compiler/cpp/map_field.cc                    \
-  google/protobuf/compiler/cpp/map_field.h                     \
-  google/protobuf/compiler/cpp/message.cc                      \
-  google/protobuf/compiler/cpp/message.h                       \
-  google/protobuf/compiler/cpp/message_field.cc                \
-  google/protobuf/compiler/cpp/message_field.h                 \
-  google/protobuf/compiler/cpp/message_layout_helper.h         \
-  google/protobuf/compiler/cpp/options.h                       \
-  google/protobuf/compiler/cpp/padding_optimizer.cc            \
-  google/protobuf/compiler/cpp/padding_optimizer.h             \
-  google/protobuf/compiler/cpp/parse_function_generator.cc     \
-  google/protobuf/compiler/cpp/parse_function_generator.h      \
-  google/protobuf/compiler/cpp/primitive_field.cc              \
-  google/protobuf/compiler/cpp/primitive_field.h               \
-  google/protobuf/compiler/cpp/service.cc                      \
-  google/protobuf/compiler/cpp/service.h                       \
-  google/protobuf/compiler/cpp/string_field.cc                 \
-  google/protobuf/compiler/cpp/string_field.h                  \
-  google/protobuf/compiler/csharp/csharp_doc_comment.cc        \
-  google/protobuf/compiler/csharp/csharp_enum.cc               \
-  google/protobuf/compiler/csharp/csharp_enum.h                \
-  google/protobuf/compiler/csharp/csharp_enum_field.cc         \
-  google/protobuf/compiler/csharp/csharp_enum_field.h          \
-  google/protobuf/compiler/csharp/csharp_field_base.cc         \
-  google/protobuf/compiler/csharp/csharp_field_base.h          \
-  google/protobuf/compiler/csharp/csharp_generator.cc          \
-  google/protobuf/compiler/csharp/csharp_helpers.cc            \
-  google/protobuf/compiler/csharp/csharp_helpers.h             \
-  google/protobuf/compiler/csharp/csharp_map_field.cc          \
-  google/protobuf/compiler/csharp/csharp_map_field.h           \
-  google/protobuf/compiler/csharp/csharp_message.cc            \
-  google/protobuf/compiler/csharp/csharp_message.h             \
-  google/protobuf/compiler/csharp/csharp_message_field.cc      \
-  google/protobuf/compiler/csharp/csharp_message_field.h       \
-  google/protobuf/compiler/csharp/csharp_primitive_field.cc    \
-  google/protobuf/compiler/csharp/csharp_primitive_field.h     \
-  google/protobuf/compiler/csharp/csharp_reflection_class.cc   \
-  google/protobuf/compiler/csharp/csharp_reflection_class.h    \
-  google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc \
-  google/protobuf/compiler/csharp/csharp_repeated_enum_field.h \
-  google/protobuf/compiler/csharp/csharp_repeated_message_field.cc \
-  google/protobuf/compiler/csharp/csharp_repeated_message_field.h \
-  google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc \
-  google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h \
-  google/protobuf/compiler/csharp/csharp_source_generator_base.cc \
-  google/protobuf/compiler/csharp/csharp_source_generator_base.h \
-  google/protobuf/compiler/csharp/csharp_wrapper_field.cc      \
-  google/protobuf/compiler/csharp/csharp_wrapper_field.h       \
-  google/protobuf/compiler/java/context.cc                     \
-  google/protobuf/compiler/java/context.h                      \
-  google/protobuf/compiler/java/doc_comment.cc                 \
-  google/protobuf/compiler/java/doc_comment.h                  \
-  google/protobuf/compiler/java/enum.cc                        \
-  google/protobuf/compiler/java/enum.h                         \
-  google/protobuf/compiler/java/enum_field.cc                  \
-  google/protobuf/compiler/java/enum_field.h                   \
-  google/protobuf/compiler/java/enum_field_lite.cc             \
-  google/protobuf/compiler/java/enum_field_lite.h              \
-  google/protobuf/compiler/java/enum_lite.cc                   \
-  google/protobuf/compiler/java/enum_lite.h                    \
-  google/protobuf/compiler/java/extension.cc                   \
-  google/protobuf/compiler/java/extension.h                    \
-  google/protobuf/compiler/java/extension_lite.cc              \
-  google/protobuf/compiler/java/extension_lite.h               \
-  google/protobuf/compiler/java/field.cc                       \
-  google/protobuf/compiler/java/field.h                        \
-  google/protobuf/compiler/java/file.cc                        \
-  google/protobuf/compiler/java/file.h                         \
-  google/protobuf/compiler/java/generator.cc                   \
-  google/protobuf/compiler/java/generator_factory.cc           \
-  google/protobuf/compiler/java/generator_factory.h            \
-  google/protobuf/compiler/java/helpers.cc                     \
-  google/protobuf/compiler/java/helpers.h                      \
-  google/protobuf/compiler/java/kotlin_generator.cc            \
-  google/protobuf/compiler/java/map_field.cc                   \
-  google/protobuf/compiler/java/map_field.h                    \
-  google/protobuf/compiler/java/map_field_lite.cc              \
-  google/protobuf/compiler/java/map_field_lite.h               \
-  google/protobuf/compiler/java/message.cc                     \
-  google/protobuf/compiler/java/message.h                      \
-  google/protobuf/compiler/java/message_builder.cc             \
-  google/protobuf/compiler/java/message_builder.h              \
-  google/protobuf/compiler/java/message_builder_lite.cc        \
-  google/protobuf/compiler/java/message_builder_lite.h         \
-  google/protobuf/compiler/java/message_field.cc               \
-  google/protobuf/compiler/java/message_field.h                \
-  google/protobuf/compiler/java/message_field_lite.cc          \
-  google/protobuf/compiler/java/message_field_lite.h           \
-  google/protobuf/compiler/java/message_lite.cc                \
-  google/protobuf/compiler/java/message_lite.h                 \
-  google/protobuf/compiler/java/message_serialization.cc       \
-  google/protobuf/compiler/java/message_serialization.h        \
-  google/protobuf/compiler/java/name_resolver.cc               \
-  google/protobuf/compiler/java/name_resolver.h                \
-  google/protobuf/compiler/java/options.h                      \
-  google/protobuf/compiler/java/primitive_field.cc             \
-  google/protobuf/compiler/java/primitive_field.h              \
-  google/protobuf/compiler/java/primitive_field_lite.cc        \
-  google/protobuf/compiler/java/primitive_field_lite.h         \
-  google/protobuf/compiler/java/service.cc                     \
-  google/protobuf/compiler/java/service.h                      \
-  google/protobuf/compiler/java/shared_code_generator.cc       \
-  google/protobuf/compiler/java/shared_code_generator.h        \
-  google/protobuf/compiler/java/string_field.cc                \
-  google/protobuf/compiler/java/string_field.h                 \
-  google/protobuf/compiler/java/string_field_lite.cc           \
-  google/protobuf/compiler/java/string_field_lite.h            \
-  google/protobuf/compiler/objectivec/objectivec_enum.cc       \
-  google/protobuf/compiler/objectivec/objectivec_enum.h        \
-  google/protobuf/compiler/objectivec/objectivec_enum_field.cc \
-  google/protobuf/compiler/objectivec/objectivec_enum_field.h  \
-  google/protobuf/compiler/objectivec/objectivec_extension.cc  \
-  google/protobuf/compiler/objectivec/objectivec_extension.h   \
-  google/protobuf/compiler/objectivec/objectivec_field.cc      \
-  google/protobuf/compiler/objectivec/objectivec_field.h       \
-  google/protobuf/compiler/objectivec/objectivec_file.cc       \
-  google/protobuf/compiler/objectivec/objectivec_file.h        \
-  google/protobuf/compiler/objectivec/objectivec_generator.cc  \
-  google/protobuf/compiler/objectivec/objectivec_helpers.cc    \
-  google/protobuf/compiler/objectivec/objectivec_map_field.cc  \
-  google/protobuf/compiler/objectivec/objectivec_map_field.h   \
-  google/protobuf/compiler/objectivec/objectivec_message.cc    \
-  google/protobuf/compiler/objectivec/objectivec_message.h     \
-  google/protobuf/compiler/objectivec/objectivec_message_field.cc \
-  google/protobuf/compiler/objectivec/objectivec_message_field.h \
-  google/protobuf/compiler/objectivec/objectivec_nsobject_methods.h \
-  google/protobuf/compiler/objectivec/objectivec_oneof.cc      \
-  google/protobuf/compiler/objectivec/objectivec_oneof.h       \
-  google/protobuf/compiler/objectivec/objectivec_primitive_field.cc \
-  google/protobuf/compiler/objectivec/objectivec_primitive_field.h \
-  google/protobuf/compiler/php/php_generator.cc                \
-  google/protobuf/compiler/plugin.cc                           \
-  google/protobuf/compiler/plugin.pb.cc                        \
-  google/protobuf/compiler/python/generator.cc                 \
-  google/protobuf/compiler/python/helpers.cc                   \
-  google/protobuf/compiler/python/helpers.h                    \
-  google/protobuf/compiler/python/pyi_generator.cc             \
-  google/protobuf/compiler/ruby/ruby_generator.cc              \
-  google/protobuf/compiler/scc.h                               \
-  google/protobuf/compiler/subprocess.cc                       \
-  google/protobuf/compiler/subprocess.h                        \
-  google/protobuf/compiler/zip_writer.cc                       \
-  google/protobuf/compiler/zip_writer.h
-
-bin_PROGRAMS = protoc
-protoc_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
-protoc_SOURCES = google/protobuf/compiler/main.cc
-
-# Tests ==============================================================
-
-protoc_inputs =                                                   \
-  google/protobuf/any_test.proto                                  \
-  google/protobuf/compiler/cpp/test_bad_identifiers.proto         \
-  google/protobuf/compiler/cpp/test_large_enum_value.proto        \
-  google/protobuf/map_lite_unittest.proto                         \
-  google/protobuf/map_proto2_unittest.proto                       \
-  google/protobuf/map_unittest.proto                              \
-  google/protobuf/unittest.proto                                  \
-  google/protobuf/unittest_arena.proto                            \
-  google/protobuf/unittest_custom_options.proto                   \
-  google/protobuf/unittest_drop_unknown_fields.proto              \
-  google/protobuf/unittest_embed_optimize_for.proto               \
-  google/protobuf/unittest_empty.proto                            \
-  google/protobuf/unittest_enormous_descriptor.proto              \
-  google/protobuf/unittest_import.proto                           \
-  google/protobuf/unittest_import_lite.proto                      \
-  google/protobuf/unittest_import_public.proto                    \
-  google/protobuf/unittest_import_public_lite.proto               \
-  google/protobuf/unittest_lazy_dependencies.proto                \
-  google/protobuf/unittest_lazy_dependencies_custom_option.proto  \
-  google/protobuf/unittest_lazy_dependencies_enum.proto           \
-  google/protobuf/unittest_lite.proto                             \
-  google/protobuf/unittest_lite_imports_nonlite.proto             \
-  google/protobuf/unittest_mset.proto                             \
-  google/protobuf/unittest_mset_wire_format.proto                 \
-  google/protobuf/unittest_no_field_presence.proto                \
-  google/protobuf/unittest_no_generic_services.proto              \
-  google/protobuf/unittest_optimize_for.proto                     \
-  google/protobuf/unittest_preserve_unknown_enum.proto            \
-  google/protobuf/unittest_preserve_unknown_enum2.proto           \
-  google/protobuf/unittest_proto3.proto                           \
-  google/protobuf/unittest_proto3_arena.proto                     \
-  google/protobuf/unittest_proto3_arena_lite.proto                \
-  google/protobuf/unittest_proto3_lite.proto                      \
-  google/protobuf/unittest_proto3_optional.proto                  \
-  google/protobuf/unittest_well_known_types.proto                 \
-  google/protobuf/util/internal/testdata/anys.proto               \
-  google/protobuf/util/internal/testdata/books.proto              \
-  google/protobuf/util/internal/testdata/default_value.proto      \
-  google/protobuf/util/internal/testdata/default_value_test.proto \
-  google/protobuf/util/internal/testdata/field_mask.proto         \
-  google/protobuf/util/internal/testdata/maps.proto               \
-  google/protobuf/util/internal/testdata/oneofs.proto             \
-  google/protobuf/util/internal/testdata/proto3.proto             \
-  google/protobuf/util/internal/testdata/struct.proto             \
-  google/protobuf/util/internal/testdata/timestamp_duration.proto \
-  google/protobuf/util/internal/testdata/wrappers.proto           \
-  google/protobuf/util/json_format.proto                          \
-  google/protobuf/util/json_format_proto3.proto                   \
-  google/protobuf/util/message_differencer_unittest.proto
-
-EXTRA_DIST =                                                   \
-  $(protoc_inputs)                                             \
-  BUILD.bazel                                                  \
-  README.md                                                    \
-  file_lists.cmake                                             \
-  google/protobuf/BUILD.bazel                                  \
-  google/protobuf/compiler/BUILD.bazel                         \
-  google/protobuf/compiler/cpp/BUILD.bazel                     \
-  google/protobuf/compiler/csharp/BUILD.bazel                  \
-  google/protobuf/compiler/java/BUILD.bazel                    \
-  google/protobuf/compiler/objectivec/BUILD.bazel              \
-  google/protobuf/compiler/package_info.h                      \
-  google/protobuf/compiler/php/BUILD.bazel                     \
-  google/protobuf/compiler/python/BUILD.bazel                  \
-  google/protobuf/compiler/ruby/BUILD.bazel                    \
-  google/protobuf/compiler/ruby/ruby_generated_code.proto      \
-  google/protobuf/compiler/ruby/ruby_generated_code_pb.rb      \
-  google/protobuf/compiler/ruby/ruby_generated_code_proto2.proto \
-  google/protobuf/compiler/ruby/ruby_generated_code_proto2_import.proto \
-  google/protobuf/compiler/ruby/ruby_generated_code_proto2_pb.rb \
-  google/protobuf/compiler/ruby/ruby_generated_pkg_explicit.proto \
-  google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy.proto \
-  google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_legacy_pb.rb \
-  google/protobuf/compiler/ruby/ruby_generated_pkg_explicit_pb.rb \
-  google/protobuf/compiler/ruby/ruby_generated_pkg_implicit.proto \
-  google/protobuf/compiler/ruby/ruby_generated_pkg_implicit_pb.rb \
-  google/protobuf/compiler/zip_output_unittest.sh              \
-  google/protobuf/io/BUILD.bazel                               \
-  google/protobuf/io/gzip_stream.h                             \
-  google/protobuf/io/gzip_stream_unittest.sh                   \
-  google/protobuf/io/package_info.h                            \
-  google/protobuf/package_info.h                               \
-  google/protobuf/stubs/BUILD.bazel                            \
-  google/protobuf/test_messages_proto2.proto                   \
-  google/protobuf/test_messages_proto3.proto                   \
-  google/protobuf/testdata/bad_utf8_string                     \
-  google/protobuf/testdata/golden_message                      \
-  google/protobuf/testdata/golden_message_maps                 \
-  google/protobuf/testdata/golden_message_oneof_implemented    \
-  google/protobuf/testdata/golden_message_proto3               \
-  google/protobuf/testdata/golden_packed_fields_message        \
-  google/protobuf/testdata/map_test_data.txt                   \
-  google/protobuf/testdata/text_format_unittest_data.txt       \
-  google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt \
-  google/protobuf/testdata/text_format_unittest_data_pointy.txt \
-  google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt \
-  google/protobuf/testdata/text_format_unittest_extensions_data.txt \
-  google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt \
-  google/protobuf/testing/BUILD.bazel                          \
-  google/protobuf/util/BUILD.bazel                             \
-  google/protobuf/util/internal/BUILD.bazel                    \
-  google/protobuf/util/package_info.h                          \
-  libprotobuf-lite.map                                         \
-  libprotobuf.map                                              \
-  libprotoc.map                                                \
-  solaris/libstdc++.la                                        
-
-protoc_lite_outputs =                                          \
-  google/protobuf/map_lite_unittest.pb.cc                      \
-  google/protobuf/map_lite_unittest.pb.h                       \
-  google/protobuf/unittest_import_lite.pb.cc                   \
-  google/protobuf/unittest_import_lite.pb.h                    \
-  google/protobuf/unittest_import_public_lite.pb.cc            \
-  google/protobuf/unittest_import_public_lite.pb.h             \
-  google/protobuf/unittest_lite.pb.cc                          \
-  google/protobuf/unittest_lite.pb.h
-
-protoc_outputs =                                                  \
-  $(protoc_lite_outputs)                                          \
-  google/protobuf/any_test.pb.cc                                  \
-  google/protobuf/any_test.pb.h                                   \
-  google/protobuf/compiler/cpp/test_bad_identifiers.pb.cc         \
-  google/protobuf/compiler/cpp/test_bad_identifiers.pb.h          \
-  google/protobuf/compiler/cpp/test_large_enum_value.pb.cc        \
-  google/protobuf/compiler/cpp/test_large_enum_value.pb.h         \
-  google/protobuf/map_proto2_unittest.pb.cc                       \
-  google/protobuf/map_proto2_unittest.pb.h                        \
-  google/protobuf/map_unittest.pb.cc                              \
-  google/protobuf/map_unittest.pb.h                               \
-  google/protobuf/unittest.pb.cc                                  \
-  google/protobuf/unittest.pb.h                                   \
-  google/protobuf/unittest_arena.pb.cc                            \
-  google/protobuf/unittest_arena.pb.h                             \
-  google/protobuf/unittest_custom_options.pb.cc                   \
-  google/protobuf/unittest_custom_options.pb.h                    \
-  google/protobuf/unittest_drop_unknown_fields.pb.cc              \
-  google/protobuf/unittest_drop_unknown_fields.pb.h               \
-  google/protobuf/unittest_embed_optimize_for.pb.cc               \
-  google/protobuf/unittest_embed_optimize_for.pb.h                \
-  google/protobuf/unittest_empty.pb.cc                            \
-  google/protobuf/unittest_empty.pb.h                             \
-  google/protobuf/unittest_enormous_descriptor.pb.cc              \
-  google/protobuf/unittest_enormous_descriptor.pb.h               \
-  google/protobuf/unittest_import.pb.cc                           \
-  google/protobuf/unittest_import.pb.h                            \
-  google/protobuf/unittest_import_public.pb.cc                    \
-  google/protobuf/unittest_import_public.pb.h                     \
-  google/protobuf/unittest_lazy_dependencies.pb.cc                \
-  google/protobuf/unittest_lazy_dependencies.pb.h                 \
-  google/protobuf/unittest_lazy_dependencies_custom_option.pb.cc  \
-  google/protobuf/unittest_lazy_dependencies_custom_option.pb.h   \
-  google/protobuf/unittest_lazy_dependencies_enum.pb.cc           \
-  google/protobuf/unittest_lazy_dependencies_enum.pb.h            \
-  google/protobuf/unittest_lite_imports_nonlite.pb.cc             \
-  google/protobuf/unittest_lite_imports_nonlite.pb.h              \
-  google/protobuf/unittest_mset.pb.cc                             \
-  google/protobuf/unittest_mset.pb.h                              \
-  google/protobuf/unittest_mset_wire_format.pb.cc                 \
-  google/protobuf/unittest_mset_wire_format.pb.h                  \
-  google/protobuf/unittest_no_field_presence.pb.cc                \
-  google/protobuf/unittest_no_field_presence.pb.h                 \
-  google/protobuf/unittest_no_generic_services.pb.cc              \
-  google/protobuf/unittest_no_generic_services.pb.h               \
-  google/protobuf/unittest_optimize_for.pb.cc                     \
-  google/protobuf/unittest_optimize_for.pb.h                      \
-  google/protobuf/unittest_preserve_unknown_enum.pb.cc            \
-  google/protobuf/unittest_preserve_unknown_enum.pb.h             \
-  google/protobuf/unittest_preserve_unknown_enum2.pb.cc           \
-  google/protobuf/unittest_preserve_unknown_enum2.pb.h            \
-  google/protobuf/unittest_proto3.pb.cc                           \
-  google/protobuf/unittest_proto3.pb.h                            \
-  google/protobuf/unittest_proto3_arena.pb.cc                     \
-  google/protobuf/unittest_proto3_arena.pb.h                      \
-  google/protobuf/unittest_proto3_arena_lite.pb.cc                \
-  google/protobuf/unittest_proto3_arena_lite.pb.h                 \
-  google/protobuf/unittest_proto3_lite.pb.cc                      \
-  google/protobuf/unittest_proto3_lite.pb.h                       \
-  google/protobuf/unittest_proto3_optional.pb.cc                  \
-  google/protobuf/unittest_proto3_optional.pb.h                   \
-  google/protobuf/unittest_well_known_types.pb.cc                 \
-  google/protobuf/unittest_well_known_types.pb.h                  \
-  google/protobuf/util/internal/testdata/anys.pb.cc               \
-  google/protobuf/util/internal/testdata/anys.pb.h                \
-  google/protobuf/util/internal/testdata/books.pb.cc              \
-  google/protobuf/util/internal/testdata/books.pb.h               \
-  google/protobuf/util/internal/testdata/default_value.pb.cc      \
-  google/protobuf/util/internal/testdata/default_value.pb.h       \
-  google/protobuf/util/internal/testdata/default_value_test.pb.cc \
-  google/protobuf/util/internal/testdata/default_value_test.pb.h  \
-  google/protobuf/util/internal/testdata/field_mask.pb.cc         \
-  google/protobuf/util/internal/testdata/field_mask.pb.h          \
-  google/protobuf/util/internal/testdata/maps.pb.cc               \
-  google/protobuf/util/internal/testdata/maps.pb.h                \
-  google/protobuf/util/internal/testdata/oneofs.pb.cc             \
-  google/protobuf/util/internal/testdata/oneofs.pb.h              \
-  google/protobuf/util/internal/testdata/proto3.pb.cc             \
-  google/protobuf/util/internal/testdata/proto3.pb.h              \
-  google/protobuf/util/internal/testdata/struct.pb.cc             \
-  google/protobuf/util/internal/testdata/struct.pb.h              \
-  google/protobuf/util/internal/testdata/timestamp_duration.pb.cc \
-  google/protobuf/util/internal/testdata/timestamp_duration.pb.h  \
-  google/protobuf/util/internal/testdata/wrappers.pb.cc           \
-  google/protobuf/util/internal/testdata/wrappers.pb.h            \
-  google/protobuf/util/json_format.pb.cc                          \
-  google/protobuf/util/json_format.pb.h                           \
-  google/protobuf/util/json_format_proto3.pb.cc                   \
-  google/protobuf/util/json_format_proto3.pb.h                    \
-  google/protobuf/util/message_differencer_unittest.pb.cc         \
-  google/protobuf/util/message_differencer_unittest.pb.h
-
-if USE_EXTERNAL_PROTOC
-
-unittest_proto_middleman: $(protoc_inputs)
-	$(PROTOC) -I$(srcdir) --cpp_out=. $^
-	touch unittest_proto_middleman
-
-else
-
-# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
-# relative to srcdir, which may not be the same as the current directory when
-# building out-of-tree.
-unittest_proto_middleman: protoc$(EXEEXT) $(protoc_inputs)
-	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/protoc$(EXEEXT) -I. --cpp_out=$$oldpwd $(protoc_inputs) --experimental_allow_proto3_optional )
-	touch unittest_proto_middleman
-
-endif
-
-$(protoc_outputs): unittest_proto_middleman
-
-COMMON_TEST_SOURCES =                                          \
-  $(COMMON_LITE_TEST_SOURCES)                                  \
-  google/protobuf/compiler/cpp/unittest.h                      \
-  google/protobuf/map_test_util.h                              \
-  google/protobuf/map_test_util.inc                            \
-  google/protobuf/reflection_tester.cc                         \
-  google/protobuf/reflection_tester.h                          \
-  google/protobuf/test_util.cc                                 \
-  google/protobuf/test_util.h                                  \
-  google/protobuf/test_util.inc                                \
-  google/protobuf/test_util2.h                                 \
-  google/protobuf/testing/file.cc                              \
-  google/protobuf/testing/file.h                               \
-  google/protobuf/testing/googletest.cc                        \
-  google/protobuf/testing/googletest.h
-
-GOOGLETEST_BUILD_DIR=../third_party/googletest/googletest
-GOOGLEMOCK_BUILD_DIR=../third_party/googletest/googlemock
-GOOGLETEST_SRC_DIR=$(srcdir)/../third_party/googletest/googletest
-GOOGLEMOCK_SRC_DIR=$(srcdir)/../third_party/googletest/googlemock
-check_PROGRAMS = protoc protobuf-test protobuf-lazy-descriptor-test \
-                 protobuf-lite-test test_plugin protobuf-lite-arena-test \
-                 no-warning-test $(GZCHECKPROGRAMS)
-protobuf_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \
-                      $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la     \
-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la     \
-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_test_CPPFLAGS = -I$(GOOGLETEST_SRC_DIR)/include \
-                         -I$(GOOGLEMOCK_SRC_DIR)/include
-# Disable optimization for tests unless the user explicitly asked for it,
-# since test_util.cc takes forever to compile with optimization (with GCC).
-# See configure.ac for more info.
-protobuf_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_test_SOURCES =                                        \
-  $(COMMON_TEST_SOURCES)                                       \
-  google/protobuf/any_test.cc                                  \
-  google/protobuf/arena_unittest.cc                            \
-  google/protobuf/arenastring_unittest.cc                      \
-  google/protobuf/arenaz_sampler_test.cc                       \
-  google/protobuf/compiler/annotation_test_util.cc             \
-  google/protobuf/compiler/annotation_test_util.h              \
-  google/protobuf/compiler/command_line_interface_unittest.cc  \
-  google/protobuf/compiler/cpp/bootstrap_unittest.cc           \
-  google/protobuf/compiler/cpp/message_size_unittest.cc        \
-  google/protobuf/compiler/cpp/metadata_test.cc                \
-  google/protobuf/compiler/cpp/move_unittest.cc                \
-  google/protobuf/compiler/cpp/plugin_unittest.cc              \
-  google/protobuf/compiler/cpp/unittest.cc                     \
-  google/protobuf/compiler/cpp/unittest.inc                    \
-  google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc \
-  google/protobuf/compiler/csharp/csharp_generator_unittest.cc \
-  google/protobuf/compiler/importer_unittest.cc                \
-  google/protobuf/compiler/java/doc_comment_unittest.cc        \
-  google/protobuf/compiler/java/message_serialization_unittest.cc \
-  google/protobuf/compiler/java/plugin_unittest.cc             \
-  google/protobuf/compiler/mock_code_generator.cc              \
-  google/protobuf/compiler/mock_code_generator.h               \
-  google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc \
-  google/protobuf/compiler/parser_unittest.cc                  \
-  google/protobuf/compiler/python/plugin_unittest.cc           \
-  google/protobuf/compiler/ruby/ruby_generator_unittest.cc     \
-  google/protobuf/descriptor_database_unittest.cc              \
-  google/protobuf/descriptor_unittest.cc                       \
-  google/protobuf/drop_unknown_fields_test.cc                  \
-  google/protobuf/dynamic_message_unittest.cc                  \
-  google/protobuf/extension_set_unittest.cc                    \
-  google/protobuf/generated_message_reflection_unittest.cc     \
-  google/protobuf/generated_message_tctable_lite_test.cc       \
-  google/protobuf/inlined_string_field_unittest.cc             \
-  google/protobuf/io/coded_stream_unittest.cc                  \
-  google/protobuf/io/io_win32_unittest.cc                      \
-  google/protobuf/io/printer_unittest.cc                       \
-  google/protobuf/io/tokenizer_unittest.cc                     \
-  google/protobuf/io/zero_copy_stream_unittest.cc              \
-  google/protobuf/map_field_test.cc                            \
-  google/protobuf/map_test.cc                                  \
-  google/protobuf/map_test.inc                                 \
-  google/protobuf/message_unittest.cc                          \
-  google/protobuf/message_unittest.inc                         \
-  google/protobuf/no_field_presence_test.cc                    \
-  google/protobuf/preserve_unknown_enum_test.cc                \
-  google/protobuf/proto3_arena_lite_unittest.cc                \
-  google/protobuf/proto3_arena_unittest.cc                     \
-  google/protobuf/proto3_lite_unittest.cc                      \
-  google/protobuf/proto3_lite_unittest.inc                     \
-  google/protobuf/reflection_ops_unittest.cc                   \
-  google/protobuf/repeated_field_reflection_unittest.cc        \
-  google/protobuf/repeated_field_unittest.cc                   \
-  google/protobuf/stubs/bytestream_unittest.cc                 \
-  google/protobuf/stubs/common_unittest.cc                     \
-  google/protobuf/stubs/int128_unittest.cc                     \
-  google/protobuf/stubs/status_test.cc                         \
-  google/protobuf/stubs/statusor_test.cc                       \
-  google/protobuf/stubs/stringpiece_unittest.cc                \
-  google/protobuf/stubs/stringprintf_unittest.cc               \
-  google/protobuf/stubs/structurally_valid_unittest.cc         \
-  google/protobuf/stubs/strutil_unittest.cc                    \
-  google/protobuf/stubs/template_util_unittest.cc              \
-  google/protobuf/stubs/time_test.cc                           \
-  google/protobuf/text_format_unittest.cc                      \
-  google/protobuf/unknown_field_set_unittest.cc                \
-  google/protobuf/util/delimited_message_util_test.cc          \
-  google/protobuf/util/field_comparator_test.cc                \
-  google/protobuf/util/field_mask_util_test.cc                 \
-  google/protobuf/util/internal/default_value_objectwriter_test.cc \
-  google/protobuf/util/internal/json_objectwriter_test.cc      \
-  google/protobuf/util/internal/json_stream_parser_test.cc     \
-  google/protobuf/util/internal/protostream_objectsource_test.cc \
-  google/protobuf/util/internal/protostream_objectwriter_test.cc \
-  google/protobuf/util/internal/type_info_test_helper.cc       \
-  google/protobuf/util/json_util_test.cc                       \
-  google/protobuf/util/zero_copy_sink_test.cc                  \
-  google/protobuf/util/message_differencer_unittest.cc         \
-  google/protobuf/util/time_util_test.cc                       \
-  google/protobuf/util/type_resolver_util_test.cc              \
-  google/protobuf/well_known_types_unittest.cc                 \
-  google/protobuf/wire_format_unittest.cc                      \
-  google/protobuf/wire_format_unittest.inc
-
-nodist_protobuf_test_SOURCES = $(protoc_outputs)
-$(am_protobuf_test_OBJECTS): unittest_proto_middleman
-
-# Run cpp_unittest again with PROTOBUF_TEST_NO_DESCRIPTORS defined.
-protobuf_lazy_descriptor_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la \
-                      libprotoc.la                                   \
-                      $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la        \
-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la        \
-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_lazy_descriptor_test_CPPFLAGS = -I$(GOOGLEMOCK_SRC_DIR)/include \
-                                         -I$(GOOGLETEST_SRC_DIR)/include \
-                                         -DPROTOBUF_TEST_NO_DESCRIPTORS
-protobuf_lazy_descriptor_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_lazy_descriptor_test_SOURCES =                        \
-  google/protobuf/compiler/cpp/unittest.cc                     \
-  $(COMMON_TEST_SOURCES)
-nodist_protobuf_lazy_descriptor_test_SOURCES = $(protoc_outputs)
-$(am_protobuf_lazy_descriptor_test_OBJECTS): unittest_proto_middleman
-
-COMMON_LITE_TEST_SOURCES =                                             \
-  google/protobuf/arena_test_util.cc                                   \
-  google/protobuf/arena_test_util.h                                    \
-  google/protobuf/map_lite_test_util.cc                                \
-  google/protobuf/map_lite_test_util.h                                 \
-  google/protobuf/map_test_util_impl.h                                 \
-  google/protobuf/test_util_lite.cc                                    \
-  google/protobuf/test_util_lite.h
-
-# Build lite_unittest separately, since it doesn't use gtest. It can't
-# depend on gtest because our internal version of gtest depend on proto
-# full runtime and we want to make sure this test builds without full
-# runtime.
-protobuf_lite_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la     \
-                           $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la \
-                           $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la \
-                           $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_lite_test_CPPFLAGS= -I$(GOOGLEMOCK_SRC_DIR)/include \
-                             -I$(GOOGLETEST_SRC_DIR)/include
-protobuf_lite_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_lite_test_SOURCES =                                           \
-  google/protobuf/lite_unittest.cc                                     \
-  $(COMMON_LITE_TEST_SOURCES)
-nodist_protobuf_lite_test_SOURCES = $(protoc_lite_outputs)
-$(am_protobuf_lite_test_OBJECTS): unittest_proto_middleman
-
-# lite_arena_unittest depends on gtest because teboring@ found that without
-# gtest when building the test internally our memory sanitizer doesn't detect
-# memory leaks (don't know why).
-protobuf_lite_arena_test_LDADD = $(PTHREAD_LIBS) libprotobuf-lite.la \
-                      $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la        \
-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock.la        \
-                      $(GOOGLEMOCK_BUILD_DIR)/lib/libgmock_main.la
-protobuf_lite_arena_test_CPPFLAGS = -I$(GOOGLEMOCK_SRC_DIR)/include  \
-                                    -I$(GOOGLETEST_SRC_DIR)/include
-protobuf_lite_arena_test_CXXFLAGS = $(NO_OPT_CXXFLAGS)
-protobuf_lite_arena_test_SOURCES =       \
-  google/protobuf/lite_arena_unittest.cc \
-  $(COMMON_LITE_TEST_SOURCES)
-nodist_protobuf_lite_arena_test_SOURCES = $(protoc_lite_outputs)
-$(am_protobuf_lite_arena_test_OBJECTS): unittest_proto_middleman
-
-# Test plugin binary.
-test_plugin_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \
-                    $(GOOGLETEST_BUILD_DIR)/lib/libgtest.la
-test_plugin_CPPFLAGS = -I$(GOOGLETEST_SRC_DIR)/include
-test_plugin_SOURCES =                                          \
-  google/protobuf/compiler/mock_code_generator.cc              \
-  google/protobuf/compiler/test_plugin.cc                      \
-  google/protobuf/testing/file.cc                              \
-  google/protobuf/testing/file.h
-
-if HAVE_ZLIB
-zcgzip_LDADD = $(PTHREAD_LIBS) libprotobuf.la
-zcgzip_SOURCES = google/protobuf/testing/zcgzip.cc
-
-zcgunzip_LDADD = $(PTHREAD_LIBS) libprotobuf.la
-zcgunzip_SOURCES = google/protobuf/testing/zcgunzip.cc
-endif
-
-# This test target is to ensure all our public header files and generated
-# code is free from warnings. We have to be more pedantic about these
-# files because they are compiled by users with different compiler flags.
-no_warning_test.cc:
-	echo "// Generated from Makefile.am" > no_warning_test.cc
-	for FILE in $(nobase_include_HEADERS); do \
-		case $$FILE in *.inc) continue;; esac; \
-		echo "#include <$${FILE}>" >> no_warning_test.cc; \
-	done
-	echo "int main(int, char**) { return 0; }" >> no_warning_test.cc
-
-no_warning_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
-no_warning_test_CXXFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_DEF) $(ZLIB_DEF) \
-                           -Wall -Wextra -Werror -Wno-unused-parameter
-nodist_no_warning_test_SOURCES = no_warning_test.cc $(protoc_outputs)
-
-TESTS = protobuf-test protobuf-lazy-descriptor-test protobuf-lite-test \
-        google/protobuf/compiler/zip_output_unittest.sh $(GZTESTS)     \
-        protobuf-lite-arena-test no-warning-test
diff --git a/src/README.md b/src/README.md
index cf843d7..3592f4f 100644
--- a/src/README.md
+++ b/src/README.md
@@ -5,26 +5,31 @@
 
 https://developers.google.com/protocol-buffers/
 
-C++ Installation - Unix
+CMake Installation
+-----------------------
+
+To compile or install protobuf from source using CMake, see
+[cmake/README.md](../cmake/README.md).
+
+C++ Protobuf - Unix
 -----------------------
 
 To build protobuf from source, the following tools are needed:
 
-  * autoconf
-  * automake
-  * libtool
-  * make
+  * bazel
+  * git
   * g++
-  * unzip
 
-On Ubuntu/Debian, you can install them with:
+On Ubuntu/Debian, for example, you can install them with:
 
-    sudo apt-get install autoconf automake libtool curl make g++ unzip
+    sudo apt-get install g++ git bazel
 
 On other platforms, please use the corresponding package managing tool to
-install them before proceeding.
+install them before proceeding.  See https://bazel.build/install for further
+instructions on installing Bazel, or to build from source using CMake, see
+[cmake/README.md](../cmake/README.md).
 
-To get the source, download one of the release .tar.gz or .zip packages in the
+To get the source, download the release .tar.gz or .zip package in the
 release page:
 
     https://github.com/protocolbuffers/protobuf/releases/latest
@@ -41,79 +46,23 @@
     git clone https://github.com/protocolbuffers/protobuf.git
     cd protobuf
     git submodule update --init --recursive
-    ./autogen.sh
 
-To build and install the C++ Protocol Buffer runtime and the Protocol
-Buffer compiler (protoc) execute the following:
+To build the C++ Protocol Buffer runtime and the Protocol Buffer compiler
+(protoc) execute the following:
 
+    bazel build :protoc :protobuf
 
-     ./configure
-     make -j$(nproc) # $(nproc) ensures it uses all cores for compilation
-     make check
-     sudo make install
-     sudo ldconfig # refresh shared library cache.
+The compiler can then be installed, for example on Linux:
 
-If "make check" fails, you can still install, but it is likely that
-some features of this library will not work correctly on your system.
-Proceed at your own risk.
+    cp bazel-bin/protoc /usr/local/bin
 
-For advanced usage information on configure and make, please refer to the
-autoconf documentation:
-
-    http://www.gnu.org/software/autoconf/manual/autoconf.html#Running-configure-Scripts
-
-**Hint on install location**
-
-By default, the package will be installed to /usr/local.  However,
-on many platforms, /usr/local/lib is not part of LD_LIBRARY_PATH.
-You can add it, but it may be easier to just install to /usr
-instead.  To do this, invoke configure as follows:
-
-    ./configure --prefix=/usr
-
-If you already built the package with a different prefix, make sure
-to run "make clean" before building again.
+For more usage information on Bazel, please refer to http://bazel.build.
 
 **Compiling dependent packages**
 
-To compile a package that uses Protocol Buffers, you need to pass
-various flags to your compiler and linker.  As of version 2.2.0,
-Protocol Buffers integrates with pkg-config to manage this.  If you
-have pkg-config installed, then you can invoke it to get a list of
-flags like so:
-
-
-    pkg-config --cflags protobuf         # print compiler flags
-    pkg-config --libs protobuf           # print linker flags
-    pkg-config --cflags --libs protobuf  # print both
-
-
-For example:
-
-    c++ my_program.cc my_proto.pb.cc `pkg-config --cflags --libs protobuf`
-
-Note that packages written prior to the 2.2.0 release of Protocol
-Buffers may not yet integrate with pkg-config to get flags, and may
-not pass the correct set of flags to correctly link against
-libprotobuf.  If the package in question uses autoconf, you can
-often fix the problem by invoking its configure script like:
-
-
-    configure CXXFLAGS="$(pkg-config --cflags protobuf)" \
-              LIBS="$(pkg-config --libs protobuf)"
-
-This will force it to use the correct flags.
-
-If you are writing an autoconf-based package that uses Protocol
-Buffers, you should probably use the PKG_CHECK_MODULES macro in your
-configure script like:
-
-    PKG_CHECK_MODULES([protobuf], [protobuf])
-
-See the pkg-config man page for more info.
-
-If you only want protobuf-lite, substitute "protobuf-lite" in place
-of "protobuf" in these examples.
+To compile a package that uses Protocol Buffers, you need to setup a Bazel
+WORKSPACE that's hooked up to the protobuf repository and loads its
+dependencies.  For an example, see [WORKSPACE](examples/WORKSPACE).
 
 **Note for Mac users**
 
@@ -127,64 +76,16 @@
 https://www.macports.org . This will reside in /opt/local/bin/port for most
 Mac installations.
 
-    sudo /opt/local/bin/port install autoconf automake libtool
+    sudo /opt/local/bin/port install bazel
 
 Alternative for Homebrew users:
 
-    brew install autoconf automake libtool
+    brew install bazel
 
 Then follow the Unix instructions above.
 
-**Note for cross-compiling**
 
-The makefiles normally invoke the protoc executable that they just
-built in order to build tests.  When cross-compiling, the protoc
-executable may not be executable on the host machine.  In this case,
-you must build a copy of protoc for the host machine first, then use
-the --with-protoc option to tell configure to use it instead.  For
-example:
-
-    ./configure --with-protoc=protoc
-
-This will use the installed protoc (found in your $PATH) instead of
-trying to execute the one built during the build process.  You can
-also use an executable that hasn't been installed.  For example, if
-you built the protobuf package for your host machine in ../host,
-you might do:
-
-    ./configure --with-protoc=../host/src/protoc
-
-Either way, you must make sure that the protoc executable you use
-has the same version as the protobuf source code you are trying to
-use it with.
-
-**Note for Solaris users**
-
-Solaris 10 x86 has a bug that will make linking fail, complaining
-about libstdc++.la being invalid.  We have included a work-around
-in this package.  To use the work-around, run configure as follows:
-
-    ./configure LDFLAGS=-L$PWD/src/solaris
-
-See src/solaris/libstdc++.la for more info on this bug.
-
-**Note for HP C++ Tru64 users**
-
-To compile invoke configure as follows:
-
-    ./configure CXXFLAGS="-O -std ansi -ieee -D__USE_STD_IOSTREAM"
-
-Also, you will need to use gmake instead of make.
-
-**Note for AIX users**
-
-Compile using the IBM xlC C++ compiler as follows:
-
-    ./configure CXX=xlC
-
-Also, you will need to use GNU `make` (`gmake`) instead of AIX `make`.
-
-C++ Installation - Windows
+C++ Protobuf - Windows
 --------------------------
 
 If you only need the protoc binary, you can download it from the release
@@ -220,10 +121,10 @@
 libprotobuf, it is unlikely to work with a newer version without
 re-compiling.  This problem, when it occurs, will normally be detected
 immediately on startup of your app.  Still, you may want to consider
-using static linkage.  You can configure this package to install
-static libraries only using:
+using static linkage.  You can configure this in your `cc_binary` Bazel rules
+by specifying:
 
-    ./configure --disable-shared
+    linkstatic=True
 
 Usage
 -----
diff --git a/src/google/protobuf/BUILD.bazel b/src/google/protobuf/BUILD.bazel
index c655982..ac9b420 100644
--- a/src/google/protobuf/BUILD.bazel
+++ b/src/google/protobuf/BUILD.bazel
@@ -458,10 +458,22 @@
     ],
 )
 
+exports_files([
+    "test_messages_proto2.proto",
+    "test_messages_proto3.proto",
+], visibility = [
+    "//:__pkg__",
+    "//python:__pkg__",
+])
+
 proto_library(
     name = "test_messages_proto2_proto",
     srcs = ["test_messages_proto2.proto"],
     strip_import_prefix = "/src",
+    visibility = [
+        "//:__pkg__",
+        "//conformance:__pkg__",
+    ],
 )
 
 proto_library(
@@ -476,6 +488,10 @@
         ":timestamp_proto",
         ":wrappers_proto",
     ],
+    visibility = [
+        "//:__pkg__",
+        "//conformance:__pkg__",
+    ],
 )
 
 cc_proto_library(
diff --git a/src/google/protobuf/compiler/BUILD.bazel b/src/google/protobuf/compiler/BUILD.bazel
index 6e5f8da..e3cb41b 100644
--- a/src/google/protobuf/compiler/BUILD.bazel
+++ b/src/google/protobuf/compiler/BUILD.bazel
@@ -11,6 +11,7 @@
     "strip_prefix",
 )
 load("@rules_proto//proto:defs.bzl", "proto_library")
+load("//build_defs:arch_tests.bzl", "aarch64_test", "x86_64_test")
 load("//build_defs:cpp_opts.bzl", "COPTS")
 
 proto_library(
@@ -115,6 +116,18 @@
     visibility = ["//visibility:public"],
 )
 
+
+# Test that the protoc binary is built for the correct architecture.
+aarch64_test(
+    name = "protoc_aarch64_test",
+    bazel_binaries = ["//:protoc"],
+)
+
+x86_64_test(
+    name = "protoc_x86_64_test",
+    bazel_binaries = ["//:protoc"],
+)
+
 ################################################################################
 # Tests and support libraries
 ################################################################################
diff --git a/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc b/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
index 84aacca..863e3d5 100644
--- a/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
@@ -178,12 +178,6 @@
                     "WellKnownTypes/Wrappers.cs",
                     "../csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs");
 
-  generate_test.SetParameter("");
-  source_tree.MapPath("", TestSourceDir() + "/../conformance");
-  generate_test.Run(importer.Import("conformance.proto"),
-                    "Conformance.cs",
-                    "../csharp/src/Google.Protobuf.Conformance/Conformance.cs");
-
   EXPECT_EQ("", error_collector.text_);
 }
 
diff --git a/tests.sh b/tests.sh
deleted file mode 100755
index 6508674..0000000
--- a/tests.sh
+++ /dev/null
@@ -1,544 +0,0 @@
-#!/bin/bash
-#
-# Build and run tests for the protobuf project. We use this script to run
-# tests on kokoro (Ubuntu and MacOS). It can run locally as well but you
-# need to make sure the required compilers/tools are available.
-
-internal_build_cpp() {
-  if [ -f src/protoc ]; then
-    # Already built.
-    return
-  fi
-
-  # Initialize any submodules.
-  git submodule update --init --recursive
-
-  ./autogen.sh
-  ./configure CXXFLAGS="-fPIC -std=c++11"  # -fPIC is needed for python cpp test.
-                                           # See python/setup.py for more details
-  make -j$(nproc)
-}
-
-build_cpp() {
-  internal_build_cpp
-  make check -j$(nproc) || (cat src/test-suite.log; false)
-  cd conformance && make test_cpp && cd ..
-
-  # The benchmark code depends on cmake, so test if it is installed before
-  # trying to do the build.
-  if [[ $(type cmake 2>/dev/null) ]]; then
-    # Verify benchmarking code can build successfully.
-    cd benchmarks && make cpp-benchmark && cd ..
-  else
-    echo ""
-    echo "WARNING: Skipping validation of the benchmarking code, cmake isn't installed."
-    echo ""
-  fi
-}
-
-build_cpp_tcmalloc() {
-  internal_build_cpp
-  ./configure LIBS=-ltcmalloc && make clean && make \
-      PTHREAD_CFLAGS='-pthread -DGOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN' \
-      check
-  cd src
-  PPROF_PATH=/usr/bin/google-pprof HEAPCHECK=strict ./protobuf-test
-}
-
-build_dist_install() {
-  # Create a symlink pointing to python2 and put it at the beginning of $PATH.
-  # This is necessary because the googletest build system involves a Python
-  # script that is not compatible with Python 3. More recent googletest
-  # versions have fixed this, but they have also removed the autotools build
-  # system support that we rely on. This is a temporary workaround to keep the
-  # googletest build working when the default python binary is Python 3.
-  mkdir tmp || true
-  pushd tmp
-  ln -s /usr/bin/python2 ./python
-  popd
-  PATH=$PWD/tmp:$PATH
-
-  # Initialize any submodules.
-  git submodule update --init --recursive
-  ./autogen.sh
-  ./configure
-  make dist
-
-  # Unzip the dist tar file and install it.
-  DIST=`ls *.tar.gz`
-  tar -xf $DIST
-  pushd ${DIST//.tar.gz}
-  ./configure && make check -j4 && make install
-
-  export LD_LIBRARY_PATH=/usr/local/lib
-
-  # Try to install Java
-  pushd java
-  use_java jdk11
-  $MVN install
-  popd
-
-  # Try to install Python
-  python3 -m venv venv
-  source venv/bin/activate
-  pushd python
-  python3 setup.py clean build sdist
-  pip3 install dist/protobuf-*.tar.gz
-  popd
-  deactivate
-  rm -rf python/venv
-}
-
-build_csharp() {
-  # Required for conformance tests and to regenerate protos.
-  internal_build_cpp
-  NUGET=/usr/local/bin/nuget.exe
-
-  # Disable some unwanted dotnet options
-  export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
-  export DOTNET_CLI_TELEMETRY_OPTOUT=true
-
-  # TODO(jtattermusch): is this still needed with "first time experience"
-  # disabled?
-  # Perform "dotnet new" once to get the setup preprocessing out of the
-  # way. That spews a lot of output (including backspaces) into logs
-  # otherwise, and can cause problems. It doesn't matter if this step
-  # is performed multiple times; it's cheap after the first time anyway.
-  # (It also doesn't matter if it's unnecessary, which it will be on some
-  # systems. It's necessary on Jenkins in order to avoid unprintable
-  # characters appearing in the JUnit output.)
-  mkdir dotnettmp
-  (cd dotnettmp; dotnet new > /dev/null)
-  rm -rf dotnettmp
-
-  # Check that the protos haven't broken C# codegen.
-  # TODO(jonskeet): Fail if regenerating creates any changes.
-  csharp/generate_protos.sh
-
-  csharp/buildall.sh
-  cd conformance && make test_csharp && cd ..
-
-  # Run csharp compatibility test between 3.0.0 and the current version.
-  csharp/compatibility_tests/v3.0.0/test.sh 3.0.0
-  
-  # Regression test for https://github.com/protocolbuffers/protobuf/issues/9526
-  # - all line endings in .proto and .cs (and .csproj) files should be LF.
-  if git ls-files --eol csharp | grep -E '\.cs|\.proto' | grep -v w/lf
-  then
-    echo "The files listed above have mixed or CRLF line endings; please change to LF."
-    exit 1
-  fi
-}
-
-build_golang() {
-  # Go build needs `protoc`.
-  internal_build_cpp
-  # Add protoc to the path so that the examples build finds it.
-  export PATH="`pwd`/src:$PATH"
-
-  export GOPATH="$HOME/gocode"
-  mkdir -p "$GOPATH/src/github.com/protocolbuffers"
-  mkdir -p "$GOPATH/src/github.com/golang"
-  rm -f "$GOPATH/src/github.com/protocolbuffers/protobuf"
-  rm -f "$GOPATH/src/github.com/golang/protobuf"
-  ln -s "`pwd`" "$GOPATH/src/github.com/protocolbuffers/protobuf"
-  export PATH="$GOPATH/bin:$PATH"
-  (cd $GOPATH/src/github.com/golang && git clone https://github.com/golang/protobuf.git && cd protobuf && git checkout v1.3.5)
-  go install github.com/golang/protobuf/protoc-gen-go
-
-  cd examples && PROTO_PATH="-I../src -I." make gotest && cd ..
-}
-
-use_java() {
-  version=$1
-  case "$version" in
-    jdk17)
-      export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH
-      export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
-      ;;
-    jdk11)
-      export PATH=/usr/lib/jvm/java-11-openjdk-amd64/bin:$PATH
-      export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
-      ;;
-    jdk8)
-      export PATH=/usr/lib/jvm/java-8-openjdk-amd64/bin:$PATH
-      export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
-      ;;
-    jdk7)
-      export PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
-      export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
-      ;;
-    oracle7)
-      export PATH=/usr/lib/jvm/java-7-oracle/bin:$PATH
-      export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
-      ;;
-  esac
-
-  MAVEN_LOCAL_REPOSITORY=/var/maven_local_repository
-  MVN="$MVN -e --quiet -Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$MAVEN_LOCAL_REPOSITORY"
-
-  which java
-  java -version
-  $MVN -version
-}
-
-# --batch-mode suppresses download progress output that spams the logs.
-MVN="mvn --batch-mode"
-
-internal_build_java() {
-  version=$1
-  dir=java_$version
-  # Java build needs `protoc`.
-  internal_build_cpp
-  cp -r java $dir
-  cd $dir && $MVN clean
-  # Skip tests here - callers will decide what tests they want to run
-  $MVN install -Dmaven.test.skip=true
-}
-
-build_java() {
-  version=$1
-  internal_build_java $version
-  # Skip the Kotlin tests on Oracle 7
-  if [ "$version" == "oracle7" ]; then
-    $MVN test -pl bom,lite,core,util
-  else
-    $MVN test
-  fi
-  cd ../..
-}
-
-# The conformance tests are hard-coded to work with the $ROOT/java directory
-# so this can't run in parallel with two different sets of tests.
-build_java_with_conformance_tests() {
-  # Java build needs `protoc`.
-  internal_build_cpp
-  # This local installation avoids the problem caused by a new version not yet in Maven Central
-  cd java/bom && $MVN install
-  cd ../..
-  cd java/core && $MVN test && $MVN install
-  cd ../lite && $MVN test && $MVN install
-  cd ../util && $MVN test && $MVN install && $MVN package assembly:single
-  if [ "$version" != "jdk7" ]; then
-    cd ../kotlin && $MVN test && $MVN install
-    cd ../kotlin-lite && $MVN test && $MVN install
-  fi
-  cd ../..
-  cd conformance && make test_java && cd ..
-}
-
-build_java_jdk7() {
-  use_java jdk7
-  build_java_with_conformance_tests
-}
-
-build_java_oracle7() {
-  use_java oracle7
-  build_java oracle7
-}
-
-build_java_jdk8() {
-  use_java jdk8
-  build_java_with_conformance_tests
-}
-
-build_java_jdk11() {
-  use_java jdk11
-  build_java
-}
-
-build_java_jdk17() {
-  use_java jdk17
-  build_java
-}
-
-build_java_linkage_monitor() {
-  # Linkage Monitor checks compatibility with other Google libraries
-  # https://github.com/GoogleCloudPlatform/cloud-opensource-java/tree/master/linkage-monitor
-
-  use_java jdk11
-  internal_build_cpp
-
-  # Linkage Monitor uses $HOME/.m2 local repository
-  MVN="mvn -e -B -Dhttps.protocols=TLSv1.2"
-  cd java
-  # Installs the snapshot version locally
-  $MVN install -Dmaven.test.skip=true
-
-  # Linkage Monitor uses the snapshot versions installed in $HOME/.m2 to verify compatibility
-  JAR=linkage-monitor-latest-all-deps.jar
-  curl -v -O "https://storage.googleapis.com/cloud-opensource-java-linkage-monitor/${JAR}"
-  # Fails if there's new linkage errors compared with baseline
-  java -jar $JAR com.google.cloud:libraries-bom
-}
-
-build_objectivec_ios() {
-  # Reused the build script that takes care of configuring and ensuring things
-  # are up to date.  The OS X test runs the objc conformance test, so skip it
-  # here.
-  objectivec/DevTools/full_mac_build.sh \
-      --core-only --skip-xcode-osx --skip-xcode-tvos --skip-objc-conformance "$@"
-}
-
-build_objectivec_ios_debug() {
-  build_objectivec_ios --skip-xcode-release
-}
-
-build_objectivec_ios_release() {
-  build_objectivec_ios --skip-xcode-debug
-}
-
-build_objectivec_osx() {
-  # Reused the build script that takes care of configuring and ensuring things
-  # are up to date.
-  objectivec/DevTools/full_mac_build.sh \
-      --core-only --skip-xcode-ios --skip-xcode-tvos
-}
-
-build_objectivec_tvos() {
-  # Reused the build script that takes care of configuring and ensuring things
-  # are up to date.  The OS X test runs the objc conformance test, so skip it
-  # here.
-  objectivec/DevTools/full_mac_build.sh \
-      --core-only --skip-xcode-ios --skip-xcode-osx --skip-objc-conformance "$@"
-}
-
-build_objectivec_tvos_debug() {
-  build_objectivec_tvos --skip-xcode-release
-}
-
-build_objectivec_tvos_release() {
-  build_objectivec_tvos --skip-xcode-debug
-}
-
-build_python() {
-  internal_build_cpp
-  cd python
-  tox --skip-missing-interpreters
-  cd ..
-}
-
-build_python_version() {
-  internal_build_cpp
-  cd python
-  envlist=$1
-  tox -e $envlist
-  cd ..
-}
-
-build_python37() {
-  build_python_version py37-python
-}
-
-build_python38() {
-  build_python_version py38-python
-}
-
-build_python39() {
-  build_python_version py39-python
-}
-
-build_python310() {
-  build_python_version py310-python
-}
-
-build_python_cpp() {
-  internal_build_cpp
-  export LD_LIBRARY_PATH=../src/.libs # for Linux
-  export DYLD_LIBRARY_PATH=../src/.libs # for OS X
-  cd python
-  tox --skip-missing-interpreters
-  cd ..
-}
-
-build_python_cpp_version() {
-  internal_build_cpp
-  export LD_LIBRARY_PATH=../src/.libs # for Linux
-  export DYLD_LIBRARY_PATH=../src/.libs # for OS X
-  cd python
-  envlist=$1
-  tox -e $envlist
-  cd ..
-}
-
-build_python37_cpp() {
-  build_python_cpp_version py37-cpp
-}
-
-build_python38_cpp() {
-  build_python_cpp_version py38-cpp
-}
-
-build_python39_cpp() {
-  build_python_cpp_version py39-cpp
-}
-
-build_python310_cpp() {
-  build_python_cpp_version py310-cpp
-}
-
-build_ruby23() {
-  internal_build_cpp  # For conformance tests.
-  cd ruby && bash travis-test.sh ruby-2.3.8 && cd ..
-}
-build_ruby24() {
-  internal_build_cpp  # For conformance tests.
-  cd ruby && bash travis-test.sh ruby-2.4 && cd ..
-}
-build_ruby25() {
-  internal_build_cpp  # For conformance tests.
-  cd ruby && bash travis-test.sh ruby-2.5.1 && cd ..
-}
-build_ruby26() {
-  internal_build_cpp  # For conformance tests.
-  cd ruby && bash travis-test.sh ruby-2.6.0 && cd ..
-}
-build_ruby27() {
-  internal_build_cpp  # For conformance tests.
-  cd ruby && bash travis-test.sh ruby-2.7.0 && cd ..
-}
-build_ruby30() {
-  internal_build_cpp  # For conformance tests.
-  cd ruby && bash travis-test.sh ruby-3.0.2 && cd ..
-}
-build_ruby31() {
-  internal_build_cpp  # For conformance tests.
-  cd ruby && bash travis-test.sh ruby-3.1.0 && cd ..
-}
-
-build_jruby92() {
-  internal_build_cpp                # For conformance tests.
-  internal_build_java jdk8 && cd .. # For Maven protobuf jar with local changes
-  cd ruby && bash travis-test.sh jruby-9.2.20.1 && cd ..
-}
-
-build_jruby93() {
-  internal_build_cpp                # For conformance tests.
-  internal_build_java jdk8 && cd .. # For Maven protobuf jar with local changes
-  cd ruby && bash travis-test.sh jruby-9.3.4.0 && cd ..
-}
-
-use_php() {
-  VERSION=$1
-  export PATH=/usr/local/php-${VERSION}/bin:$PATH
-  internal_build_cpp
-}
-
-build_php() {
-  use_php $1
-  pushd php
-  rm -rf vendor
-  php -v
-  php -m
-  composer update
-  composer test
-  popd
-  (cd conformance && make test_php)
-}
-
-test_php_c() {
-  pushd php
-  rm -rf vendor
-  php -v
-  php -m
-  composer update
-  composer test_c
-  popd
-  (cd conformance && make test_php_c)
-}
-
-build_php_c() {
-  use_php $1
-  test_php_c
-}
-
-build_php_mac() {
-  internal_build_cpp
-  test_php_c
-}
-
-build_php_compatibility() {
-  internal_build_cpp
-}
-
-build_php_multirequest() {
-  use_php 7.4
-  php/tests/multirequest.sh
-}
-
-build_php8.0_all() {
-  build_php 8.0
-  build_php 8.1
-  build_php_c 8.0
-  build_php_c 8.1
-}
-
-build_php_all_32() {
-  build_php 7.0
-  build_php 7.1
-  build_php 7.4
-  build_php_c 7.0
-  build_php_c 7.1
-  build_php_c 7.4
-  build_php_c 7.1-zts
-  build_php_c 7.2-zts
-  build_php_c 7.5-zts
-}
-
-build_php_all() {
-  build_php_all_32
-  build_php_multirequest
-  build_php_compatibility
-}
-
-build_benchmark() {
-  use_php 7.2
-  cd kokoro/linux/benchmark && ./run.sh
-}
-
-# -------- main --------
-
-if [ "$#" -ne 1 ]; then
-  echo "
-Usage: $0 { cpp |
-            csharp |
-            java_jdk7 |
-            java_oracle7 |
-            java_jdk8 |
-            java_jdk11 |
-            java_jdk17 |
-            java_linkage_monitor |
-            objectivec_ios |
-            objectivec_ios_debug |
-            objectivec_ios_release |
-            objectivec_osx |
-            objectivec_tvos |
-            objectivec_tvos_debug |
-            objectivec_tvos_release |
-            python |
-            python_cpp |
-            python_compatibility |
-            ruby23 |
-            ruby24 |
-            ruby25 |
-            ruby26 |
-            ruby27 |
-            ruby30 |
-            ruby31 |
-            jruby92 |
-            jruby93 |
-            ruby_all |
-            php_all |
-            php_all_32 |
-            php7.0_mac |
-            php7.3_mac |
-            dist_install |
-            benchmark }
-"
-  exit 1
-fi
-
-set -e  # exit immediately on error
-set -x  # display all commands
-cd $(dirname $0)
-eval "build_$1"
diff --git a/third_party/utf8_range/BUILD.bazel b/third_party/utf8_range/BUILD.bazel
index 4a8a82b..693f390 100644
--- a/third_party/utf8_range/BUILD.bazel
+++ b/third_party/utf8_range/BUILD.bazel
@@ -1,3 +1,4 @@
+load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix")
 
 # Pulled from: https://github.com/cyb70289/utf8
 
@@ -13,7 +14,24 @@
 )
 
 filegroup(
-    name = "cmake_files",
-    srcs = glob(["*"]),
-    visibility = ["//cmake:__pkg__"],
+    name = "all_files",
+    srcs = glob([
+        "*.h",
+        "*.c",
+    ]) + [
+        "BUILD.bazel",
+        "LICENSE",
+    ],
+    visibility = [
+        "//cmake:__pkg__",
+        "//php:__pkg__",
+        "//ruby:__pkg__",
+    ],
+)
+
+pkg_files(
+    name = "dist_files",
+    srcs = [":all_files"],
+    strip_prefix = strip_prefix.from_root(""),
+    visibility = ["//pkg:__pkg__"],
 )
diff --git a/toolchain/toolchains.bazelrc b/toolchain/toolchains.bazelrc
index fbd655b..908a26e 100644
--- a/toolchain/toolchains.bazelrc
+++ b/toolchain/toolchains.bazelrc
@@ -2,9 +2,12 @@
 build:cross_config --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
 
 build:linux-aarch_64 --config=cross_config --cpu=linux-aarch_64
+build:linux-aarch64 --config=cross_config --cpu=linux-aarch_64
 build:linux-ppcle_64 --config=cross_config --cpu=linux-ppcle_64
+build:linux-ppc64le --config=cross_config --cpu=linux-ppcle_64
 build:linux-s390_64 --config=cross_config --cpu=linux-s390_64
 build:linux-x86_32 --config=cross_config --cpu=linux-x86_32
+build:linux-i386 --config=cross_config --cpu=linux-x86_32
 build:linux-x86_64 --config=cross_config --cpu=linux-x86_64
 build:osx-aarch_64 --config=cross_config --action_env=MACOSX_DEPLOYMENT_TARGET=10.9 --cpu=osx-aarch_64
 build:osx-x86_64 --config=cross_config --action_env=MACOSX_DEPLOYMENT_TARGET=10.9 --cpu=osx-x86_64
diff --git a/update_compatibility_version.py b/update_compatibility_version.py
deleted file mode 100755
index f93479b..0000000
--- a/update_compatibility_version.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env python
-"""Compatibility tests between last released and the current version.
-
-Usage: ./update_compatibility_version.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
-Example: ./update_compatibility_version.py 3.7.1
-"""
-
-from __future__ import print_function
-import re
-import sys
-
-if len(sys.argv) < 2 or len(sys.argv) > 3:
-  print("""
-[ERROR] Please specify a version.
-
-./update_compatibility_version.py.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
-
-Example:
-./update_compatibility_version.py.py 3.7.1 2
-""")
-  exit(1)
-
-NEW_VERSION = sys.argv[1]
-NEW_VERSION_INFO = NEW_VERSION.split('.')
-if len(NEW_VERSION_INFO) != 3:
-  print("""
-[ERROR] Version must be in the format <MAJOR>.<MINOR>.<MICRO>
-
-Example:
-./update_compatibility_version.py.py 3.7.3
-""")
-  exit(1)
-
-if len(sys.argv) > 2:
-  RC_VERSION = int(sys.argv[2])
-  # Do not update compatibility versions for rc release
-  if RC_VERSION != 0:
-    exit(0)
-
-
-def RewriteTextFile(filename, line_rewriter):
-  lines = open(filename, 'r').readlines()
-  updated_lines = []
-  for line in lines:
-    updated_lines.append(line_rewriter(line))
-  if lines == updated_lines:
-    print('%s was not updated. Please double check.' % filename)
-  f = open(filename, 'w')
-  f.write(''.join(updated_lines))
-  f.close()
-
-
-def ReplaceVersion(line):
-  return re.sub(r'LAST_RELEASED=.*$', 'LAST_RELEASED=%s' % NEW_VERSION, line)
-
-RewriteTextFile('tests.sh', ReplaceVersion)
diff --git a/util/python/BUILD.bazel b/util/python/BUILD.bazel
deleted file mode 100644
index 071efd2..0000000
--- a/util/python/BUILD.bazel
+++ /dev/null
@@ -1,22 +0,0 @@
-load("@rules_cc//cc:defs.bzl", "cc_library")
-
-exports_files(["BUILD.bazel"])
-
-# This is a placeholder for python headers. Projects needing to use
-# fast cpp protos in protobuf's python interface should build with
-# --define=use_fast_cpp_protos=true, and in addition, provide
-# //external:python_headers dependency that in turn provides Python.h.
-#
-# Projects that include protobuf using a Bazel external repository will need to
-# add a workspace rule to their WORKSPACE files to add an external workspace
-# that includes the Python headers. For example, the protobuf WORKSPACE file
-# includes the following local_repository rule that points to this directory:
-#
-# new_local_repository(
-#   name = "python_headers",
-#   path = __workspace_dir__ + "/util/python",
-# )
-cc_library(
-    name = "python_headers",
-    visibility = ["//visibility:public"],
-)