diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php
index 2df89a9..4f53312 100644
--- a/src/wp-includes/formatting.php
+++ b/src/wp-includes/formatting.php
@@ -4527,6 +4527,20 @@ function print_emoji_detection_script() {
 
 	$printed = true;
 
+	if ( ! has_filter( 'emoji_url' ) ) {
+		// Site is using the w.org CDN for emoji.
+		// Safe to presume SVG and bitmap image paths are present
+		$vectorPath = 'svg/';
+		$bitmapPath = '72x72/';
+	}
+	else {
+		// Site has filters the CDN
+		// Unsafe to assume presence of both SVG and bitmap paths. The site's
+		// developer can add these in using the filters below.
+		$vectorPath = null;
+		$bitmapPath = null;
+	}
+
 	$settings = array(
 		/**
 		 * Filter the URL where emoji images are hosted.
@@ -4535,16 +4549,49 @@ function print_emoji_detection_script() {
 		 *
 		 * @param string The emoji base URL.
 		 */
-		'baseUrl' => apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/72x72/' ),
+		'baseUrl' => apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/' ),
+
+		/**
+		 * Filter the path where vector emoji images are hosted.
+		 *
+		 * Note: when filtering the emoji_url you will need to include a filter to set
+		 * the vector path too.
+		 *
+		 * @since 4.6.0
+		 *
+		 * @param string The emoji vector URL.
+		 */
+		'vectorPath' => apply_filters( 'emoji_vector_path', $vectorPath ),
+
+		/**
+		 * Filter the path where bitmap emoji images are hosted.
+		 *
+		 * Note: when filtering the emoji_url you will need to include a filter to set
+		 * the bitmap path too.
+		 *
+		 * @since 4.6.0
+		 *
+		 * @param string The emoji bitmap URL.
+		 */
+		'bitmapPath' => apply_filters( 'emoji_bitmap_path', $bitmapPath ),
 
 		/**
-		 * Filter the extension of the emoji files.
+		 * Filter the bitmap extension of the emoji files.
 		 *
 		 * @since 4.2.0
 		 *
 		 * @param string The emoji extension. Default .png.
 		 */
 		'ext' => apply_filters( 'emoji_ext', '.png' ),
+
+		/**
+		 * Filter the vector extension of the emoji files.
+		 *
+		 * @since 4.2.0
+		 *
+		 * @param string The emoji extension. Default .png.
+		 */
+		'vectorExt' => apply_filters( 'emoji_vector_ext', '.svg' ),
 	);
 
 	$version = 'ver=' . $wp_version;
diff --git a/src/wp-includes/js/wp-emoji.js b/src/wp-includes/js/wp-emoji.js
index dafcc36..d7652c8 100644
--- a/src/wp-includes/js/wp-emoji.js
+++ b/src/wp-includes/js/wp-emoji.js
@@ -3,6 +3,9 @@
 	function wpEmoji() {
 		var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
 
+		// Compression and maintain local scope
+		document = window.document,
+
 		// Private
 		twemoji, timer,
 		loaded = false,
@@ -10,6 +13,59 @@
 		ie11 = window.navigator.userAgent.indexOf( 'Trident/7.0' ) > 0;
 
 		/**
+		 * Detect if the browser supports SVG.
+		 *
+		 * @since 4.6.0
+		 *
+		 * @return {Boolean} True if the browser supports svg, false if not.
+		 */
+		function browserSupportsSvgAsImage() {
+			if ( !! document.implementation.hasFeature ) {
+				// Source: Modernizr
+				// https://github.com/Modernizr/Modernizr/blob/master/feature-detects/svg/asimg.js
+				return document.implementation.hasFeature( 'http://www.w3.org/TR/SVG11/feature#Image', '1.1' );
+			}
+
+			// document.implementation.hasFeature is deprecated. It can be presumed
+			// if future browsers remove it, the browser will support SVGs as images.
+			return true;
+		}
+
+		function cdnUrl( settings ) {
+			var baseUrl = settings.baseUrl;
+
+			if ( ! settings.vectorPath || ! settings.bitmapPath ) {
+				return baseUrl;
+			}
+
+			if ( browserSupportsSvgAsImage() ) {
+				baseUrl = baseUrl + settings.vectorPath;
+			}
+			else {
+				baseUrl = baseUrl + settings.bitmapPath;
+			}
+
+			return baseUrl;
+		}
+
+		function cdnExt( settings ) {
+			var ext = settings.ext;
+
+			if ( ! settings.vectorExt ) {
+				return ext;
+			}
+
+			if ( browserSupportsSvgAsImage() ) {
+				ext = settings.vectorExt;
+			}
+			else {
+				ext = settings.ext;
+			}
+
+			return ext;
+		}
+
+		/**
 		 * Runs when the document load event is fired, so we can do our first parse of the page.
 		 *
 		 * @since 4.2.0
@@ -141,8 +197,8 @@
 
 			args = args || {};
 			params = {
-				base: settings.baseUrl,
-				ext: settings.ext,
+				base: cdnUrl( settings ),
+				ext:  cdnExt( settings ),
 				className: args.className || 'emoji',
 				callback: function( icon, options ) {
 					// Ignore some standard characters that TinyMCE recommends in its character map.
