diff --git wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/assets/images/github-mark.svg wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/assets/images/github-mark.svg
new file mode 100644
index 000000000..99b0878c1
--- /dev/null
+++ wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/assets/images/github-mark.svg
@@ -0,0 +1,3 @@
+<svg height="1024" width="1024" xmlns="http://www.w3.org/2000/svg">
+  <path class="github-mark" d="M512 0C229.25 0 0 229.25 0 512c0 226.25 146.688 418.125 350.156 485.812 25.594 4.688 34.938-11.125 34.938-24.625 0-12.188-0.469-52.562-0.719-95.312C242 908.812 211.906 817.5 211.906 817.5c-23.312-59.125-56.844-74.875-56.844-74.875-46.531-31.75 3.53-31.125 3.53-31.125 51.406 3.562 78.47 52.75 78.47 52.75 45.688 78.25 119.875 55.625 149 42.5 4.654-33 17.904-55.625 32.5-68.375C304.906 725.438 185.344 681.5 185.344 485.312c0-55.938 19.969-101.562 52.656-137.406-5.219-13-22.844-65.094 5.062-135.562 0 0 42.938-13.75 140.812 52.5 40.812-11.406 84.594-17.031 128.125-17.219 43.5 0.188 87.312 5.875 128.188 17.281 97.688-66.312 140.688-52.5 140.688-52.5 28 70.531 10.375 122.562 5.125 135.5 32.812 35.844 52.625 81.469 52.625 137.406 0 196.688-119.75 240-233.812 252.688 18.438 15.875 34.75 47 34.75 94.75 0 68.438-0.688 123.625-0.688 140.5 0 13.625 9.312 29.562 35.25 24.562C877.438 930 1024 738.125 1024 512 1024 229.25 794.75 0 512 0z" />
+</svg>
diff --git wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/inc/class-handbook.php wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/inc/class-handbook.php
new file mode 100644
index 000000000..3884ff220
--- /dev/null
+++ wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/inc/class-handbook.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace WPOrg_Hosting_Handbook;
+
+class Handbook {
+
+	/**
+	 * Append a "Edit on GitHub" link to Handbook document titles
+	 */
+	public static function filter_the_title_edit_link( $title, $id = null ) {
+		// Only apply to the main title for the document
+		if ( ! is_singular( 'handbook' )
+			|| ! is_main_query()
+			|| ! in_the_loop()
+			|| is_embed()
+			|| $id !== get_queried_object_id() ) {
+			return $title;
+		}
+
+		$markdown_source = self::get_markdown_edit_link( get_the_ID() );
+		if ( ! $markdown_source ) {
+			return $title;
+		}
+
+		return $title . ' <a class="github-edit" href="' . esc_url( $markdown_source ) . '"><img src="' . esc_url( plugins_url( 'assets/images/github-mark.svg', dirname( __FILE__ ) ) ) . '"> <span>Edit</span></a>';
+	}
+
+	/**
+	 * Hosting Handbook pages are maintained in the GitHub repo, so the edit
+	 * link should ridirect to there.
+	 */
+	public static function redirect_edit_link_to_github( $link, $post_id, $context ) {
+		if ( is_admin() ) {
+			return $link;
+		}
+		$post = get_post( $post_id );
+		if ( ! $post ) {
+			return $link;
+		}
+
+		if ( 'handbook' !== $post->post_type ) {
+			return $link;
+		}
+
+		$markdown_source = self::get_markdown_edit_link( $post_id );
+		if ( ! $markdown_source ) {
+			return $link;
+		}
+
+		if ( 'display' === $context ) {
+			$markdown_source = esc_url( $markdown_source );
+		}
+
+		return $markdown_source;
+	}
+
+	/**
+	 * o2 does inline editing, so we also need to remove the class name that it looks for.
+	 *
+	 * o2 obeys the edit_post capability for displaying the edit link, so we also need to manually
+	 * add the edit link if it isn't there - it always redirects to GitHub, so it doesn't need to
+	 * obey the edit_post capability in this instance.
+	 */
+	public static function redirect_o2_edit_link_to_github( $actions, $post_id ) {
+		$post = get_post( $post_id );
+		if ( ! $post ) {
+			return $actions;
+		}
+
+		if ( 'handbook' !== $post->post_type ) {
+			return $actions;
+		}
+
+		$markdown_source = self::get_markdown_edit_link( $post_id );
+		if ( ! $markdown_source ) {
+			return $actions;
+		}
+
+		/*
+		 * Define our own edit post action for o2.
+		 *
+		 * Notable differences from the original are:
+		 * - the 'href' parameter always goes to the GitHub source.
+		 * - the 'o2-edit' class is missing, so inline editing is disabled.
+		 */
+		$edit_action = array(
+			'action' => 'edit',
+			'href' => $markdown_source,
+			'classes' => array( 'edit-post-link' ),
+			'rel' => $post_id,
+			'initialState' => 'default'
+		);
+
+		// Find and replace the existing edit action.
+		$replaced = false;
+		foreach( $actions as &$action ) {
+			if ( 'edit' === $action['action'] ) {
+				$action = $edit_action;
+				$replaced = true;
+				break;
+			}
+		}
+		unset( $action );
+
+		// If there was no edit action replaced, add it in manually.
+		if ( ! $replaced ) {
+			$actions[30] = $edit_action;
+		}
+
+		return $actions;
+	}
+
+	private static function get_markdown_edit_link( $post_id ) {
+		$markdown_source = Markdown_Import::get_markdown_source( $post_id );
+		if ( is_wp_error( $markdown_source ) ) {
+			return '';
+		}
+		if ( 'github.com' !== parse_url( $markdown_source, PHP_URL_HOST )
+			|| false !== stripos( $markdown_source, '/edit/master/' ) ) {
+			return $markdown_source;
+		}
+		$markdown_source = str_replace( '/blob/master/', '/edit/master/', $markdown_source );
+		return $markdown_source;
+	}
+}
diff --git wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/inc/class-markdown-import.php wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/inc/class-markdown-import.php
new file mode 100644
index 000000000..59287b5c1
--- /dev/null
+++ wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/inc/class-markdown-import.php
@@ -0,0 +1,280 @@
+<?php
+
+namespace WPOrg_Hosting_Handbook;
+
+use WP_Error;
+use WP_Query;
+
+class Markdown_Import {
+
+	private static $handbook_manifest = 'https://raw.githubusercontent.com/wordpress/hosting-handbook/master/bin/handbook-manifest.json';
+	private static $input_name = 'wporg-hosting-handbook-markdown-source';
+	private static $meta_key = 'wporg-hosting-handbook-markdown-source';
+	private static $nonce_name = 'wporg-hosting-handbook-markdown-source-nonce';
+	private static $submit_name = 'wporg-hosting-handbook-markdown-import';
+	private static $supported_post_types = array( 'handbook' );
+	private static $posts_per_page = 100;
+
+	/**
+	 * Register our cron task if it doesn't already exist
+	 */
+	public static function action_init() {
+		if ( ! wp_next_scheduled( 'wporg_hosting_handbook_manifest_import' ) ) {
+			wp_schedule_event( time(), '15_minutes', 'wporg_hosting_handbook_manifest_import' );
+		}
+		if ( ! wp_next_scheduled( 'wporg_hosting_handbook_markdown_import' ) ) {
+			wp_schedule_event( time(), '15_minutes', 'wporg_hosting_handbook_markdown_import' );
+		}
+	}
+
+	public static function action_wporg_hosting_handbook_manifest_import() {
+		$response = wp_remote_get( self::$handbook_manifest );
+		if ( is_wp_error( $response ) ) {
+			return $response;
+		} elseif ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
+			return new WP_Error( 'invalid-http-code', 'Markdown source returned non-200 http code.' );
+		}
+		$manifest = json_decode( wp_remote_retrieve_body( $response ), true );
+		if ( ! $manifest ) {
+			return new WP_Error( 'invalid-manifest', 'Manifest did not unfurl properly.' );;
+		}
+		// Fetch all handbook posts for comparison
+		$q = new WP_Query( array(
+			'post_type'      => self::$supported_post_types,
+			'post_status'    => 'publish',
+			'posts_per_page' => self::$posts_per_page,
+		) );
+		$existing = $q->posts;
+		$created = 0;
+		foreach( $manifest as $doc ) {
+			// Already exists
+			if ( wp_filter_object_list( $existing, array( 'post_name' => $doc['slug'] ) ) ) {
+				continue;
+			}
+			$post_parent = null;
+			if ( ! empty( $doc['parent'] ) ) {
+				// Find the parent in the existing set
+				$parents = wp_filter_object_list( $existing, array( 'post_name' => $doc['parent'] ) );
+				if ( ! empty( $parents ) ) {
+					$parent = array_shift( $parents );
+				} else {
+					// Create the parent and add it to the stack
+					if ( isset( $manifest[ $doc['parent'] ] ) ) {
+						$parent_doc = $manifest[ $doc['parent'] ];
+						$parent = self::create_post_from_manifest_doc( $parent_doc );
+						if ( $parent ) {
+							$created++;
+							$existing[] = $parent;
+						} else {
+							continue;
+						}
+					} else {
+						continue;
+					}
+				}
+				$post_parent = $parent->ID;
+			}
+			$post = self::create_post_from_manifest_doc( $doc, $post_parent );
+			if ( $post ) {
+				$created++;
+				$existing[] = $post;
+			}
+		}
+		if ( class_exists( 'WP_CLI' ) ) {
+			\WP_CLI::success( "Successfully created {$created} handbook pages." );
+		}
+	}
+
+	/**
+	 * Create a new handbook page from the manifest document
+	 */
+	private static function create_post_from_manifest_doc( $doc, $post_parent = null ) {
+		$post_data = array(
+			'post_type'   => 'handbook',
+			'post_status' => 'publish',
+			'post_parent' => $post_parent,
+			'post_title'  => sanitize_text_field( wp_slash( $doc['title'] ) ),
+			'post_name'   => sanitize_title_with_dashes( $doc['slug'] ),
+		);
+		$post_id = wp_insert_post( $post_data );
+		if ( ! $post_id ) {
+			return false;
+		}
+		if ( class_exists( 'WP_CLI' ) ) {
+			\WP_CLI::log( "Created post {$post_id} for {$doc['title']}." );
+		}
+		update_post_meta( $post_id, self::$meta_key, esc_url_raw( $doc['markdown_source'] ) );
+		return get_post( $post_id );
+	}
+
+	public static function action_wporg_hosting_handbook_markdown_import() {
+		$q = new WP_Query( array(
+			'post_type'      => self::$supported_post_types,
+			'post_status'    => 'publish',
+			'fields'         => 'ids',
+			'posts_per_page' => self::$posts_per_page,
+		) );
+		$ids = $q->posts;
+		$success = 0;
+		foreach( $ids as $id ) {
+			$ret = self::update_post_from_markdown_source( $id );
+			if ( class_exists( 'WP_CLI' ) ) {
+				if ( is_wp_error( $ret ) ) {
+					\WP_CLI::warning( $ret->get_error_message() );
+				} else {
+					\WP_CLI::log( "Updated {$id} from markdown source" );
+					$success++;
+				}
+			}
+		}
+		if ( class_exists( 'WP_CLI' ) ) {
+			$total = count( $ids );
+			\WP_CLI::success( "Successfully updated {$success} of {$total} handbook pages." );
+		}
+	}
+
+	/**
+	 * Handle a request to import from the markdown source
+	 */
+	public static function action_load_post_php() {
+		if ( ! isset( $_GET[ self::$submit_name ] )
+			|| ! isset( $_GET[ self::$nonce_name ] )
+			|| ! isset( $_GET['post'] ) ) {
+			return;
+		}
+		$post_id = (int) $_GET['post'];
+		if ( ! current_user_can( 'edit_post', $post_id )
+			|| ! wp_verify_nonce( $_GET[ self::$nonce_name ], self::$input_name )
+			|| ! in_array( get_post_type( $post_id ), self::$supported_post_types, true ) ) {
+			return;
+		}
+
+		$response = self::update_post_from_markdown_source( $post_id );
+		if ( is_wp_error( $response ) ) {
+			wp_die( $response->get_error_message() );
+		}
+
+		wp_safe_redirect( get_edit_post_link( $post_id, 'raw' ) );
+		exit;
+	}
+
+	/**
+	 * Add an input field for specifying Markdown source
+ 	 */
+	public static function action_edit_form_after_title( $post ) {
+		if ( ! in_array( $post->post_type, self::$supported_post_types, true ) ) {
+			return;
+		}
+		$markdown_source = get_post_meta( $post->ID, self::$meta_key, true );
+		?>
+		<label>Markdown source: <input
+			type="text"
+			name="<?php echo esc_attr( self::$input_name ); ?>"
+			value="<?php echo esc_attr( $markdown_source ); ?>"
+			placeholder="Enter a URL representing a markdown file to import"
+			size="50" />
+		</label> <?php
+			if ( $markdown_source ) :
+				$update_link = add_query_arg( array(
+					self::$submit_name => 'import',
+					self::$nonce_name  => wp_create_nonce( self::$input_name ),
+				), get_edit_post_link( $post->ID, 'raw' ) );
+				?>
+				<a class="button button-small button-primary" href="<?php echo esc_url( $update_link ); ?>">Import</a>
+			<?php endif; ?>
+		<?php wp_nonce_field( self::$input_name, self::$nonce_name ); ?>
+		<?php
+	}
+
+	/**
+	 * Save the Markdown source input field
+	 */
+	public static function action_save_post( $post_id ) {
+
+		if ( ! isset( $_POST[ self::$input_name ] )
+			|| ! isset( $_POST[ self::$nonce_name ] )
+			|| ! in_array( get_post_type( $post_id ), self::$supported_post_types, true ) ) {
+			return;
+		}
+
+		if ( ! wp_verify_nonce( $_POST[ self::$nonce_name ], self::$input_name ) ) {
+			return;
+		}
+
+		$markdown_source = '';
+		if ( ! empty( $_POST[ self::$input_name ] ) ) {
+			$markdown_source = esc_url_raw( $_POST[ self::$input_name ] );
+		}
+		update_post_meta( $post_id, self::$meta_key, $markdown_source );
+	}
+
+	/**
+	 * Filter cron schedules to add a 15 minute schedule
+	 */
+	public static function filter_cron_schedules( $schedules ) {
+		$schedules['15_minutes'] = array(
+			'interval' => 15 * MINUTE_IN_SECONDS,
+			'display'  => '15 minutes'
+		);
+		return $schedules;
+	}
+
+	/**
+	 * Update a post from its Markdown source
+	 */
+	private static function update_post_from_markdown_source( $post_id ) {
+		$markdown_source = self::get_markdown_source( $post_id );
+		if ( is_wp_error( $markdown_source ) ) {
+			return $markdown_source;
+		}
+		if ( ! function_exists( 'jetpack_require_lib' ) ) {
+			return new WP_Error( 'missing-jetpack-require-lib', 'jetpack_require_lib() is missing on system.' );
+		}
+
+		// Transform GitHub repo HTML pages into their raw equivalents
+		$markdown_source = preg_replace( '#https?://github\.com/([^/]+/[^/]+)/blob/(.+)#', 'https://raw.githubusercontent.com/$1/$2', $markdown_source );
+		$markdown_source = add_query_arg( 'v', time(), $markdown_source );
+		$response = wp_remote_get( $markdown_source );
+		if ( is_wp_error( $response ) ) {
+			return $response;
+		} elseif ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
+			return new WP_Error( 'invalid-http-code', 'Markdown source returned non-200 http code.' );
+		}
+
+		$markdown = wp_remote_retrieve_body( $response );
+		// Strip YAML doc from the header
+		$markdown = preg_replace( '#^---(.+)---#Us', '', $markdown );
+
+		$title = null;
+		if ( preg_match( '/^#\s(.+)/', $markdown, $matches ) ) {
+			$title = $matches[1];
+			$markdown = preg_replace( '/^#\s(.+)/', '', $markdown );
+		}
+
+		// Transform to HTML and save the post
+		jetpack_require_lib( 'markdown' );
+		$parser = new \WPCom_GHF_Markdown_Parser;
+		$html = $parser->transform( $markdown );
+		$post_data = array(
+			'ID'           => $post_id,
+			'post_content' => wp_filter_post_kses( wp_slash( $html ) ),
+		);
+		if ( ! is_null( $title ) ) {
+			$post_data['post_title'] = sanitize_text_field( wp_slash( $title ) );
+		}
+		wp_update_post( $post_data );
+		return true;
+	}
+
+	/**
+	 * Retrieve the markdown source URL for a given post.
+	 */
+	public static function get_markdown_source( $post_id ) {
+		$markdown_source = get_post_meta( $post_id, self::$meta_key, true );
+		if ( ! $markdown_source ) {
+			return new WP_Error( 'missing-markdown-source', 'Markdown source is missing for post.' );
+		}
+
+		return $markdown_source;
+	}
+}
diff --git wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/wporg-hosting-handbook.php wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/wporg-hosting-handbook.php
new file mode 100644
index 000000000..b7c0762ad
--- /dev/null
+++ wordpress.org/public_html/wp-content/plugins/wporg-hosting-handbook/wporg-hosting-handbook.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Plugin name: Hosting Team Handbook: WordPress.org Customizations
+ * Description: Provides general customizations for the Hosting Team's presence on WordPress.org
+ * Version:     0.1.0
+ * Author:      WordPress.org
+ * Author URI:  http://wordpress.org/
+ * License:     GPLv2 or later
+ */
+
+require_once dirname( __FILE__ ) . '/inc/class-markdown-import.php';
+require_once dirname( __FILE__ ) . '/inc/class-handbook.php';
+
+/**
+ * Registry of actions and filters
+ */
+add_action( 'init', array( 'WPOrg_Hosting_Handbook\Markdown_Import', 'action_init' ) );
+add_action( 'wporg_hosting_handbook_manifest_import', array( 'WPOrg_Hosting_Handbook\Markdown_Import', 'action_wporg_hosting_handbook_manifest_import' ) );
+add_action( 'wporg_hosting_handbook_markdown_import', array( 'WPOrg_Hosting_Handbook\Markdown_Import', 'action_wporg_hosting_handbook_markdown_import' ) );
+add_action( 'load-post.php', array( 'WPOrg_Hosting_Handbook\Markdown_Import', 'action_load_post_php' ) );
+add_action( 'edit_form_after_title', array( 'WPOrg_Hosting_Handbook\Markdown_Import', 'action_edit_form_after_title' ) );
+add_action( 'save_post', array( 'WPOrg_Hosting_Handbook\Markdown_Import', 'action_save_post' ) );
+add_filter( 'cron_schedules', array( 'WPOrg_Hosting_Handbook\Markdown_Import', 'filter_cron_schedules' ) );
+add_filter( 'the_title', array( 'WPOrg_Hosting_Handbook\Handbook', 'filter_the_title_edit_link' ), 10, 2 );
+add_filter( 'get_edit_post_link', array( 'WPOrg_Hosting_Handbook\Handbook', 'redirect_edit_link_to_github' ), 10, 3 );
+add_filter( 'o2_filter_post_actions', array( 'WPOrg_Hosting_Handbook\Handbook', 'redirect_o2_edit_link_to_github' ), 11, 2 );
+
+add_action( 'wp_head', function(){
+	?>
+	<style>
+		pre code {
+			line-height: 16px;
+		}
+		a.github-edit {
+			margin-left: .5em;
+			font-size: .5em;
+			vertical-align: top;
+			display: inline-block;
+			border: 1px solid #eeeeee;
+			border-radius: 2px;
+			background: #eeeeee;
+			padding: .5em .6em .4em;
+			color: black;
+			margin-top: 0.1em;
+		}
+		a.github-edit > * {
+			opacity: 0.6;
+		}
+		a.github-edit:hover > * {
+			opacity: 1;
+			color: black;
+		}
+		a.github-edit img {
+			height: .8em;
+		}
+		.single-handbook div.table-of-contents {
+			margin: 0;
+			float: none;
+			padding: 0;
+			border: none;
+			box-shadow: none;
+			width: auto;
+		}
+		.single-handbook div.table-of-contents:after {
+			content: " ";
+			display: block;
+			clear: both;
+		}
+		.single-handbook .table-of-contents h2 {
+			display: none;
+		}
+		.single-handbook div.table-of-contents ul {
+			padding: 0;
+			margin-top: 0.4em;
+			margin-bottom: 1.1em;
+		}
+		.single-handbook div.table-of-contents > ul li {
+			display: inline-block;
+			padding: 0;
+			font-size: 12px;
+		}
+		.single-handbook div.table-of-contents > ul li a:after {
+			content: "|";
+			display: inline-block;
+			width: 20px;
+			text-align: center;
+			color: #eeeeee
+		}
+		.single-handbook div.table-of-contents > ul li:last-child a:after {
+			content: "";
+		}
+		.single-handbook div.table-of-contents ul ul {
+			display: none;
+		}
+		.single-handbook #secondary {
+			max-width: 240px;
+		}
+	</style>
+	<?php
+});
