diff --git src/wp-admin/includes/class-wp-press-this.php src/wp-admin/includes/class-wp-press-this.php
index 71ce515..5696e5a 100644
--- src/wp-admin/includes/class-wp-press-this.php
+++ src/wp-admin/includes/class-wp-press-this.php
@@ -1272,6 +1272,12 @@ class WP_Press_This {
 		wp_enqueue_script( 'json2' );
 		wp_enqueue_script( 'editor' );
 
+		// Localize API plugin settings and schema.
+		$api_settings = array(
+			'url'          => esc_url_raw( get_rest_url() . 'wp/v2/' ),
+			'nonce'        => wp_create_nonce( 'wp_rest' ),
+		);
+		wp_localize_script( 'press-this', 'wpApi', $api_settings );
 		$supports_formats = false;
 		$post_format      = 0;
 
@@ -1352,7 +1358,6 @@ class WP_Press_This {
 		<?php
 
 		wp_nonce_field( 'update-post_' . $post_ID, '_wpnonce', false );
-		wp_nonce_field( 'add-category', '_ajax_nonce-add-category', false );
 
 		?>
 
diff --git src/wp-admin/js/press-this.js src/wp-admin/js/press-this.js
index bf2e830..348a0ab 100644
--- src/wp-admin/js/press-this.js
+++ src/wp-admin/js/press-this.js
@@ -262,44 +262,56 @@
 		 * @param action string publish|draft
 		 */
 		function submitPost( action ) {
-			var data;
+			var data, toSend;
 
 			saveAlert = false;
 			showSpinner();
 
 			if ( 'publish' === action ) {
-				$( '#post_status' ).val( 'publish' );
+				$( '#post_status' ).val( action );
 			}
 
 			prepareFormData();
-			data = $( '#pressthis-form' ).serialize();
+
+			data = $( '#pressthis-form' ).serializeArray();
+
+			toSend = {
+				'title':     $( '#post_title' ).val(),
+				'content':   $( '#post_content' ).val(),
+				'excerpt':   $( '#post_excerpt' ).val(),
+				'post_status': action,
+				'_wpnonce':  wpApi.nonce
+			}
+
 
 			$.ajax( {
-				type: 'post',
-				url: window.ajaxurl,
-				data: data
+				'type':     'POST',
+				'url':      wpApi.url + 'posts?press-this-post-save=true&pt-force-redirect=' + $( '#pt-force-redirect' ).val(),
+				'data':     toSend,
+				'dataType': 'json'
 			}).always( function() {
 				hideSpinner();
 				clearNotices();
 				$( '.publish-button' ).removeClass( 'is-saving' );
 			}).done( function( response ) {
-				if ( ! response.success ) {
-					renderError( response.data.errorMessage );
-				} else if ( response.data.redirect ) {
-					if ( window.opener && ( settings.redirInParent || response.data.force ) ) {
+
+				// We successfully saved the post.
+				 if ( response.redirect ) {
+					if ( window.opener && ( settings.redirInParent || response.force ) ) {
 						try {
-							window.opener.location.href = response.data.redirect;
+							window.opener.location.href = response.redirect;
 
 							window.setTimeout( function() {
 								window.self.close();
 							}, 200 );
 						} catch( er ) {
-							window.location.href = response.data.redirect;
+							window.location.href = response.redirect;
 						}
 					} else {
-						window.location.href = response.data.redirect;
+						window.location.href = response.redirect;
 					}
 				}
+
 			}).fail( function() {
 				renderError( __( 'serverError' ) );
 			});
@@ -344,53 +356,66 @@
 		 */
 		function saveNewCategory() {
 			var data,
-				name = $( '#new-category' ).val();
+				name     = $( '#new-category' ).val(),
+				catNonce = $( '#_ajax_nonce-add-category' ).val() || '',
+				parent   = $( '#new-category-parent' ).val() || 0;
 
+			// Don't save if we don't have a category name.
 			if ( ! name ) {
 				return;
 			}
 
+			// Set up the save data.
 			data = {
-				action: 'press-this-add-category',
-				post_id: $( '#post_ID' ).val() || 0,
-				name: name,
-				new_cat_nonce: $( '#_ajax_nonce-add-category' ).val() || '',
-				parent: $( '#new-category-parent' ).val() || 0
+				'name':     name,
+				'catNonce': catNonce,
+				'_wpnonce': wpApi.nonce
 			};
 
-			$.post( window.ajaxurl, data, function( response ) {
-				if ( ! response.success ) {
-					renderError( response.data.errorMessage );
-				} else {
-					var $parent, $ul,
-						$wrap = $( 'ul.categories-select' );
+			// Set a parent if selected.
+			if ( parent > 0 ) {
+				data['parent'] = parent;
+			}
 
-					$.each( response.data, function( i, newCat ) {
-						var $node = $( '<li>' ).append( $( '<div class="category selected" tabindex="0" role="checkbox" aria-checked="true">' )
-							.attr( 'data-term-id', newCat.term_id )
-							.text( newCat.name ) );
+			//  Send the data to the REST API.
+			$.ajax( {
+				'type':      'POST',
+				'url':       wpApi.url + 'categories?press-this-add-category=true',
+				'data':      data,
+				'dataType': 'json'
+			}).always( function() {
+			}).done( function( newCat ) {
+				var $parent, $ul,
+					$wrap = $( 'ul.categories-select' );
 
-						if ( newCat.parent ) {
-							if ( ! $ul || ! $ul.length ) {
-								$parent = $wrap.find( 'div[data-term-id="' + newCat.parent + '"]' ).parent();
-								$ul = $parent.find( 'ul.children:first' );
+				console.log (newCat);
 
-								if ( ! $ul.length ) {
-									$ul = $( '<ul class="children">' ).appendTo( $parent );
-								}
-							}
+				var $node = $( '<li>' ).append( $( '<div class="category selected" tabindex="0" role="checkbox" aria-checked="true">' )
+					.attr( 'data-term-id', newCat.term_id )
+					.text( newCat.name ) );
 
-							$ul.prepend( $node );
-						} else {
-							$wrap.prepend( $node );
-						}
+				if ( newCat.parent ) {
+					if ( ! $ul || ! $ul.length ) {
+						$parent = $wrap.find( 'div[data-term-id="' + newCat.parent + '"]' ).parent();
+						$ul = $parent.find( 'ul.children:first' );
 
-						$node.focus();
-					} );
+						if ( ! $ul.length ) {
+							$ul = $( '<ul class="children">' ).appendTo( $parent );
+						}
+					}
 
-					refreshCatsCache();
+					$ul.prepend( $node );
+				} else {
+					$wrap.prepend( $node );
 				}
-			} );
+
+				$node.focus();
+
+				refreshCatsCache();
+			}).fail( function( response ) {
+				renderError( response.data.errorMessage );
+			});
+
 		}
 
 		/* ***************************************************************
diff --git src/wp-includes/rest-api.php src/wp-includes/rest-api.php
index 8c252b4..96c1638 100644
--- src/wp-includes/rest-api.php
+++ src/wp-includes/rest-api.php
@@ -164,6 +164,99 @@ function rest_api_default_filters() {
 	add_filter( 'rest_post_dispatch', 'rest_send_allow_header', 10, 3 );
 
 	add_filter( 'rest_pre_dispatch', 'rest_handle_options_request', 10, 3 );
+	add_filter( 'rest_prepare_post', 'wp_prepare_press_this_response', 10, 3 );
+	add_filter( 'rest_pre_insert_post', 'wp_pre_insert_press_this_post', 10, 2 );
+
+
+}
+
+/**
+* Filter Press This posts before returning from the API.
+*
+*
+* @param WP_REST_Response  $response   The response object.
+* @param WP_Post           $post       The original post.
+* @param WP_REST_Request   $request    Request used to generate the response.
+*/
+function wp_prepare_press_this_response( $response, $post, $request ) {
+
+	$attributes = $request->get_attributes();
+	$params = $request->get_query_params();
+
+	// Only modify Quick Press responses.
+	if ( ! isset( $params['press-this-post-save'] ) ) {
+		return $response;
+	}
+
+	// Match the existing ajax handler logic.
+	$forceRedirect = false;
+
+	if ( 'publish' === get_post_status( $post->ID ) ) {
+		$redirect = get_post_permalink( $post->ID );
+	} elseif ( isset( $params['pt-force-redirect'] ) && $params['pt-force-redirect'] === 'true' ) {
+		$forceRedirect = true;
+		$redirect = get_edit_post_link( $post->ID, 'js' );
+	} else {
+		$redirect = false;
+	}
+
+	/**
+	 * Filters the URL to redirect to when Press This saves.
+	 *
+	 * @since 4.2.0
+	 *
+	 * @param string $url      Redirect URL. If `$status` is 'publish', this will be the post permalink.
+	 *                         Otherwise, the default is false resulting in no redirect.
+	 * @param int    $post->ID Post ID.
+	 * @param string $status   Post status.
+	 */
+	$redirect = apply_filters( 'press_this_save_redirect', $redirect, $post->ID, $post->post_status );
+
+	if ( $redirect ) {
+		$response->data['redirect'] = $redirect;
+		$response->data['force'] = $forceRedirect;
+	} else {
+		$response->data['postSaved'] = true;
+	}
+
+	return $response;
+}
+
+/**
+ * Filter Press This posts before they are inserted into the database.
+ *
+ * @param stdClass        $prepared_post An object representing a single post prepared
+ *                                       for inserting or updating the database.
+ * @param WP_REST_Request $request       Request object.
+ */
+function wp_pre_insert_press_this_post( $prepared_post, $request ) {
+
+	// Only modify Quick Press posts.
+	if ( ! isset( $request->data['press-this-post-save'] ) ) {
+		return $prepared_post;
+	}
+
+	// @todo category ?
+
+	$post_data = $prepared_post->to_array();
+	include( ABSPATH . 'wp-admin/includes/class-wp-press-this.php' );
+	$wp_press_this = new WP_Press_This();
+
+	// Side load images for this post.
+	$post_data['post_content'] = $wp_press_this->side_load_images( $post_id, $post_data['post_content'] );
+
+	/**
+	 * Filters the post data of a Press This post before saving/updating.
+	 *
+	 * The {@see 'side_load_images'} action has already run at this point.
+	 *
+	 * @since 4.5.0
+	 *
+	 * @param array $post_data The post data.
+	 */
+	$post_data = apply_filters( 'press_this_save_post', $post_data );
+
+	return $post_data;
 }
 
 /**
