Index: src/wp-admin/includes/class-wp-press-this.php
===================================================================
--- src/wp-admin/includes/class-wp-press-this.php	(revision 31674)
+++ src/wp-admin/includes/class-wp-press-this.php	(working copy)
@@ -14,6 +14,10 @@
  */
 class WP_Press_This {
 
+	private $images = array();
+
+	private $embeds = array();
+
 	/**
 	 * Constructor.
 	 *
@@ -31,16 +35,10 @@
 	 * @return array Site settings.
 	 */
 	public function site_settings() {
-		$default_html = array(
-			'quote' => '<blockquote>%1$s</blockquote>',
-			'link' => '<p>' . _x( 'Source:', 'Used in Press This to indicate where the content comes from.' ) .
-				' <em><a href="%1$s">%2$s</a></em></p>',
-		);
-
 		return array(
 			// Used to trigger the bookmarklet update notice.
 			// Needs to be set here and in get_shortcut_link() in wp-includes/link-template.php.
-			'version' => '6',
+			'version' => '7',
 
 			/**
 			 * Filter whether or not Press This should redirect the user in the parent window upon save.
@@ -50,16 +48,6 @@
 			 * @param bool false Whether to redirect in parent window or not. Default false.
 			 */
 			'redirInParent' => apply_filters( 'press_this_redirect_in_parent', false ),
-
-			/**
-			 * Filter the default HTML for the Press This editor.
-			 *
-			 * @since 4.2.0
-			 *
-			 * @param array $default_html Associative array with two keys: 'quote' where %1$s is replaced with the site description
-			 *                            or the selected content, and 'link' there %1$s is link href, %2$s is link text.
-			 */
-			'html' => apply_filters( 'press_this_suggested_html', $default_html ),
 		);
 	}
 
@@ -435,7 +423,7 @@
 	}
 
 	private function _process_meta_entry( $meta_name, $meta_value, $data ) {
-		if ( preg_match( '/:?(title|description|keywords)$/', $meta_name ) ) {
+		if ( preg_match( '/:?(title|description|keywords|site_name)$/', $meta_name ) ) {
 			$data['_meta'][ $meta_name ] = $meta_value;
 		} else {
 			switch ( $meta_name ) {
@@ -452,6 +440,9 @@
 						$data['_embed'][] = $meta_value;
 					}
 
+					// Add it back to _meta so we can use it as URL if needed
+					$data['_meta'][ $meta_name ] = $meta_value;
+
 					break;
 				case 'og:image':
 				case 'og:image:secure_url':
@@ -572,13 +563,11 @@
 			$items = $this->_limit_array( $matches[0] );
 
 			foreach ( $items as $value ) {
-				if ( preg_match( '/(rel|itemprop)="([^"]+)"[^>]+href="([^"]+)"/', $value, $new_matches ) ) {
-					if ( 'alternate' === $new_matches[2] || 'thumbnailUrl' === $new_matches[2] || 'url' === $new_matches[2] ) {
-						$url = $this->_limit_url( $new_matches[3] );
+				if ( ( false !== strpos( $value, 'rel="canonical"' ) || false !== strpos( $value, "rel='canonical'" ) ) && preg_match( '/href=[\'"]([^\'" ]+)[\'"]/', $value, $new_matches ) ) {
+					$url = $this->_limit_url( $new_matches[1] );
 
-						if ( ! empty( $url ) && empty( $data['_links'][ $new_matches[2] ] ) ) {
-							$data['_links'][ $new_matches[2] ] = $url;
-						}
+					if ( ! empty( $url ) && empty( $data['_links']['canonical'] ) ) {
+						$data['_links']['canonical'] = $url;
 					}
 				}
 			}
@@ -600,7 +589,7 @@
 		$data = array();
 
 		// Only instantiate the keys we want. Sanity check and sanitize each one.
-		foreach ( array( 'u', 's', 't', 'v', '_version' ) as $key ) {
+		foreach ( array( 'u', 's', 't', 'v' ) as $key ) {
 			if ( ! empty( $_POST[ $key ] ) ) {
 				$value = wp_unslash( $_POST[ $key ] );
 			} else if ( ! empty( $_GET[ $key ] ) ) {
@@ -635,7 +624,7 @@
 			if ( empty( $_POST ) && ! empty( $data['u'] ) ) {
 				$data = $this->source_data_fetch_fallback( $data['u'], $data );
 			} else {
-				foreach ( array( '_img', '_embed', '_meta' ) as $type ) {
+				foreach ( array( '_img', '_embed' ) as $type ) {
 					if ( empty( $_POST[ $type ] ) ) {
 						continue;
 					}
@@ -642,39 +631,45 @@
 
 					$data[ $type ] = array();
 					$items = $this->_limit_array( $_POST[ $type ] );
-					$items = wp_unslash( $items );
 
 					foreach ( $items as $key => $value ) {
-						if ( ! is_numeric( $key ) ) {
-							$key = $this->_limit_string( wp_unslash( $key ) );
+						if ( $type === '_img' ) {
+							$value = $this->_limit_img( wp_unslash( $value ) );
+						} else if ( $type === '_embed' ) {
+							$value = $this->_limit_embed( wp_unslash( $value ) );
+						}
 
-							// Sanity check. $key is usually things like 'title', 'description', 'keywords', etc.
-							if ( empty( $key ) || strlen( $key ) > 100 ) {
-								continue;
-							}
+						if ( ! empty( $value ) ) {
+							$data[ $type ][] = $value;
 						}
+					}
+				}
 
-						if ( $type === '_meta' ) {
-							$value = $this->_limit_string( $value );
+				if ( ! empty( $_POST['_meta'] ) && is_array( $_POST['_meta'] ) ) {
+					$data['_meta'] = array();
+					$items = $this->_limit_array( $_POST['_meta'] );
 
-							if ( ! empty( $value ) ) {
-								$data = $this->_process_meta_entry( $key, $value, $data );
-							}
-						} else if ( $type === '_img' ) {
-							$value = $this->_limit_img( $value );
+					foreach ( $items as $key => $value ) {
+						// Sanity check. These are associative arrays, $key is usually things like 'title', 'description', 'keywords', etc.
+						if ( empty( $key ) || strlen( $key ) > 100 ) {
+							continue;
+						}
 
-							if ( ! empty( $value ) ) {
-								$data[ $type ][] = $value;
-							}
-						} else if ( $type === '_embed' ) {
-							$value = $this->_limit_embed( $value );
+						$value = $this->_limit_string( wp_unslash( $value ) );
 
-							if ( ! empty( $value ) ) {
-								$data[ $type ][] = $value;
-							}
+						if ( ! empty( $value ) ) {
+							$data = $this->_process_meta_entry( $key, $value, $data );
 						}
 					}
 				}
+
+				if ( ! empty( $_POST['canonical'] ) ) {
+					$value = _limit_url( $_POST['canonical'] );
+
+					if ( $value ) {
+						$data['_links']['canonical'] = $value;
+					}
+				}
 			}
 		}
 
@@ -851,6 +846,190 @@
 	}
 
 	/**
+	 * Get a list of embeds with no duplicates.
+	 *
+	 * @param array $data The site's data.
+	 * @returns array
+	 */
+	public function get_embeds( $data ) {
+		$selected_embeds = array();
+
+		if ( ! empty( $data['_embeds'] ) ) {
+			foreach( $data['_embeds'] as $src ) {
+				$prot_relative_src = preg_replace( '/^https?:/', '', $src );
+
+				if ( in_array( $prot_relative_src, $this->embeds ) ) {
+					continue;
+				}
+
+				$selected_embeds[] = $src;
+				$this->embeds[] = $prot_relative_src;
+			}
+		}
+
+		return $selected_embeds;
+	}
+
+	/**
+	 * Get a list of images with no duplicates.
+	 *
+	 * @param array $data The site's data.
+	 * @returns array
+	 */
+	public function get_images( $data ) {
+		$selected_images = array();
+
+		if ( ! empty( $data['_img'] ) ) {
+			foreach( $data['_img'] as $src ) {
+				if ( false !== strpos( $src, 'gravatar.com' ) ) {
+					$src = preg_replace( '%http://[\d]+\.gravatar\.com/%', 'https://secure.gravatar.com/', $src );
+				}
+
+				$prot_relative_src = preg_replace( '/^https?:/', '', $src );
+
+				if ( in_array( $prot_relative_src, $this->images ) ||
+					( false !== strpos( $src, 'avatar' ) && count( $this->images ) > 15 ) ) {
+					// Skip: already selected or some type of avatar and we've already gathered more than 15 images.
+					continue;
+				}
+
+				$selected_images[] = $src;
+				$this->images[] = $prot_relative_src;
+			}
+		}
+
+		return $selected_images;
+	}
+
+	/**
+	 * Gets the source page's canonical link, based on passed location and meta data.
+	 *
+ 	 * @param array $data The site's data.
+	 * @returns string Discovered canonical URL, or empty
+	 */
+	public function get_canonical_link( $data ) {
+		$link = '';
+
+		if ( ! empty( $data['_links']['canonical'] ) ) {
+			$link = $data['_links']['canonical'];
+		} elseif ( ! empty( $data['u'] ) ) {
+			$link = $data['u'];
+		} elseif ( ! empty( $data['_meta'] ) ) {
+			if ( ! empty( $data['_meta']['twitter:url'] ) ) {
+				$link = $data['_meta']['twitter:url'];
+			} else if ( ! empty( $data['_meta']['og:url'] ) ) {
+				$link = $data['_meta']['og:url'];
+			}
+		}
+
+		return $link;
+	}
+
+	/**
+	 * Gets the source page's site name, based on passed meta data.
+	 *
+	 * @param array $data The site's data.
+	 * @returns string Discovered site name, or empty
+	 */
+	public function get_source_site_name( $data ) {
+		$name = '';
+
+		if ( ! empty( $data['_meta'] ) ) {
+			if ( ! empty( $data['_meta']['og:site_name'] ) ) {
+				$name = $data['_meta']['og:site_name'];
+			} else if ( ! empty( $data['_meta']['application-name'] ) ) {
+				$name = $data['_meta']['application-name'];
+			}
+		}
+
+		return $name;
+	}
+
+	/**
+	 * Gets the source page's title, based on passed title and meta data.
+	 *
+	 * @param array $data The site's data.
+	 * @returns string Discovered page title, or empty
+	 */
+	public function get_suggested_title( $data ) {
+		$title = '';
+
+		if ( ! empty( $data['t'] ) ) {
+			$title = $data['t'];
+		} elseif( ! empty( $data['_meta'] ) ) {
+			if ( ! empty( $data['_meta']['twitter:title'] ) ) {
+				$title = $data['_meta']['twitter:title'];
+			} else if ( ! empty( $data['_meta']['og:title'] ) ) {
+				$title = $data['_meta']['og:title'];
+			} else if ( ! empty( $data['_meta']['title'] ) ) {
+				$title = $data['_meta']['title'];
+			}
+		}
+
+		return $title;
+	}
+
+	/**
+	 * Gets the source page's suggested content, based on passed data (description, selection, etc).
+	 * Features a blockquoted excerpt, as well as content attribution, if any.
+	 *
+	 * @param array $data The site's data.
+	 * @returns string Discovered content, or empty
+	 */
+	public function get_suggested_content( $data ) {
+		$content = $text = '';
+
+		if ( ! empty( $data['s'] ) ) {
+			$text = $data['s'];
+		} else if ( ! empty( $data['_meta'] ) ) {
+			if ( ! empty( $data['_meta']['twitter:description'] ) ) {
+				$text = $data['_meta']['twitter:description'];
+			} else if ( ! empty( $data['_meta']['og:description'] ) ) {
+				$text = $data['_meta']['og:description'];
+			} else if ( ! empty( $data['_meta']['description'] ) ) {
+				$text = $data['_meta']['description'];
+			}
+		}
+
+		$default_html = array(
+			'quote' => '<blockquote>%1$s</blockquote>',
+			'link' => '<p>' . _x( 'Source:', 'Used in Press This to indicate where the content comes from.' ) .
+				' <em><a href="%1$s">%2$s</a></em></p>',
+		);
+
+		/**
+		 * Filter the default HTML for the Press This editor.
+		 *
+		 * @since 4.2.0
+		 *
+		 * @param array $default_html Associative array with two keys: 'quote' where %1$s is replaced with the site description
+		 *                            or the selected content, and 'link' there %1$s is link href, %2$s is link text.
+		 */
+		$default_html = apply_filters( 'press_this_suggested_html', $default_html, $data );
+
+		// Wrap suggested content in the specified HTML.
+		if ( ! empty( $default_html['quote'] ) ) {
+			$content = sprintf( $default_html['quote'], $text );
+		}
+
+		// Add source attribution if there is one available.
+		if ( ! empty( $default_html['link'] ) ) {
+			$title = $this->get_suggested_title( $data );
+			$url = $this->get_canonical_link( $data );
+
+			if ( ! $title ) {
+				$title = $this->get_source_site_name( $data );
+			}
+
+			if ( $url && $title ) {
+				$content .= sprintf( $default_html['link'], $url, $title );
+			}
+		}
+
+		return $content;
+	}
+
+	/**
 	 * Serves the app's base HTML, which in turns calls the load script.
 	 *
 	 * @since 4.2.0
@@ -862,12 +1041,34 @@
 		// Get data, new (POST) and old (GET).
 		$data = $this->merge_or_fetch_data();
 
+		$post_title = $this->get_suggested_title( $data );
+
+		if ( empty( $title ) ) {
+			$title = __( 'New Post' );
+		}
+
+		$post_content = $this->get_suggested_content( $data );
+
 		// Get site settings array/data.
 		$site_settings = $this->site_settings();
 
-		// Set the passed data.
-		$data['_version'] = $site_settings['version'];
+		// Pass the images and embeds
+		$images = $this->get_images( $data );
+		$embeds = $this->get_embeds( $data );
 
+		$site_data = array(
+			'v' => ! empty( $data['v'] ) ? $data['v'] : '',
+			'hasData' => ! empty( $data ),
+		);
+
+		if ( ! empty( $images ) ) {
+			$site_data['_images'] = $images;
+		}
+
+		if ( ! empty( $embeds ) ) {
+			$site_data['_embeds'] = $embeds;
+		}
+
 		// Add press-this-editor.css and remove theme's editor-style.css, if any.
 		remove_editor_styles();
 
@@ -890,8 +1091,8 @@
 	<title><?php esc_html_e( 'Press This!' ) ?></title>
 
 	<script>
-		window.wpPressThisData   = <?php echo wp_json_encode( $data ) ?>;
-		window.wpPressThisConfig = <?php echo wp_json_encode( $site_settings ) ?>;
+		window.wpPressThisData   = <?php echo wp_json_encode( $site_data ); ?>;
+		window.wpPressThisConfig = <?php echo wp_json_encode( $site_settings ); ?>;
 	</script>
 
 	<script type="text/javascript">
@@ -959,7 +1160,7 @@
 	$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', $wp_version ) );
 	$admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' );
 	$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
-	
+
 	/** This filter is documented in wp-admin/admin-header.php */
 	$admin_body_classes = apply_filters( 'admin_body_class', '' );
 
@@ -1007,7 +1208,7 @@
 
 			<div id='app-container' class="editor">
 				<span id="title-container-label" class="post-title-placeholder" aria-hidden="true"><?php _e( 'Post title' ); ?></span>
-				<h2 id="title-container" class="post-title" contenteditable="true" spellcheck="true" aria-label="<?php esc_attr_e( 'Post title' ); ?>" tabindex="0"></h2>
+				<h2 id="title-container" class="post-title" contenteditable="true" spellcheck="true" aria-label="<?php esc_attr_e( 'Post title' ); ?>" tabindex="0"><?php echo esc_html( $post_title ); ?></h2>
 				<div id='featured-media-container' class="featured-container no-media">
 					<div id='all-media-widget' class="all-media">
 						<div id='all-media-container'></div>
@@ -1015,7 +1216,7 @@
 				</div>
 
 				<?php
-				wp_editor( '', 'pressthis', array(
+				wp_editor( $post_content, 'pressthis', array(
 					'drag_drop_upload' => true,
 					'editor_height'    => 600,
 					'media_buttons'    => false,
@@ -1039,7 +1240,7 @@
 			</div>
 		</div>
 
-		<div class="options-panel-back is-hidden" tabindex="-1"></div>	
+		<div class="options-panel-back is-hidden" tabindex="-1"></div>
 		<div class="options-panel is-off-screen is-hidden" tabindex="-1">
 			<div class="post-options">
 
Index: src/wp-admin/js/bookmarklet.js
===================================================================
--- src/wp-admin/js/bookmarklet.js	(revision 31674)
+++ src/wp-admin/js/bookmarklet.js	(working copy)
@@ -31,7 +31,7 @@
 		selection = document.selection.createRange().text || '';
 	}
 
-	pt_url += ( pt_url.indexOf( '?' ) > -1 ? '&' : '?' ) + 'buster=' + ( new Date().getTime() );
+	pt_url += '&buster=' + ( new Date().getTime() );
 
 	if ( ! canPost ) {
 		if ( document.title ) {
@@ -108,23 +108,10 @@
 			break;
 		}
 
-		var g = links[ y ],
-			g_rel = g.getAttribute( 'rel' );
+		var g = links[y];
 
-		if ( g_rel ) {
-			switch ( g_rel ) {
-				case 'canonical':
-				case 'icon':
-				case 'shortlink':
-					add( '_links[' + g_rel + ']', g.getAttribute( 'href' ) );
-					break;
-				case 'alternate':
-					if ( 'application/json+oembed' === g.getAttribute( 'type' ) ) {
-						add( '_links[' + g_rel + ']', g.getAttribute( 'href' ) );
-					} else if ( 'handheld' === g.getAttribute( 'media' ) ) {
-						add( '_links[' + g_rel + ']', g.getAttribute( 'href' ) );
-					}
-			}
+		if ( 'canonical' === g.getAttribute( 'rel' ) ) {
+			add( 'canonical', g.getAttribute( 'href' ) );
 		}
 	}
 
Index: src/wp-admin/js/press-this.js
===================================================================
--- src/wp-admin/js/press-this.js	(revision 31674)
+++ src/wp-admin/js/press-this.js	(working copy)
@@ -8,14 +8,10 @@
 			saveAlert             = false,
 			textarea              = document.createElement( 'textarea' ),
 			sidebarIsOpen         = false,
-			siteConfig            = window.wpPressThisConfig || {},
+			settings              = window.wpPressThisConfig || {},
 			data                  = window.wpPressThisData || {},
 			smallestWidth         = 128,
-			interestingImages	  = getInterestingImages( data ) || [],
-			interestingEmbeds	  = getInterestingEmbeds( data ) || [],
 			hasEmptyTitleStr      = false,
-			suggestedTitleStr     = getSuggestedTitle( data ),
-			suggestedContentStr   = getSuggestedContent( data ),
 			hasSetFocus           = false,
 			catsCache             = [],
 			isOffScreen           = 'is-off-screen',
@@ -75,10 +71,14 @@
 		 * @returns string Sanitized text.
 		 */
 		function sanitizeText( text ) {
-			text = stripTags( text );
-			textarea.innerHTML = text;
+			var _text = stripTags( text );
 
-			return stripTags( textarea.value );
+			try {
+				textarea.innerHTML = _text;
+				_text = stripTags( textarea.value );
+			} catch ( er ) {}
+
+			return _text;
 		}
 
 		/**
@@ -99,190 +99,6 @@
 		}
 
 		/**
-		 * Gets the source page's canonical link, based on passed location and meta data.
-		 *
-		 * @returns string Discovered canonical URL, or empty
-		 */
-		function getCanonicalLink() {
-			var link = '';
-
-			if ( data._links && data._links.canonical ) {
-				link = data._links.canonical;
-			}
-
-			if ( ! link && data.u ) {
-				link = data.u;
-			}
-
-			if ( ! link && data._meta ) {
-				if ( data._meta['twitter:url'] ) {
-					link = data._meta['twitter:url'];
-				} else if ( data._meta['og:url'] ) {
-					link = data._meta['og:url'];
-				}
-			}
-
-			return checkUrl( decodeURI( link ) );
-		}
-
-		/**
-		 * Gets the source page's site name, based on passed meta data.
-		 *
-		 * @returns string Discovered site name, or empty
-		 */
-		function getSourceSiteName() {
-			var name = '';
-
-			if ( data._meta ) {
-				if ( data._meta['og:site_name'] ) {
-					name = data._meta['og:site_name'];
-				} else if ( data._meta['application-name'] ) {
-					name = data._meta['application-name'];
-				}
-			}
-
-			return sanitizeText( name );
-		}
-
-		/**
-		 * Gets the source page's title, based on passed title and meta data.
-		 *
-		 * @returns string Discovered page title, or empty
-		 */
-		function getSuggestedTitle() {
-			var title = '';
-
-			if ( data.t ) {
-				title = data.t;
-			}
-
-			if ( ! title && data._meta ) {
-				if ( data._meta['twitter:title'] ) {
-					title = data._meta['twitter:title'];
-				} else if ( data._meta['og:title'] ) {
-					title = data._meta['og:title'];
-				} else if ( data._meta.title ) {
-					title = data._meta.title;
-				}
-			}
-
-			if ( ! title ) {
-				title = __( 'newPost' );
-				hasEmptyTitleStr = true;
-			}
-
-			return sanitizeText( title );
-		}
-
-		/**
-		 * Gets the source page's suggested content, based on passed data (description, selection, etc).
-		 * Features a blockquoted excerpt, as well as content attribution, if any.
-		 *
-		 * @returns string Discovered content, or empty
-		 */
-		function getSuggestedContent() {
-			var content  = '',
-				text     = '',
-				title    = getSuggestedTitle(),
-				url      = getCanonicalLink(),
-				siteName = getSourceSiteName();
-
-			if ( data.s ) {
-				text = data.s;
-			} else if ( data._meta ) {
-				if ( data._meta['twitter:description'] ) {
-					text = data._meta['twitter:description'];
-				} else if ( data._meta['og:description'] ) {
-					text = data._meta['og:description'];
-				} else if ( data._meta.description ) {
-					text = data._meta.description;
-				}
-			}
-
-			if ( text && siteConfig.html.quote ) {
-				// Wrap suggested content in specified HTML.
-				content = siteConfig.html.quote.replace( /%1\$s/g, sanitizeText( text ) );
-			}
-
-			// Add a source attribution if there is one available.
-			if ( url && siteConfig.html.link && ( ( title && __( 'newPost' ) !== title ) || siteName ) ) {
-				content += siteConfig.html.link.replace( /%1\$s/g, encodeURI( url ) ).replace( /%2\$s/g, ( title || siteName ) );
-			}
-
-			return content || '';
-		}
-
-		/**
-		 * Get a list of valid embeds from what was passed via WpPressThis_App.data._embed on page load.
-		 *
-		 * @returns array
-		 */
-		function getInterestingEmbeds() {
-			var embeds             = data._embed || [],
-				interestingEmbeds  = [],
-				alreadySelected    = [];
-
-			if ( embeds.length ) {
-				$.each( embeds, function ( i, src ) {
-					if ( ! src ) {
-						// Skip: no src value
-						return;
-					}
-
-					var schemelessSrc = src.replace( /^https?:/, '' );
-
-					if ( $.inArray( schemelessSrc, alreadySelected ) > -1 ) {
-						// Skip: already shown
-						return;
-					}
-
-					interestingEmbeds.push( src );
-					alreadySelected.push( schemelessSrc );
-				} );
-			}
-
-			return interestingEmbeds;
-		}
-
-		/**
-		 * Get a list of valid images from what was passed via WpPressThis_App.data._img and WpPressThis_App.data._meta on page load.
-		 *
-		 * @returns array
-		 */
-		function getInterestingImages( data ) {
-			var imgs             = data._img || [],
-				interestingImgs  = [],
-				alreadySelected  = [];
-
-			if ( imgs.length ) {
-				$.each( imgs, function ( i, src ) {
-					src = src.replace( /http:\/\/[\d]+\.gravatar\.com\//, 'https://secure.gravatar.com/' );
-					src = checkUrl( src );
-
-					if ( ! src ) {
-						// Skip: no src value
-						return;
-					}
-
-					var schemelessSrc = src.replace( /^https?:/, '' );
-
-					if ( Array.prototype.indexOf && alreadySelected.indexOf( schemelessSrc ) > -1 ) {
-						// Skip: already shown
-						return;
-					} else if ( src.indexOf( 'avatar' ) > -1 && interestingImgs.length >= 15 ) {
-						// Skip:  some type of avatar and we've already gathered more than 23 diff images to show
-						return;
-					}
-
-					interestingImgs.push( src );
-					alreadySelected.push( schemelessSrc );
-				} );
-			}
-
-			return interestingImgs;
-		}
-
-		/**
 		 * Show UX spinner
 		 */
 		function showSpinner() {
@@ -304,7 +120,7 @@
 
 		/**
 		 * Prepare the form data for saving.
-		 */		 		
+		 */
 		function prepareFormData() {
 			editor && editor.save();
 
@@ -345,7 +161,7 @@
 						renderError( response.data.errorMessage );
 						hideSpinner();
 					} else if ( response.data.redirect ) {
-						if ( window.opener && siteConfig.redirInParent ) {
+						if ( window.opener && settings.redirInParent ) {
 							try {
 								window.opener.location.href = response.data.redirect;
 							} catch( er ) {}
@@ -456,7 +272,7 @@
 		 * Hide the form letting users enter a URL to be scanned, if a URL was already passed.
 		 */
 		function renderToolsVisibility() {
-			if ( data.u && data.u.match( /^https?:/ ) ) {
+			if ( data.hasData ) {
 				$( '#scanbar' ).hide();
 			}
 		}
@@ -495,57 +311,12 @@
 			}
 
 			// Prompt user to upgrade their bookmarklet if there is a version mismatch.
-			if ( data.v && data._version && ( data.v + '' ) !== ( data._version + '' ) ) {
+			if ( data.v && settings.version && ( data.v + '' ) !== ( settings.version + '' ) ) {
 				$( '.should-upgrade-bookmarklet' ).removeClass( 'is-hidden' );
 			}
 		}
 
 		/**
-		 * Render the suggested title, if any
-		 */
-		function renderSuggestedTitle() {
-			var suggestedTitle = suggestedTitleStr || '',
-				$title = $( '#title-container' );
-
-			if ( ! hasEmptyTitleStr ) {
-				$( '#post_title' ).val( suggestedTitle );
-				$title.text( suggestedTitle );
-				$( '.post-title-placeholder' ).addClass( 'is-hidden' );
-			}
-
-			$title.on( 'keyup', function() {
-				saveAlert = true;
-			}).on( 'paste', function() {
-				saveAlert = true;
-
-				setTimeout( function() {
-					$title.text( $title.text() );
-				}, 100 );
-			} );
-
-		}
-
-		/**
-		 * Render the suggested content, if any
-		 */
-		function renderSuggestedContent() {
-			if ( ! suggestedContentStr ) {
-				return;
-			}
-
-			if ( ! editor ) {
-				editor = window.tinymce.get( 'pressthis' );
-			}
-
-			if ( editor ) {
-				editor.setContent( suggestedContentStr );
-				editor.on( 'focus', function() {
-					hasSetFocus = true;
-				} );
-			}
-		}
-
-		/**
 		 * Render the detected images and embed for selection, if any
 		 */
 		function renderDetectedMedia() {
@@ -555,12 +326,12 @@
 
 			listContainer.empty();
 
-			if ( interestingEmbeds || interestingImages ) {
-				listContainer.append( '<h2 class="screen-reader-text">' + __( 'allMediaHeading' ) + '</h2><ul class="wppt-all-media-list"/>' );
+			if ( data._embeds || data._images ) {
+				listContainer.append( '<h2 class="screen-reader-text">' + __( 'allMediaHeading' ) + '</h2><ul class="wppt-all-media-list" />' );
 			}
 
-			if ( interestingEmbeds ) {
-				$.each( interestingEmbeds, function ( i, src ) {
+			if ( data._embeds ) {
+				$.each( data._embeds, function ( i, src ) {
 					src = checkUrl( src );
 
 					var displaySrc = '',
@@ -601,8 +372,8 @@
 				} );
 			}
 
-			if ( interestingImages ) {
-				$.each( interestingImages, function ( i, src ) {
+			if ( data._images ) {
+				$.each( data._images, function( i, src ) {
 					src = checkUrl( src );
 
 					var displaySrc = src.replace(/^(http[^\?]+)(\?.*)?$/, '$1');
@@ -703,7 +474,7 @@
 					$( '.post-option:first' ).focus();
 				} );
 		}
-		
+
 		function closeSidebar() {
 			sidebarIsOpen = false;
 
@@ -716,7 +487,7 @@
 					// Reset to options list
 					$( '.post-options' ).removeClass( offscreenHidden );
 					$( '.setting-modal').addClass( offscreenHidden );
-				} );
+				});
 		}
 
 		/**
@@ -723,18 +494,20 @@
 		 * Interactive behavior for the post title's field placeholder
 		 */
 		function monitorPlaceholder() {
-			var $selector = $( '#title-container'),
+			var $titleField = $( '#title-container'),
 				$placeholder = $('.post-title-placeholder');
 
-			$selector.on( 'focus', function() {
+			$titleField.on( 'focus', function() {
 				$placeholder.addClass('is-hidden');
-			} );
-
-			$selector.on( 'blur', function() {
-				if ( ! $( this ).text() ) {
+			}).on( 'blur', function() {
+				if ( ! $titleField.text() ) {
 					$placeholder.removeClass('is-hidden');
 				}
-			} );
+			});
+
+			if ( $titleField.text() ) {
+				$placeholder.addClass('is-hidden');
+			}
 		}
 
 		/* ***************************************************************
@@ -747,9 +520,7 @@
 		function render(){
 			// We're on!
 			renderToolsVisibility();
-			renderSuggestedTitle();
 			renderDetectedMedia();
-			$( document ).on( 'tinymce-editor-init', renderSuggestedContent );
 			renderStartupNotices();
 		}
 
@@ -757,13 +528,19 @@
 		 * Set app events and other state monitoring related code.
 		 */
 		function monitor(){
+			$( document ).on( 'tinymce-editor-init', function( ed ) {
+				editor = ed;
+
+				ed.on( 'focus', function() {
+					hasSetFocus = true;
+				} );
+			});
+
 			$( '#current-site a').click( function( e ) {
 				e.preventDefault();
 			} );
 
-			// Publish and Draft buttons and submit
-			
-
+			// Publish, Draft and Preview buttons
 			$( '.post-actions' ).on( 'click.press-this', function( event ) {
 				var $target = $( event.target );
 
@@ -872,8 +649,7 @@
 			refreshCatsCache();
 		});
 
-		// Expose public methods
-		// TODO: which are needed?
+		// Expose public methods?
 		return {
 			renderNotice: renderNotice,
 			renderError: renderError
Index: src/wp-includes/link-template.php
===================================================================
--- src/wp-includes/link-template.php	(revision 31674)
+++ src/wp-includes/link-template.php	(working copy)
@@ -2600,7 +2600,7 @@
 function get_shortcut_link() {
 	global $is_IE, $wp_version;
 
-	$bookmarklet_version = '6';
+	$bookmarklet_version = '7';
 	$link = '';
 
 	if ( $is_IE ) {
