diff --git src/wp-admin/includes/dashboard.php src/wp-admin/includes/dashboard.php
index aab5976..83fa978 100644
--- src/wp-admin/includes/dashboard.php
+++ src/wp-admin/includes/dashboard.php
@@ -491,33 +491,26 @@ function wp_dashboard_quick_press( $error_msg = false ) {
 	$post_ID = (int) $post->ID;
 ?>
 
-	<form name="post" action="<?php echo esc_url( admin_url( 'post.php' ) ); ?>" method="post" id="quick-press" class="initial-form hide-if-no-js">
-
-		<?php if ( $error_msg ) : ?>
-		<div class="error"><?php echo $error_msg; ?></div>
-		<?php endif; ?>
+	<form name="post" method="post" id="quick-press" class="initial-form hide-if-no-js">
 
 		<div class="input-text-wrap" id="title-wrap">
-			<label class="screen-reader-text prompt" for="title" id="title-prompt-text">
+			<label class="prompt" for="title" id="title-prompt-text">
 
 				<?php
 				/** This filter is documented in wp-admin/edit-form-advanced.php */
 				echo apply_filters( 'enter_title_here', __( 'Title' ), $post );
 				?>
 			</label>
-			<input type="text" name="post_title" id="title" autocomplete="off" />
+			<input type="text" name="title" id="title" autocomplete="off" />
 		</div>
 
 		<div class="textarea-wrap" id="description-wrap">
-			<label class="screen-reader-text prompt" for="content" id="content-prompt-text"><?php _e( 'What&#8217;s on your mind?' ); ?></label>
+			<label class="prompt" for="content" id="content-prompt-text"><?php _e( 'What&#8217;s on your mind?' ); ?></label>
 			<textarea name="content" id="content" class="mceEditor" rows="3" cols="15" autocomplete="off"></textarea>
 		</div>
-
 		<p class="submit">
-			<input type="hidden" name="action" id="quickpost-action" value="post-quickdraft-save" />
-			<input type="hidden" name="post_ID" value="<?php echo $post_ID; ?>" />
-			<input type="hidden" name="post_type" value="post" />
-			<?php wp_nonce_field( 'add-post' ); ?>
+			<div class="error inline" style="display: none;"><p></p></div>
+			<div class="spinner no-float"></div>
 			<?php submit_button( __( 'Save Draft' ), 'primary', 'save', false, array( 'id' => 'save-post' ) ); ?>
 			<br class="clear" />
 		</p>
@@ -554,31 +547,32 @@ function wp_dashboard_recent_drafts( $drafts = false ) {
 		 */
 		$query_args = apply_filters( 'dashboard_recent_drafts_query_args', $query_args );
 
-		$drafts = get_posts( $query_args );
+		$dashboard_data_request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
+		$dashboard_data_request->set_query_params( array(
+			'filter[post_type]' => 'post',
+			'status'            => 'draft',
+			'author'            => get_current_user_id(),
+			'per_page'          => 4
+		) );
+		$drafts = rest_do_request( $dashboard_data_request );
+
 		if ( ! $drafts ) {
 			return;
  		}
- 	}
 
-	echo '<div class="drafts">';
-	if ( count( $drafts ) > 3 ) {
-		echo '<p class="view-all"><a href="' . esc_url( admin_url( 'edit.php?post_status=draft' ) ) . '" aria-label="' . __( 'View all drafts' ) . '">' . _x( 'View all', 'drafts' ) . "</a></p>\n";
- 	}
-	echo '<h2 class="hide-if-no-js">' . __( 'Drafts' ) . "</h2>\n<ul>";
-
-	$drafts = array_slice( $drafts, 0, 3 );
-	foreach ( $drafts as $draft ) {
-		$url = get_edit_post_link( $draft->ID );
-		$title = _draft_or_post_title( $draft->ID );
-		echo "<li>\n";
-		/* translators: %s: post title */
-		echo '<div class="draft-title"><a href="' . esc_url( $url ) . '" aria-label="' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ) . '">' . esc_html( $title ) . '</a>';
-		echo '<time datetime="' . get_the_time( 'c', $draft ) . '">' . get_the_time( __( 'F j, Y' ), $draft ) . '</time></div>';
-		if ( $the_content = wp_trim_words( $draft->post_content, 10 ) ) {
-			echo '<p>' . $the_content . '</p>';
- 		}
-		echo "</li>\n";
  	}
+
+	echo '<div id="quick-press-drafts" class="drafts">';
+	echo '<p class="view-all" style="display: none;"><a href="' . esc_url( admin_url( 'edit.php?post_status=draft' ) ) . '" aria-label="' . __( 'View all drafts' ) . '">' . _x( 'View all', 'drafts' ) . "</a></p>\n";
+	echo '<h2 class="hide-if-no-js">' . __( 'Drafts' ) . "</h2>\n";
+	echo '<script type="text/javascript">var quickPress = {}; quickPress.data =  ' . json_encode( $drafts ) . ';</script>';
+	echo '<script id="tmpl-item-quick-press-draft" type="text/template">';
+	/* translators: %s: post title */
+	echo '<div class="draft-title"><a href="{{ data.link }}" aria-label="' . esc_attr( __( 'Edit Post' ) ) . '">{{ data.title }}</a>';
+	echo '<time datetime="{{ data.date }}">{{ data.formattedDate }}</time></div>';
+	echo '{{{ data.formattedShortContent }}}';
+	echo '</script>';
+	echo '<ul class="drafts-list">';
 	echo "</ul>\n</div>";
 }
 
diff --git src/wp-admin/js/dashboard.js src/wp-admin/js/dashboard.js
index fa100dd..43d4a36 100644
--- src/wp-admin/js/dashboard.js
+++ src/wp-admin/js/dashboard.js
@@ -1,4 +1,4 @@
-/* global pagenow, ajaxurl, postboxes, wpActiveEditor:true */
+/* global wp, quickPress, pagenow, ajaxurl, postboxes, wpActiveEditor:true */
 var ajaxWidgets, ajaxPopulateWidgets, quickPressLoad;
 
 jQuery(document).ready( function($) {
@@ -61,68 +61,6 @@ jQuery(document).ready( function($) {
 
 	postboxes.add_postbox_toggles(pagenow, { pbshow: ajaxPopulateWidgets } );
 
-	/* QuickPress */
-	quickPressLoad = function() {
-		var act = $('#quickpost-action'), t;
-
-		$( '#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]' ).prop( 'disabled' , false );
-
-		t = $('#quick-press').submit( function( e ) {
-			e.preventDefault();
-			$('#dashboard_quick_press #publishing-action .spinner').show();
-			$('#quick-press .submit input[type="submit"], #quick-press .submit input[type="reset"]').prop('disabled', true);
-
-			$.post( t.attr( 'action' ), t.serializeArray(), function( data ) {
-				// Replace the form, and prepend the published post.
-				$('#dashboard_quick_press .inside').html( data );
-				$('#quick-press').removeClass('initial-form');
-				quickPressLoad();
-				highlightLatestPost();
-				$('#title').focus();
-			});
-
-			function highlightLatestPost () {
-				var latestPost = $('.drafts ul li').first();
-				latestPost.css('background', '#fffbe5');
-				setTimeout(function () {
-					latestPost.css('background', 'none');
-				}, 1000);
-			}
-		} );
-
-		$('#publish').click( function() { act.val( 'post-quickpress-publish' ); } );
-
-		$('#title, #tags-input, #content').each( function() {
-			var input = $(this), prompt = $('#' + this.id + '-prompt-text');
-
-			if ( '' === this.value ) {
-				prompt.removeClass('screen-reader-text');
-			}
-
-			prompt.click( function() {
-				$(this).addClass('screen-reader-text');
-				input.focus();
-			});
-
-			input.blur( function() {
-				if ( '' === this.value ) {
-					prompt.removeClass('screen-reader-text');
-				}
-			});
-
-			input.focus( function() {
-				prompt.addClass('screen-reader-text');
-			});
-		});
-
-		$('#quick-press').on( 'click focusin', function() {
-			wpActiveEditor = 'content';
-		});
-
-		autoResizeTextarea();
-	};
-	quickPressLoad();
-
 	$( '.meta-box-sortables' ).sortable( 'option', 'containment', '#wpwrap' );
 
 	function autoResizeTextarea() {
@@ -186,4 +124,195 @@ jQuery(document).ready( function($) {
 		});
 	}
 
+	autoResizeTextarea();
+
+} );
+
+wp.api.loadPromise.done( function() {
+	var $ = jQuery,
+		QuickPress = {},
+		draftsCollection;
+
+	QuickPress.Models = {};
+
+	QuickPress.Models.Draft = wp.api.models.Post.extend({
+		initialize: function( attributes ) {
+			if ( attributes ) {
+				this.set( this.normalizeAttributes( attributes ) );
+			}
+		},
+
+		parse: function( response ) {
+			return this.normalizeAttributes( response );
+		},
+
+		normalizeAttributes: function( attributes ) {
+			if ( ! attributes ) {
+				return attributes;
+			}
+
+			if ( 'object' === typeof attributes.content ) {
+				attributes.content = attributes.content.rendered;
+			}
+
+			if ( 'object' === typeof attributes.title ) {
+				attributes.title = attributes.title.rendered;
+			}
+
+			return attributes;
+		},
+
+		validate: function( attributes ) {
+			if ( ! attributes.title && ! attributes.content ) {
+				return 'no-content';
+			}
+		}
+	});
+
+	QuickPress.Collections = {};
+
+	QuickPress.Collections.Drafts = wp.api.collections.Posts.extend({
+		model: QuickPress.Models.Draft,
+
+		comparator: function( a, b ) {
+			return a.get( 'date' ) < b.get( 'date' );
+		}
+	});
+
+	QuickPress.Views = {};
+
+	QuickPress.Views.Form = wp.Backbone.View.extend({
+		events: {
+			'click #title-wrap,#description-wrap': 'hidePromptAndFocus',
+			'focus #title-wrap,#description-wrap': 'hidePrompt',
+			'blur #title-wrap,#description-wrap': 'showPrompt',
+			click: 'setActiveEditor',
+			focusin: 'setActiveEditor',
+			submit: 'submit'
+		},
+
+		initialize: function() {
+			this.listenTo( this.model, 'invalid', this.render );
+		},
+
+		togglePrompt: function( element, visible ) {
+			var $input = $( ':input', element ),
+				hasContent = $input.val().length > 0;
+
+			$( '.prompt', element ).toggleClass( 'screen-reader-text', ! visible || hasContent );
+		},
+
+		showPrompt: function( event ) {
+			this.togglePrompt( event.currentTarget, true );
+		},
+
+		hidePrompt: function( event ) {
+			this.togglePrompt( event.currentTarget, false );
+		},
+
+		hidePromptAndFocus: function( event ) {
+			this.togglePrompt( event.currentTarget, false );
+			$( ':input', event.target ).focus();
+		},
+
+		setActiveEditor: function() {
+			wpActiveEditor = 'content';
+		},
+
+		submit: function( event ) {
+			var values;
+
+			event.preventDefault();
+
+			values = this.$el.serializeArray().reduce( function( memo, field ) {
+				memo[ field.name ] = field.value;
+				return memo;
+			}, {} );
+
+			this.model.set( values );
+			if ( ! this.model.isValid() ) {
+				return;
+			}
+
+			// Show a spinner during the callback.
+			$('#quick-press .spinner').css( 'visibility', 'inherit' );
+
+			this.model.save()
+				// TODO: `always` should be `done` to handle success only
+				.always( function() {
+					console.log( 'always' );
+					$( '#quick-press .spinner' ).css( 'visibility', 'hidden' );
+				} )
+				.success( function(){
+					console.log( 'success' );
+					this.collection.add( this.model );
+					// @todo Refresh the nonce (client should handle this).
+					// @todo Clear the form.
+				}.bind( this ) )
+				.error( function() {
+					console.log( 'error' );
+				// 	// TODO: Handle failure
+				} );
+
+			// TODO: Clear form model
+		},
+
+		render: function() {
+			var $error = this.$el.find( '.error' );
+
+			$error.toggle( !! this.model.validationError );
+			if ( this.model.validationError ) {
+				$error.html( $( '<p />', {
+					text: quickPress.l10n[ this.model.validationError ]
+				} ) );
+			}
+		}
+	});
+
+	QuickPress.Views.DraftList = wp.Backbone.View.extend({
+		initialize: function() {
+			this.listenTo( this.collection, 'add', this.render );
+		},
+
+		render: function() {
+			var slicedCollection = this.collection.slice( 0, 4 );
+
+			this.$el.toggle( this.collection.length > 0 );
+			this.$el.find( '.view-all' ).toggle( slicedCollection.length > 3 );
+			this.$el.find( '.drafts-list' ).html( slicedCollection.map( function( draft ) {
+				return new QuickPress.Views.DraftListItem({
+					model: draft
+				}).render().el;
+			}) );
+
+			return this;
+		}
+	});
+
+	QuickPress.Views.DraftListItem = wp.Backbone.View.extend({
+		tagName: 'li',
+
+		template: wp.template( 'item-quick-press-draft' ),
+
+		render: function() {
+			// TODO: Render highlight effect to new post
+
+			this.$el.html( this.template( this.model.attributes ) );
+
+			return this;
+		}
+	});
+
+	draftsCollection = new QuickPress.Collections.Drafts( quickPress.data.data );
+
+	new QuickPress.Views.DraftList({
+		el: '#quick-press-drafts',
+		collection: draftsCollection
+	}).render();
+
+	new QuickPress.Views.Form({
+		el: '#quick-press',
+		model: new QuickPress.Models.Draft(),
+		collection: draftsCollection
+	}).render();
 } );
diff --git src/wp-admin/post.php src/wp-admin/post.php
index 437d1bd..df78352 100644
--- src/wp-admin/post.php
+++ src/wp-admin/post.php
@@ -60,34 +60,6 @@ if ( ! $sendback ||
 }
 
 switch($action) {
-case 'post-quickdraft-save':
-	// Check nonce and capabilities
-	$nonce = $_REQUEST['_wpnonce'];
-	$error_msg = false;
-
-	// For output of the quickdraft dashboard widget
-	require_once ABSPATH . 'wp-admin/includes/dashboard.php';
-
-	if ( ! wp_verify_nonce( $nonce, 'add-post' ) )
-		$error_msg = __( 'Unable to submit this form, please refresh and try again.' );
-
-	if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {
-		exit;
-	}
-
-	if ( $error_msg )
-		return wp_dashboard_quick_press( $error_msg );
-
-	$post = get_post( $_REQUEST['post_ID'] );
-	check_admin_referer( 'add-' . $post->post_type );
-
-	$_POST['comment_status'] = get_default_comment_status( $post->post_type );
-	$_POST['ping_status']    = get_default_comment_status( $post->post_type, 'pingback' );
-
-	edit_post();
-	wp_dashboard_quick_press();
-	exit;
-
 case 'postajaxpost':
 case 'post':
 	check_admin_referer( 'add-' . $post_type );
diff --git src/wp-includes/default-filters.php src/wp-includes/default-filters.php
index d5f2116..699c8af 100644
--- src/wp-includes/default-filters.php
+++ src/wp-includes/default-filters.php
@@ -492,5 +492,6 @@ add_filter( 'the_excerpt_embed',      'wp_embed_excerpt_attachment'           );
 add_filter( 'oembed_dataparse',       'wp_filter_oembed_result',        10, 3 );
 add_filter( 'oembed_response_data',   'get_oembed_response_data_rich',  10, 4 );
 add_filter( 'pre_oembed_result',      'wp_filter_pre_oembed_result',    10, 3 );
+add_action( 'rest_api_init',          'wp_dashboard_filter_api'              );
 
 unset( $filter, $action );
diff --git src/wp-includes/script-loader.php src/wp-includes/script-loader.php
index 874f5e7..15634ad 100644
--- src/wp-includes/script-loader.php
+++ src/wp-includes/script-loader.php
@@ -705,7 +705,7 @@ function wp_default_scripts( &$scripts ) {
 			'current' => __( 'Current Color' ),
 		) );
 
-		$scripts->add( 'dashboard', "/wp-admin/js/dashboard$suffix.js", array( 'jquery', 'admin-comments', 'postbox' ), false, 1 );
+		$scripts->add( 'dashboard', "/wp-admin/js/dashboard$suffix.js", array( 'jquery', 'admin-comments', 'postbox', 'wp-api', 'wp-backbone' ), false, 1 );
 
 		$scripts->add( 'list-revisions', "/wp-includes/js/wp-list-revisions$suffix.js" );
 
@@ -1175,6 +1175,30 @@ function _wp_footer_scripts() {
 }
 
 /**
+ * Set up a filter for the dashboard API requests.
+ */
+function wp_dashboard_filter_api() {
+
+	/**
+	 * Filter the WP API response for the recent drafts widget in the dashboard, adding a formatted date
+	 * which is difficult to construct correctly in JavaScript.
+	 */
+	function wp_dashboard_filter_api_post( $response, $post, $request ) {
+
+		if ( 'draft' !== $post->post_status ) {
+			return;
+		}
+
+		$response->data['formattedDate']         = get_the_time( __( 'F j, Y' ), $post );
+		$response->data['formattedShortContent'] = wp_trim_words( $post->post_content, 10 );
+		return $response;
+	}
+
+	add_filter( "rest_prepare_post", 'wp_dashboard_filter_api_post', 10, 3 );
+
+}
+
+/**
  * Hooks to print the scripts and styles in the footer.
  *
  * @since 2.8.0
