diff --git a/projects/plugins/jetpack/.phan/baseline.php b/projects/plugins/jetpack/.phan/baseline.php
index 7120701294027..b8589a544e1db 100644
--- a/projects/plugins/jetpack/.phan/baseline.php
+++ b/projects/plugins/jetpack/.phan/baseline.php
@@ -178,7 +178,6 @@
'extensions/blocks/blog-stats/blog-stats.php' => ['PhanTypeMismatchReturnProbablyReal'],
'extensions/blocks/blogroll/blogroll-item/blogroll-item.php' => ['PhanPluginDuplicateConditionalNullCoalescing'],
'extensions/blocks/calendly/calendly.php' => ['PhanTypeMismatchArgumentProbablyReal', 'PhanTypeMismatchReturnProbablyReal'],
- 'extensions/blocks/contact-info/contact-info.php' => ['PhanTypeMismatchReturn'],
'extensions/blocks/cookie-consent/cookie-consent.php' => ['PhanParamTooMany'],
'extensions/blocks/donations/donations.php' => ['PhanTypeMismatchArgument'],
'extensions/blocks/gif/gif.php' => ['PhanPluginDuplicateConditionalNullCoalescing', 'PhanTypeMismatchReturnProbablyReal'],
diff --git a/projects/plugins/jetpack/changelog/update-contact-info-block-loading b/projects/plugins/jetpack/changelog/update-contact-info-block-loading
new file mode 100644
index 0000000000000..6c6e7cb31a30d
--- /dev/null
+++ b/projects/plugins/jetpack/changelog/update-contact-info-block-loading
@@ -0,0 +1,4 @@
+Significance: patch
+Type: other
+
+Contact Info: Change block registration code - move back to two files.
diff --git a/projects/plugins/jetpack/extensions/blocks/contact-info/class-jetpack-contact-info-block.php b/projects/plugins/jetpack/extensions/blocks/contact-info/class-jetpack-contact-info-block.php
new file mode 100644
index 0000000000000..9ec393ac0b548
--- /dev/null
+++ b/projects/plugins/jetpack/extensions/blocks/contact-info/class-jetpack-contact-info-block.php
@@ -0,0 +1,161 @@
+ __NAMESPACE__ . '\render',
+ )
+ );
+
+ Blocks::jetpack_register_block(
+ 'jetpack/address',
+ array(
+ 'parent' => array( 'jetpack/contact-info' ),
+ 'render_callback' => __NAMESPACE__ . '\render_adress',
+ )
+ );
+
+ Blocks::jetpack_register_block(
+ 'jetpack/email',
+ array(
+ 'parent' => array( 'jetpack/contact-info' ),
+ 'render_callback' => __NAMESPACE__ . '\render_email',
+ )
+ );
+
+ Blocks::jetpack_register_block(
+ 'jetpack/phone',
+ array(
+ 'parent' => array( 'jetpack/contact-info' ),
+ 'render_callback' => __NAMESPACE__ . '\render_phone',
+ )
+ );
+ }
+
+ /**
+ * Adds contact info schema attributes.
+ *
+ * @param array $attr Array containing the contact info block attributes.
+ * @param string $content String containing the contact info block content.
+ *
+ * @return string
+ */
+ public static function render( $attr, $content ) {
+ Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
+ return str_replace(
+ 'class="wp-block-jetpack-contact-info', // Closing " intentionally ommited to that the user can also add the className as expected.
+ 'itemprop="location" itemscope itemtype="http://schema.org/Organization" class="wp-block-jetpack-contact-info',
+ $content
+ );
+ }
+
+ /**
+ * Adds address schema attributes.
+ *
+ * @param array $attr Array containing the address block attributes.
+ * @param string $content String containing the address block content.
+ *
+ * @return string
+ */
+ public static function render_address( $attr, $content ) {
+ // Returns empty content if the only attribute set is linkToGoogleMaps.
+ if ( ! self::has_attributes( $attr, array( 'linkToGoogleMaps', 'className' ) ) ) {
+ return '';
+ }
+ $find = array(
+ 'class="wp-block-jetpack-address"',
+ 'class="jetpack-address__address',
+ // Closing " left out on purpose - there are multiple address fields and they all need to be updated with the same itemprop.
+ 'class="jetpack-address__region"',
+ 'class="jetpack-address__city"',
+ 'class="jetpack-address__postal"',
+ 'class="jetpack-address__country"',
+ );
+ $replace = array(
+ 'itemprop="address" itemscope itemtype="http://schema.org/PostalAddress" class="wp-block-jetpack-address" ',
+ 'itemprop="streetAddress" class="jetpack-address__address', // Closing " left out on purpose.
+ 'itemprop="addressRegion" class="jetpack-address__region"',
+ 'itemprop="addressLocality" class="jetpack-address__city"',
+ 'itemprop="postalCode" class="jetpack-address__postal"',
+ 'itemprop="addressCountry" class="jetpack-address__country"',
+ );
+
+ return str_replace( $find, $replace, $content );
+ }
+
+ /**
+ * Helper function that lets us determine if a block has any valid attributes.
+ *
+ * @param array $attr Array containing the block attributes.
+ * @param array $omit Array containing the block attributes that we ignore.
+ *
+ * @return bool
+ */
+ public static function has_attributes( $attr, $omit = array() ) {
+ foreach ( $attr as $attribute => $value ) {
+ if ( ! in_array( $attribute, $omit, true ) && ! empty( $value ) ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Adds email schema attributes.
+ *
+ * @param array $attr Array containing the email block attributes.
+ * @param string $content String containing the email block content.
+ *
+ * @return string
+ */
+ public static function render_email( $attr, $content ) {
+ $content = self::has_attributes( $attr, array( 'className' ) ) ?
+ str_replace( 'href="mailto:', 'itemprop="email" href="mailto:', $content ) :
+ '';
+ return $content;
+ }
+
+ /**
+ * Adds phone schema attributes. Also wraps the tel link in a span so that
+ * it's recognized as a telephone number in Google's Structured Data.
+ *
+ * @param array $attr Array containing the phone block attributes.
+ * @param string $content String containing the phone block content.
+ *
+ * @return string
+ */
+ public static function render_phone( $attr, $content ) {
+ if ( self::has_attributes( $attr, array( 'className' ) ) ) {
+ return str_replace(
+ array( ' $value ) {
- if ( ! in_array( $attribute, $omit, true ) && ! empty( $value ) ) {
- return true;
- }
- }
-
- return false;
-}
-
-/**
- * Adds email schema attributes.
- *
- * @param array $attr Array containing the email block attributes.
- * @param string $content String containing the email block content.
- *
- * @return string
- */
-function render_email( $attr, $content ) {
- $content = has_attributes( $attr, array( 'className' ) ) ?
- str_replace( 'href="mailto:', 'itemprop="email" href="mailto:', $content ) :
- '';
- return $content;
-}
-
-/**
- * Adds phone schema attributes. Also wraps the tel link in a span so that
- * it's recognized as a telephone number in Google's Structured Data.
- *
- * @param array $attr Array containing the phone block attributes.
- * @param string $content String containing the phone block content.
- *
- * @return string
- */
-function render_phone( $attr, $content ) {
- if ( has_attributes( $attr, array( 'className' ) ) ) {
- return str_replace(
- array( '