diff --git src/wp-admin/includes/ajax-actions.php src/wp-admin/includes/ajax-actions.php
index 8764af4..81b6a77 100644
--- src/wp-admin/includes/ajax-actions.php
+++ src/wp-admin/includes/ajax-actions.php
@@ -961,9 +961,19 @@ function wp_ajax_add_tag() {
 	$wp_list_table->single_row( $tag );
 	$parents = ob_get_clean();
 
+	require ABSPATH . 'wp-admin/includes/edit-tag-messages.php';
+
+	$message = false;
+	if ( isset( $messages[ $tax->name ][3] ) ) {
+		$message = $messages[ $tax->name ][3];
+	} elseif ( isset( $messages['_item'][3] ) ) {
+		$message = $messages['_item'][3];
+	}
+
 	$x->add(
 		array(
 			'what'         => 'taxonomy',
+			'data'         => $message,
 			'supplemental' => compact( 'parents', 'noparents' ),
 		)
 	);
diff --git src/wp-includes/js/wp-ajax-response.js src/wp-includes/js/wp-ajax-response.js
index 363a08b..7c6158c 100644
--- src/wp-includes/js/wp-ajax-response.js
+++ src/wp-includes/js/wp-ajax-response.js
@@ -12,7 +12,7 @@ var wpAjax = jQuery.extend( {
 		return r;
 	},
 	parseAjaxResponse: function( x, r, e ) { // 1 = good, 0 = strange (bad data?), -1 = you lack permission
-		var parsed = {}, re = jQuery('#' + r).empty(), err = '';
+		var parsed = {}, re = jQuery('#' + r).empty(), err = '', successmsg = '';
 
 		if ( x && typeof x == 'object' && x.getElementsByTagName('wp_ajax') ) {
 			parsed.responses = [];
@@ -21,6 +21,7 @@ var wpAjax = jQuery.extend( {
 				var th = jQuery(this), child = jQuery(this.firstChild), response;
 				response = { action: th.attr('action'), what: child.get(0).nodeName, id: child.attr('id'), oldId: child.attr('old_id'), position: child.attr('position') };
 				response.data = jQuery( 'response_data', child ).text();
+				successmsg += response.data; 
 				response.supplemental = {};
 				if ( !jQuery( 'supplemental', child ).children().each( function() {
 					response.supplemental[this.nodeName] = jQuery(this).text();
@@ -40,7 +41,12 @@ var wpAjax = jQuery.extend( {
 				} ).length ) { response.errors = false; }
 				parsed.responses.push( response );
 			} );
-			if ( err.length ) { re.html( '<div class="error">' + err + '</div>' ); }
+			if ( err.length ) {
+				re.html( '<div class="error">' + err + '</div>' );
+			} else {
+				re.html( '<div class="updated notice is-dismissible"><p>' + successmsg + '</p></div>');
+				jQuery(document).trigger( 'wp-updates-notice-added' );
+ 			}
 			return parsed;
 		}
 		if ( isNaN(x) ) { return !re.html('<div class="error"><p>' + x + '</p></div>'); }
diff --git tests/phpunit/tests/ajax/add-tag.php tests/phpunit/tests/ajax/add-tag.php
new file mode 100644
index 0000000..553110a
--- /dev/null
+++ tests/phpunit/tests/ajax/add-tag.php
@@ -0,0 +1,189 @@
+<?php
+/**
+ * Ajax tests for adding tags.
+ *
+ * @package    WordPress
+ * @subpackage UnitTests
+ */
+
+/**
+ * Admin ajax functions to be tested.
+ */
+require_once ABSPATH . 'wp-admin/includes/ajax-actions.php';
+
+/**
+ * Class for testing ajax add tag functionality.
+ *
+ * @since      5.0.0
+ * @group      ajax
+ */
+class Tests_Ajax_AddTag extends WP_Ajax_UnitTestCase {
+	/**
+	 * List of terms to insert on setup
+	 *
+	 * @var array
+	 */
+	private static $terms = array(
+		'jazz',
+	);
+
+	/**
+	 * Set up before class.
+	 */
+	public static function wpSetUpBeforeClass() {
+		foreach ( self::$terms as $term ) {
+			wp_insert_term( $term, 'category' );
+		}
+	}
+
+	/**
+	 * Test adding a category.
+	 */
+	public function test_add_category() {
+
+		$this->_setRole( 'administrator' );
+
+		$_POST['taxonomy']         = 'category';
+		$_POST['post_type']        = 'post';
+		$_POST['screen']           = 'edit-category';
+		$_POST['action']           = 'add-tag';
+		$_POST['tag-name']         = 'blues';
+		$_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
+
+		try {
+			$this->_handleAjax( 'add-tag' );
+		} catch ( WPAjaxDieContinueException $e ) {
+			unset( $e );
+		}
+
+		$xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
+
+		$expected = 'Category updated.';
+		$actual   = (string) $xml->response->taxonomy->response_data;
+
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Test adding a post tag.
+	 */
+	public function test_add_post_tag() {
+
+		$this->_setRole( 'administrator' );
+
+		$_POST['taxonomy']         = 'post_tag';
+		$_POST['post_type']        = 'post';
+		$_POST['screen']           = 'edit-post_tag';
+		$_POST['action']           = 'add-tag';
+		$_POST['tag-name']         = 'Louis Armstrong';
+		$_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
+
+		try {
+			$this->_handleAjax( 'add-tag' );
+		} catch ( WPAjaxDieContinueException $e ) {
+			unset( $e );
+		}
+
+		$xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
+
+		$expected = 'Tag updated.';
+		$actual   = (string) $xml->response->taxonomy->response_data;
+
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Test that adding a category should work with message filtering.
+	 */
+	public function test_add_category_should_work_with_message_filtering() {
+
+		$this->_setRole( 'administrator' );
+
+		$_POST['taxonomy']         = 'category';
+		$_POST['post_type']        = 'post';
+		$_POST['screen']           = 'edit-category';
+		$_POST['action']           = 'add-tag';
+		$_POST['tag-name']         = 'techno';
+		$_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
+
+		try {
+			add_filter( 'term_updated_messages', array( $this, 'message_filter' ) );
+			$this->_handleAjax( 'add-tag' );
+			remove_filter( 'term_updated_messages', array( $this, 'message_filter' ) );
+		} catch ( WPAjaxDieContinueException $e ) {
+			unset( $e );
+		}
+
+		$xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
+
+		$expected = 'New category added.';
+		$actual   = (string) $xml->response->taxonomy->response_data;
+
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Filters the messages displayed when a tag is updated.
+	 *
+	 * @param  array $messages The messages to be displayed.
+	 * @return array $messages The messages to be displayed.
+	 */
+	public function message_filter( $messages ) {
+		if ( isset( $messages['category'][3] ) ) {
+			$messages['category'][3] = 'New category added.';
+		}
+		return $messages;
+	}
+
+	/**
+	 * Test that adding a category without capability should error.
+	 */
+	public function test_adding_category_without_capability_should_error() {
+
+		$this->_setRole( 'subscriber' );
+
+		$_POST['taxonomy']         = 'category';
+		$_POST['post_type']        = 'post';
+		$_POST['screen']           = 'edit-category';
+		$_POST['action']           = 'add-tag';
+		$_POST['tag-name']         = 'disco';
+		$_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
+
+		$this->setExpectedException( 'WPAjaxDieStopException', '-1' );
+
+		try {
+			$this->_handleAjax( 'add-tag' );
+		} catch ( WPAjaxDieContinueException $e ) {
+			unset( $e );
+		}
+	}
+
+	/**
+	 * Test that adding an existing category should error.
+	 */
+	public function test_adding_existing_category_should_error() {
+
+		$this->_setRole( 'administrator' );
+
+		$_POST['taxonomy']         = 'category';
+		$_POST['post_type']        = 'post';
+		$_POST['screen']           = 'edit-category';
+		$_POST['action']           = 'add-tag';
+		$_POST['tag-name']         = self::$terms[0];
+		$_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
+
+		try {
+			$this->_handleAjax( 'add-tag' );
+		} catch ( WPAjaxDieContinueException $e ) {
+			unset( $e );
+		}
+
+		$xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
+
+		$expected = 'A term with the name provided already exists with this parent.';
+		$actual   = (string) $xml->response->taxonomy->wp_error;
+
+		$this->assertSame( $expected, $actual );
+	}
+
+}
