diff --git src/wp-admin/admin-header.php src/wp-admin/admin-header.php
index d5ceecc..fc43633 100644
--- src/wp-admin/admin-header.php
+++ src/wp-admin/admin-header.php
@@ -175,6 +175,15 @@ if ( is_network_admin() )
 
 $admin_body_class .= ' no-customize-support no-svg';
 
+if ( isset( $GLOBALS['post'] ) && use_block_editor_for_post( $GLOBALS['post'] ) ) {
+	// Default to is-fullscreen-mode to avoid jumps in the UI.
+	$admin_body_class .= ' block-editor-page gutenberg-editor-page is-fullscreen-mode wp-embed-responsive';
+
+	if ( current_theme_supports( 'editor-styles' ) && current_theme_supports( 'dark-editor-style' ) ) {
+		$admin_body_class .= ' is-dark-theme';
+	}
+}
+
 ?>
 </head>
 <?php
diff --git src/wp-admin/edit-form-blocks.php src/wp-admin/edit-form-blocks.php
new file mode 100644
index 0000000..b50c5ff
--- /dev/null
+++ src/wp-admin/edit-form-blocks.php
@@ -0,0 +1,376 @@
+<?php
+/**
+ * The Block Editor page.
+ *
+ * @since 5.0.0
+ *
+ * @package WordPress
+ * @subpackage Administration
+ */
+
+// Don't load directly.
+if ( ! defined( 'ABSPATH' ) ) {
+	die( '-1' );
+}
+
+/**
+ * @global string       $post_type
+ * @global WP_Post_Type $post_type_object
+ * @global WP_Post      $post
+ * @global string       $title
+ */
+global $post_type, $post_type_object, $post, $title;
+
+if ( ! empty( $post_type_object ) ) {
+	$title = $post_type_object->labels->edit_item;
+}
+
+// It hurts to do this.
+remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
+
+wp_enqueue_script( 'heartbeat' );
+wp_enqueue_script( 'wp-edit-post' );
+
+$rest_base = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name;
+
+// Preload common data.
+$preload_paths = array(
+	'/',
+	'/wp/v2/types?context=edit',
+	'/wp/v2/taxonomies?per_page=-1&context=edit',
+	'/wp/v2/themes?status=active',
+	sprintf( '/wp/v2/%s/%s?context=edit', $rest_base, $post->ID ),
+	sprintf( '/wp/v2/types/%s?context=edit', $post_type ),
+	sprintf( '/wp/v2/users/me?post_type=%s&context=edit', $post_type ),
+);
+
+// Ensure the global $post remains the same after API data is preloaded.
+$backup_global_post = $post;
+
+$preload_data = array_reduce(
+	$preload_paths,
+	'rest_preload_api_request',
+	array()
+);
+
+// Restore the global $post as it was before API preloading.
+$post = $backup_global_post;
+
+wp_add_inline_script(
+	'wp-api-fetch',
+	sprintf( 'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );', wp_json_encode( $preload_data ) ),
+	'after'
+);
+
+wp_add_inline_script(
+	'wp-blocks',
+	sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ),
+	'after'
+);
+
+// Assign initial edits, if applicable. These are not initially assigned
+// to the persisted post, but should be included in its save payload.
+$initial_edits = null;
+if ( 'auto-draft' === $post->post_status ) {
+	// Override "(Auto Draft)" new post default title with empty string, or filtered value.
+	$initial_edits = array(
+		'title'   => array(
+			'raw' => $post->post_title,
+		),
+		'content' => array(
+			'raw' => $post->post_content,
+		),
+		'excerpt' => array(
+			'raw' => $post->post_excerpt,
+		),
+	);
+}
+
+// Prepare Jed locale data.
+$locale_data = wp_get_jed_locale_data( 'default' );
+wp_add_inline_script(
+	'wp-i18n',
+	'wp.i18n.setLocaleData( ' . json_encode( $locale_data ) . ' );'
+);
+
+// Preload server-registered block schemas.
+wp_add_inline_script(
+	'wp-blocks',
+	'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . json_encode( get_block_editor_server_block_settings() ) . ');'
+);
+
+// Get admin url for handling meta boxes.
+$meta_box_url = admin_url( 'post.php' );
+$meta_box_url = add_query_arg(
+	array(
+		'post'            => $post->ID,
+		'action'          => 'edit',
+		'meta-box-loader' => true,
+	),
+	$meta_box_url
+);
+wp_localize_script( 'wp-editor', '_wpMetaBoxUrl', $meta_box_url );
+
+
+// Populate default code editor settings by short-circuiting wp_enqueue_code_editor.
+wp_add_inline_script(
+	'wp-editor',
+	sprintf(
+		'window._wpGutenbergCodeEditorSettings = %s;',
+		wp_json_encode( wp_get_code_editor_settings( array( 'type' => 'text/html' ) ) )
+	)
+);
+
+// Initialize the editor.
+$gutenberg_theme_support = get_theme_support( 'gutenberg' );
+$align_wide              = get_theme_support( 'align-wide' );
+$color_palette           = current( (array) get_theme_support( 'editor-color-palette' ) );
+$font_sizes              = current( (array) get_theme_support( 'editor-font-sizes' ) );
+
+/**
+ * Filters the allowed block types for the editor, defaulting to true (all
+ * block types supported).
+ *
+ * @since 5.0.0
+ *
+ * @param bool|array $allowed_block_types Array of block type slugs, or
+ *                                        boolean to enable/disable all.
+ * @param object $post                    The post resource data.
+ */
+$allowed_block_types = apply_filters( 'allowed_block_types', true, $post );
+
+/** This filter is documented in wp-admin/includes/meta-boxes.php */
+$default_title = apply_filters( 'default_page_template_title', __( 'Default template' ), 'rest-api' );
+
+// Get all available templates for the post/page attributes meta-box.
+// The "Default template" array element should only be added if the array is
+// not empty so we do not trigger the template select element without any options
+// besides the default value.
+$available_templates = wp_get_theme()->get_page_templates( get_post( $post->ID ) );
+$available_templates = ! empty( $available_templates ) ? array_merge(
+	array(
+		'' => $default_title,
+	),
+	$available_templates
+) : $available_templates;
+
+// Media settings.
+$max_upload_size = wp_max_upload_size();
+if ( ! $max_upload_size ) {
+	$max_upload_size = 0;
+}
+
+/**
+ * Editor Styles.
+ *
+ * @global array $editor_styles Registered editor stylesheets.
+ */
+global $editor_styles;
+$styles = array(
+	array(
+		'css' => file_get_contents(
+			ABSPATH . WPINC . '/css/dist/editor/editor-styles.css'
+		),
+	),
+);
+if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) {
+	foreach ( $editor_styles as $style ) {
+		if ( filter_var( $style, FILTER_VALIDATE_URL ) ) {
+			$styles[] = array(
+				'css' => file_get_contents( $style ),
+			);
+		} else {
+			$file     = get_theme_file_path( $style );
+			$styles[] = array(
+				'css'     => file_get_contents( get_theme_file_path( $style ) ),
+				'baseURL' => get_theme_file_uri( $style ),
+			);
+		}
+	}
+}
+
+// Lock settings.
+$user_id = wp_check_post_lock( $post->ID );
+if ( $user_id ) {
+	/** This filter is documented in wp-admin/includes/post.php */
+	if ( apply_filters( 'show_post_locked_dialog', true, $post, $user_id ) ) {
+		$locked = true;
+	}
+
+	$user_details = null;
+	if ( $locked ) {
+		$user         = get_userdata( $user_id );
+		$user_details = array(
+			'name' => $user->display_name,
+		);
+		$avatar       = get_avatar( $user_id, 64 );
+		if ( $avatar ) {
+			if ( preg_match( "|src='([^']+)'|", $avatar, $matches ) ) {
+				$user_details['avatar'] = $matches[1];
+			}
+		}
+	}
+
+	$lock_details = array(
+		'isLocked' => $locked,
+		'user'     => $user_details,
+	);
+} else {
+	// Lock the post.
+	$active_post_lock = wp_set_post_lock( $post->ID );
+	$lock_details     = array(
+		'isLocked'       => false,
+		'activePostLock' => esc_attr( implode( ':', $active_post_lock ) ),
+	);
+}
+
+/** This filter is documented in wp-admin/edit-form-advanced.php */
+$title_placeholder = apply_filters( 'enter_title_here', __( 'Add title' ), $post );
+
+/**
+ * Filters the body placeholder text.
+ *
+ * @since 5.0.0
+ *
+ * @param string  $text Placeholder text. Default 'Write your story'.
+ * @param WP_Post $post Post object.
+ */
+$body_placeholder = apply_filters( 'write_your_story', __( 'Write your story' ), $post );
+
+$editor_settings = array(
+	'alignWide'              => $align_wide || ! empty( $gutenberg_theme_support[0]['wide-images'] ), // Backcompat. Use `align-wide` outside of `gutenberg` array.
+	'availableTemplates'     => $available_templates,
+	'allowedBlockTypes'      => $allowed_block_types,
+	'disableCustomColors'    => get_theme_support( 'disable-custom-colors' ),
+	'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ),
+	'disablePostFormats'     => ! current_theme_supports( 'post-formats' ),
+	'titlePlaceholder'       => $title_placeholder,
+	'bodyPlaceholder'        => $body_placeholder,
+	'isRTL'                  => is_rtl(),
+	'autosaveInterval'       => 10,
+	'maxUploadFileSize'      => $max_upload_size,
+	'allowedMimeTypes'       => get_allowed_mime_types(),
+	'styles'                 => $styles,
+	'postLock'               => $lock_details,
+
+	// Ideally, we'd remove this and rely on a REST API endpoint.
+	'postLockUtils'          => array(
+		'nonce'       => wp_create_nonce( 'lock-post_' . $post->ID ),
+		'unlockNonce' => wp_create_nonce( 'update-post_' . $post->ID ),
+		'ajaxUrl'     => admin_url( 'admin-ajax.php' ),
+	),
+);
+
+$autosave = wp_get_post_autosave( $post_ID );
+if ( $autosave ) {
+	if ( mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) {
+		$editor_settings['autosave'] = array(
+			'editLink' => add_query_arg( 'gutenberg', true, get_edit_post_link( $post_autosave->ID ) ),
+		);
+	} else {
+		wp_delete_post_revision( $autosave->ID );
+	}
+}
+
+if ( false !== $color_palette ) {
+	$editor_settings['colors'] = $color_palette;
+}
+
+if ( ! empty( $font_sizes ) ) {
+	$editor_settings['fontSizes'] = $font_sizes;
+}
+
+if ( ! empty( $post_type_object->template ) ) {
+	$editor_settings['template']     = $post_type_object->template;
+	$editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false;
+}
+
+$init_script = <<<JS
+( function() {
+	window._wpLoadBlockEditor = new Promise( function( resolve ) {
+		wp.domReady( function() {
+			resolve( wp.editPost.initializeEditor( 'editor', "%s", %d, %s, %s ) );
+		} );
+	} );
+} )();
+JS;
+
+/**
+ * Filters the settings to pass to the block editor.
+ *
+ * @since 5.0.0
+ *
+ * @param array   $editor_settings Default editor settings.
+ * @param WP_Post $post            Post being edited.
+ */
+$editor_settings = apply_filters( 'block_editor_settings', $editor_settings, $post );
+
+$script = sprintf(
+	$init_script,
+	$post->post_type,
+	$post->ID,
+	wp_json_encode( $editor_settings ),
+	wp_json_encode( $initial_edits )
+);
+wp_add_inline_script( 'wp-edit-post', $script );
+
+/**
+ * Scripts.
+ */
+wp_enqueue_media(
+	array(
+		'post' => $post->ID,
+	)
+);
+wp_enqueue_editor();
+
+/**
+ * Styles.
+ */
+wp_enqueue_style( 'wp-edit-post' );
+
+$block_registry = WP_Block_Type_Registry::get_instance();
+foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) {
+	// Front-end styles.
+	if ( ! empty( $block_type->style ) ) {
+		wp_enqueue_style( $block_type->style );
+	}
+
+	// Front-end script.
+	if ( ! empty( $block_type->script ) ) {
+		wp_enqueue_script( $block_type->script );
+	}
+
+	// Editor styles.
+	if ( ! empty( $block_type->editor_style ) ) {
+		wp_enqueue_style( $block_type->editor_style );
+	}
+
+	// Editor script.
+	if ( ! empty( $block_type->editor_script ) ) {
+		wp_enqueue_script( $block_type->editor_script );
+	}
+}
+
+/**
+ * Fires after block assets have been enqueued for the editing interface.
+ *
+ * Call `add_action` on any hook before 'admin_enqueue_scripts'.
+ *
+ * In the function call you supply, simply use `wp_enqueue_script` and
+ * `wp_enqueue_style` to add your functionality to the Gutenberg editor.
+ *
+ * @since 5.0.0
+ */
+do_action( 'enqueue_block_editor_assets' );
+
+require_once( ABSPATH . 'wp-admin/admin-header.php' );
+?>
+
+<div class="gutenberg block-editor">
+	<h1 class="screen-reader-text"><?php echo esc_html( $post_type_object->labels->edit_item ); ?></h1>
+	<div id="editor" class="block-editor__container"></div>
+	<div id="metaboxes" style="display: none;">
+		<?php the_block_editor_metaboxes(); ?>
+	</div>
+</div>
diff --git src/wp-admin/post-new.php src/wp-admin/post-new.php
index 5eee06a..db523cf 100644
--- src/wp-admin/post-new.php
+++ src/wp-admin/post-new.php
@@ -72,8 +72,12 @@ $post_ID = $post->ID;
 
 /** This filter is documented in wp-admin/post.php */
 if ( apply_filters( 'replace_editor', false, $post ) !== true ) {
-	wp_enqueue_script( 'autosave' );
-	include( ABSPATH . 'wp-admin/edit-form-advanced.php' );
+	if ( use_block_editor_for_post( $post ) ) {
+		include( ABSPATH . 'wp-admin/edit-form-blocks.php' );
+	} else {
+		wp_enqueue_script( 'autosave' );
+		include( ABSPATH . 'wp-admin/edit-form-advanced.php' );
+	}
 }
 
 include( ABSPATH . 'wp-admin/admin-footer.php' );
diff --git src/wp-admin/post.php src/wp-admin/post.php
index dbfb156..897ff1d 100644
--- src/wp-admin/post.php
+++ src/wp-admin/post.php
@@ -156,6 +156,11 @@ case 'edit':
 		break;
 	}
 
+	if ( use_block_editor_for_post( $post ) ) {
+		include( ABSPATH . 'wp-admin/edit-form-blocks.php' );
+		break;
+	}
+
 	if ( ! wp_check_post_lock( $post->ID ) ) {
 		$active_post_lock = wp_set_post_lock( $post->ID );
 
