Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/class-customizations.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/class-customizations.php	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/class-customizations.php	(working copy)
@@ -48,10 +48,13 @@
 		add_action( 'add_meta_boxes', array( $this, 'register_admin_metaboxes' ), 10, 2 );
 		add_action( 'do_meta_boxes', array( $this, 'replace_title_global' ) );
 
-		add_filter( 'postbox_classes_plugin_internal-notes',    array( __NAMESPACE__ . '\Metabox\Internal_Notes', 'postbox_classes' ) );
-		add_filter( 'postbox_classes_plugin_plugin-committers', array( __NAMESPACE__ . '\Metabox\Committers',     'postbox_classes' ) );
-		add_filter( 'wp_ajax_add-committer',    array( __NAMESPACE__ . '\Metabox\Committers', 'add_committer'    ) );
-		add_filter( 'wp_ajax_delete-committer', array( __NAMESPACE__ . '\Metabox\Committers', 'remove_committer' ) );
+		add_filter( 'postbox_classes_plugin_internal-notes',      array( __NAMESPACE__ . '\Metabox\Internal_Notes', 'postbox_classes' ) );
+		add_filter( 'postbox_classes_plugin_plugin-committers',   array( __NAMESPACE__ . '\Metabox\Committers',     'postbox_classes' ) );
+		add_filter( 'postbox_classes_plugin_plugin-support-reps', array( __NAMESPACE__ . '\Metabox\Support_Reps',     'postbox_classes' ) );
+		add_filter( 'wp_ajax_add-committer',        array( __NAMESPACE__ . '\Metabox\Committers', 'add_committer'    ) );
+		add_filter( 'wp_ajax_delete-committer',     array( __NAMESPACE__ . '\Metabox\Committers', 'remove_committer' ) );
+		add_filter( 'wp_ajax_add-support-rep',      array( __NAMESPACE__ . '\Metabox\Support_Reps', 'add_support_rep' ) );
+		add_filter( 'wp_ajax_delete-support-rep',   array( __NAMESPACE__ . '\Metabox\Support_Reps', 'remove_support_rep' ) );
 		add_action( 'wp_ajax_plugin-author-lookup', array( __NAMESPACE__ . '\Metabox\Author', 'lookup_author' ) );
 
 	}
@@ -114,9 +117,10 @@
 					wp_enqueue_style( 'plugin-admin-post-css', plugins_url( 'css/edit-form.css', Plugin_Directory\PLUGIN_FILE ), array( 'edit' ), 4 );
 					wp_enqueue_script( 'plugin-admin-post-js', plugins_url( 'js/edit-form.js', Plugin_Directory\PLUGIN_FILE ), array( 'wp-util', 'wp-lists' ), 5 );
 					wp_localize_script( 'plugin-admin-post-js', 'pluginDirectory', array(
-						'approvePluginAYS'   => __( 'Are you sure you want to approve this plugin?', 'wporg-plugins' ),
-						'rejectPluginAYS'    => __( 'Are you sure you want to reject this plugin?', 'wporg-plugins' ),
-						'removeCommitterAYS' => __( 'Are you sure you want to remove this committer?', 'wporg-plugins' ),
+						'approvePluginAYS'    => __( 'Are you sure you want to approve this plugin?', 'wporg-plugins' ),
+						'rejectPluginAYS'     => __( 'Are you sure you want to reject this plugin?', 'wporg-plugins' ),
+						'removeCommitterAYS'  => __( 'Are you sure you want to remove this committer?', 'wporg-plugins' ),
+						'removeSupportRepAYS' => __( 'Are you sure you want to remove this support rep?', 'wporg-plugins' ),
 					) );
 					break;
 
@@ -436,6 +440,12 @@
 				'plugin', 'side'
 			);
 
+			add_meta_box(
+				'plugin-support-reps',
+				__( 'Plugin Support Reps', 'wporg-plugins' ),
+				array( __NAMESPACE__ . '\Metabox\Support_Reps', 'display' ),
+				'plugin', 'side'
+			);
 		}
 
 		// Remove unnecessary metaboxes.
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/list-table/class-committers.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/list-table/class-committers.php	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/list-table/class-committers.php	(working copy)
@@ -22,7 +22,7 @@
 		parent::__construct( array(
 			'singular' => 'committer',
 			'plural'   => 'committers',
-			'screen'   => isset( $args['screen'] ) ? $args['screen'] : null,
+			'screen'   => isset( $args['screen'] ) ? $args['screen'] : 'plugin',
 		) );
 	}
 
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/list-table/class-support-reps.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/list-table/class-support-reps.php	(nonexistent)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/list-table/class-support-reps.php	(working copy)
@@ -0,0 +1,227 @@
+<?php
+namespace WordPressdotorg\Plugin_Directory\Admin\List_Table;
+use WordPressdotorg\Plugin_Directory\Tools;
+
+_get_list_table( 'WP_List_Table' );
+
+/**
+ * Comments list table for comments meta box.
+ *
+ * @package WordPressdotorg\Plugin_Directory\Admin\List_Table
+ */
+class Support_Reps extends \WP_List_Table {
+
+	/**
+	 * Constructor.
+	 *
+	 * @see WP_List_Table::__construct() for more information on default arguments.
+	 *
+	 * @param array $args An associative array of arguments.
+	 */
+	public function __construct( $args = array() ) {
+		parent::__construct( array(
+			'singular' => 'support_rep',
+			'plural'   => 'support_reps',
+			'screen'   => isset( $args['screen'] ) ? $args['screen'] : 'plugin',
+		) );
+	}
+
+	/**
+	 * Check the current user's permissions.
+	 *
+	 * @return bool
+	 */
+	public function ajax_user_can() {
+		return current_user_can( 'plugin_remove_support_rep' );
+	}
+
+	/**
+	 * Prepare the users list for display.
+	 *
+	 * @access public
+	 *
+	 * @global string $role
+	 * @global string $usersearch
+	 */
+	public function prepare_items() {
+		$plugin_slug         = get_post()->post_name;
+		if ( ! $plugin_slug ) {
+			return;
+		}
+		$existing_support_reps = Tools::get_plugin_support_reps( $plugin_slug );
+		$this->items         = array_map( function ( $user ) {
+			return new \WP_User( $user );
+		}, $existing_support_reps );
+	}
+
+	/**
+	 * Output 'no users' message.
+	 *
+	 * @access public
+	 */
+	public function no_items() {
+		_e( 'No support reps found.', 'wporg-plugins' );
+	}
+
+	/**
+	 *
+	 * @return array
+	 */
+	protected function get_table_classes() {
+		$classes   = parent::get_table_classes();
+		$classes[] = 'wp-list-table';
+
+		unset( $classes[ array_search( 'striped', $classes ) ] );
+
+		return $classes;
+	}
+
+	/**
+	 *
+	 * @return array
+	 */
+	protected function get_column_info() {
+		return array(
+			array(
+				'avatar'   => __( 'Avatar', 'wporg-plugins' ),
+				'username' => __( 'Username', 'wporg-plugins' ),
+			),
+			array(),
+			'username',
+		);
+	}
+
+	/**
+	 *
+	 */
+	public function display() {
+		?>
+		<table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>">
+			<colgroup>
+				<col width="40px" />
+				<col />
+			</colgroup>
+			<tbody id="the-support-rep-list" data-wp-lists="list:support-rep">
+				<?php $this->display_rows_or_placeholder(); ?>
+			</tbody>
+		</table>
+	<?php
+	}
+
+	/**
+	 * Generate the list table rows.
+	 *
+	 * @access public
+	 */
+	public function display_rows() {
+		foreach ( $this->items as $user_object ) {
+			echo "\n\t" . $this->single_row( $user_object );
+		}
+		?>
+		<tr id="add-support-rep" class="add-support-rep wp-hidden-children">
+			<td colspan="2">
+				<button type="button" id="add-support-rep-toggle" class="button-link"><?php _e( '+ Add New Support Rep', 'wporg-plugins' ); ?></button>
+				<p class="wp-hidden-child">
+					<?php wp_nonce_field( 'add-support-rep', '_ajax_nonce', false ); ?>
+					<span id="support-rep-error" class="notice notice-alt notice-error" style="display:none;"></span>
+					<label>
+						<input type="text" name="add_support_rep" class="form-required" value="" aria-required="true" placeholder="<?php esc_attr_e( 'WordPress.org username', 'wporg-plugins' ); ?>">
+						<span class="screen-reader-text"><?php _e( 'Add a new support rep', 'wporg-plugins' ); ?></span>
+					</label>
+					<input type="button" id="add-support-rep-submit" class="button" data-wp-lists="add:the-support-rep-list:add-support-rep::post_id=<?php echo get_post()->ID; ?>" value="<?php _e( 'Add Support Rep', 'wporg-plugins' ); ?>">
+				</p>
+			</td>
+		</tr>
+		<?php
+	}
+
+	/**
+	 * Generate HTML for a single row on the users.php admin panel.
+	 *
+	 * @access public
+	 *
+	 * @param object $user_object The current user object.
+	 * @return string Output for a single row.
+	 */
+	public function single_row( $user_object ) {
+		if ( ! ( $user_object instanceof \WP_User ) ) {
+			$user_object = get_userdata( (int) $user_object );
+		}
+		$user_object->filter = 'display';
+		list( $columns, $hidden, $primary ) = $this->get_column_info();
+
+		// Set up the hover actions for this support rep.
+		$actions = array();
+
+		// Check if the support rep for this row is removable.
+		$post_id = get_post()->ID;
+		if ( current_user_can( 'plugin_remove_support_rep', $post_id ) && $user_object->ID != get_current_user_id() ) {
+			$actions['delete'] = "<a class='submitremove' data-wp-lists='delete:the-support-rep-list:support-rep-{$user_object->ID}:faafaa:post_id={$post_id}' href='" . wp_nonce_url( 'users.php?action=remove&amp;support-rep=' . $user_object->ID, "remove-support-rep-{$user_object->ID}" ) . "'>" . __( 'Remove', 'wporg-plugins' ) . "</a>";
+		}
+
+		/**
+		 * Filter the action links displayed under each support rep in the Support Reps list table.
+		 *
+		 * @param array    $actions     An array of action links to be displayed.
+		 * @param \WP_User $user_object WP_User object for the currently-listed support rep.
+		 */
+		$actions = apply_filters( 'support_rep_row_actions', $actions, $user_object );
+
+		$row = "<tr id='support-rep-$user_object->ID'>";
+
+		foreach ( $columns as $column_name => $column_display_name ) {
+			$data    = 'data-colname="' . wp_strip_all_tags( $column_display_name ) . '"';
+			$classes = "$column_name column-$column_name";
+
+			if ( $primary === $column_name ) {
+				$classes .= ' has-row-actions column-primary';
+			}
+			if ( in_array( $column_name, $hidden ) ) {
+				$classes .= ' hidden';
+			}
+
+			$row .= "<td class='$classes' $data>";
+			switch ( $column_name ) {
+				case 'avatar':
+					$row .= get_avatar( $user_object->ID, 32 );
+					break;
+
+				case 'username':
+					$row .= sprintf( '<strong><a href="%s">%s</a></strong><br />&lt;%s&gt;',
+						esc_url( '//profiles.wordpress.org/' . $user_object->user_nicename ),
+						$user_object->user_login,
+						$user_object->user_email
+					);
+					break;
+
+				default:
+					/**
+					 * Filter the display output of custom columns in the Users list table.
+					 *
+					 * @param string $output      Custom column output. Default empty.
+					 * @param string $column_name Column name.
+					 * @param int    $user_id     ID of the currently-listed user.
+					 */
+					$row .= apply_filters( 'manage_support_reps_custom_column', '', $column_name, $user_object->ID );
+			}
+			if ( $primary === $column_name ) {
+				$row .= $this->row_actions( $actions );
+			}
+			$row .= '</td>';
+		}
+		$row .= '</tr>';
+
+		return $row;
+	}
+
+	/**
+	 * Gets the name of the default primary column.
+	 *
+	 * @access protected
+	 *
+	 * @return string Name of the default primary column, in this case, 'username'.
+	 */
+	protected function get_default_primary_column_name() {
+		return 'username';
+	}
+}
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/metabox/class-support-reps.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/metabox/class-support-reps.php	(nonexistent)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/metabox/class-support-reps.php	(working copy)
@@ -0,0 +1,111 @@
+<?php
+namespace WordPressdotorg\Plugin_Directory\Admin\Metabox;
+use WordPressdotorg\Plugin_Directory\Admin\List_Table;
+use WordPressdotorg\Plugin_Directory\Tools;
+
+/**
+ * The Plugin Support Reps admin metabox.
+ *
+ * @package WordPressdotorg\Plugin_Directory\Admin\Metabox
+ */
+class Support_Reps {
+
+	/**
+	 * Filters the postbox classes for custom comment meta boxes.
+	 *
+	 * @param array $classes An array of postbox classes.
+	 * @return array
+	 */
+	public static function postbox_classes( $classes ) {
+		$classes[] = 'support-reps-meta-box';
+
+		return array_filter( $classes );
+	}
+
+	/**
+	 * Displays a list of support reps for the current plugin.
+	 */
+	public static function display() {
+		$list = new List_Table\Support_Reps();
+		$list->prepare_items();
+		$list->display();
+	}
+
+	/**
+	 * Ajax handler for adding a new support rep.
+	 */
+	public static function add_support_rep() {
+		$login    = isset( $_POST['add_support_rep'] ) ? sanitize_user( $_POST['add_support_rep'] ) : '';
+		$post_id  = isset( $_POST['post_id'] ) ? (int) $_POST['post_id'] : 0;
+
+		check_ajax_referer( 'add-support-rep' );
+
+		if ( ! current_user_can( 'plugin_add_support_rep', $post_id ) || 'publish' !== get_post_status( $post_id ) ) {
+			wp_die( -1 );
+		}
+
+		global $post;
+
+		$response = new \WP_Ajax_Response();
+		$post     = get_post( $post_id );
+
+		if ( ! $support_rep = get_user_by( 'login', $login ) ) {
+			$response->add( array(
+				'what' => 'support_rep',
+				'data' => new \WP_Error( 'error', sprintf( __( 'The user %s does not exist.', 'wporg-plugins' ), '<code>' . $login . '</code>' ) ),
+			) );
+			$response->send();
+		}
+
+		$result = Tools::add_plugin_support_rep( $post->post_name, $support_rep );
+		
+		if ( ! $result ) {
+			$message = __( 'An error has occurred. Please reload the page and try again.', 'wporg-plugins' );
+
+			$response->add( array(
+				'what' => 'support_rep',
+				'data' => new \WP_Error( 'error', $message ),
+			) );
+			$response->send();
+		}
+
+		$wp_list_table = new List_Table\Support_Reps();
+
+		$response->add( array(
+			'what'     => 'support_rep',
+			'id'       => $support_rep->ID,
+			'data'     => $wp_list_table->single_row( $support_rep ),
+			'position' => -1,
+		) );
+		$response->send();
+	}
+
+	/**
+	 * Ajax handler for removing a support rep.
+	 */
+	public static function remove_support_rep() {
+		$id      = isset( $_POST['id'] )      ? (int) $_POST['id']      : 0;
+		$post_id = isset( $_POST['post_id'] ) ? (int) $_POST['post_id'] : 0;
+
+		check_ajax_referer( "remove-support-rep-$id" );
+
+		if ( ! current_user_can( 'plugin_remove_support_rep', $post_id ) || 'publish' !== get_post_status( $post_id ) ) {
+			wp_die( -1 );
+		}
+
+		$response    = new \WP_Ajax_Response();
+		$plugin_slug = get_post( $post_id )->post_name;
+
+		if ( ! $support_rep = get_user_by( 'id', $id ) ) {
+			$response->add( array(
+				'what' => 'support_rep',
+				'data' => new \WP_Error( 'error', __( 'The specified user does not exist.', 'wporg-plugins' ) ),
+			) );
+			$response->send();
+		}
+
+		$result = Tools::remove_plugin_support_rep( $plugin_slug, $support_rep );
+
+		wp_die( $result );
+	}
+}
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/api/class-base.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/api/class-base.php	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/api/class-base.php	(working copy)
@@ -20,6 +20,7 @@
 		new Routes\Query_Plugins();
 		new Routes\SVN_Access();
 		new Routes\Plugin_Committers();
+		new Routes\Plugin_Support_Reps();
 	}
 
 	/**
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/api/routes/class-plugin-support-reps.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/api/routes/class-plugin-support-reps.php	(nonexistent)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/api/routes/class-plugin-support-reps.php	(working copy)
@@ -0,0 +1,150 @@
+<?php
+namespace WordPressdotorg\Plugin_Directory\API\Routes;
+use WordPressdotorg\Plugin_Directory\Plugin_Directory;
+use WordPressdotorg\Plugin_Directory\Template;
+use WordPressdotorg\Plugin_Directory\Tools;
+use WordPressdotorg\Plugin_Directory\API\Base;
+use WP_REST_Server;
+use WP_Error;
+use WP_User;
+
+
+/**
+ * An API Endpoint to manage plugin support reps.
+ *
+ * @package WordPressdotorg_Plugin_Directory
+ */
+class Plugin_Support_Reps extends Base {
+
+	function __construct() {
+		register_rest_route( 'plugins/v1', '/plugin/(?P<plugin_slug>[^/]+)/support-reps/?', array(
+			array(
+				'methods'  => WP_REST_Server::READABLE,
+				'callback' => array( $this, 'list_support_reps' ),
+				'permission_callback' => function( $request ) {
+					return current_user_can(
+						'plugin_admin_edit',
+						Plugin_Directory::get_plugin_post( $request['plugin_slug'] )
+					);
+				},
+				'args' => array(
+					'plugin_slug' => array(
+						'validate_callback' => array( $this, 'validate_plugin_slug_callback' ),
+						'required' => true,
+					),
+				)
+			),
+			array(
+				'methods'  => WP_REST_Server::CREATABLE,
+				'callback' => array( $this, 'add_support_rep' ),
+				'permission_callback' => function( $request ) {
+					return current_user_can(
+						'plugin_add_support_rep',
+						Plugin_Directory::get_plugin_post( $request['plugin_slug'] )
+					);
+				},
+				'args' => array(
+					'plugin_slug' => array(
+						'validate_callback' => array( $this, 'validate_plugin_slug_callback' ),
+						'required' => true,
+					),
+				)
+			)
+		) );
+
+		register_rest_route( 'plugins/v1', '/plugin/(?P<plugin_slug>[^/]+)/support-reps/(?P<support_rep>[^/]+)/?', array(
+			'methods'  => WP_REST_Server::DELETABLE,
+			'callback' => array( $this, 'remove_support_rep' ),
+			'permission_callback' => function( $request ) {
+				return current_user_can(
+					'plugin_remove_support_rep',
+					Plugin_Directory::get_plugin_post( $request['plugin_slug'] )
+				);
+			},
+			'args' => array(
+				'plugin_slug' => array(
+					'validate_callback' => array( $this, 'validate_plugin_slug_callback' ),
+					'required' => true,
+				),
+				'support_rep' => array(
+					'validate_callback' => array( $this, 'validate_user_slug_callback' ),
+					'required' => true,
+				)
+			)
+		) );
+	}
+
+	/**
+	 *
+	 */
+	function list_support_reps( $request ) {
+		$plugin_slug = $request['plugin_slug'];
+
+		$support_reps = array();
+		foreach ( (array) Tools::get_plugin_support_reps( $plugin_slug ) as $user_nicename ) {
+			$user = get_user_by( 'slug', $user_nicename );
+			$support_reps[] = $this->user_support_rep_details( $user );
+		}
+
+		return $support_reps;
+	}
+
+	function add_support_rep( $request ) {
+		$user = new WP_User( $request['support_rep'] );
+		if ( ! $user->exists() ) {
+			return new WP_Error( 'plugin_user_not_found', __( 'The provided user could not be found.', 'wporg-plugins' ) );
+		}
+
+		$plugin_slug = $request['plugin_slug'];
+
+		if ( ! Tools::add_plugin_support_rep( $plugin_slug, $user ) ) {
+			return new WP_Error( 'failed', __( 'The operation failed. Please try again.', 'wporg-plugins' ) );
+		}
+
+		return $this->user_support_rep_details( $user );
+	}
+
+	function remove_support_rep( $request ) {
+		$user = new WP_User( $request['support_rep'] );
+		if ( ! $user->exists() ) {
+			return new WP_Error( 'plugin_user_not_found', __( 'The provided user could not be found.', 'wporg-plugins' ) );
+		}
+
+		$plugin_slug = $request['plugin_slug'];
+
+		$result = Tools::remove_plugin_support_rep( $plugin_slug, $user );
+		if ( ! $result ) {
+			return new WP_Error( 'failed', __( 'The operation failed. Please try again.', 'wporg-plugins' ) );
+		}
+
+		return true;
+	}
+
+	/**
+	 * Validate that a user by the given slug exists.
+	 */
+	function validate_user_slug_callback( $value ) {
+		return (bool) get_user_by( 'slug', $value );
+	}
+
+	/**
+	 * Helper function to return a support rep object
+	 */
+	function user_support_rep_details( $user ) {
+		$data = array(
+			'nicename' => $user->user_nicename,
+			'profile'  => esc_url( 'https://profiles.wordpress.org/' . $user->user_nicename ),
+			'avatar'   => get_avatar_url( $user->ID, 32 ),
+			'name'     => Template::encode( $user->display_name )
+		);
+
+		if ( current_user_can( 'plugin_review' ) ) {
+			$data['email'] = $user->user_email;
+		}
+
+		return $data;
+	}
+
+}
+
+
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/class-capabilities.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/class-capabilities.php	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/class-capabilities.php	(working copy)
@@ -26,6 +26,8 @@
 			case 'plugin_admin_edit':
 			case 'plugin_add_committer':
 			case 'plugin_remove_committer':
+			case 'plugin_add_support_rep':
+			case 'plugin_remove_support_rep':
 				$plugin_edit_cap = true;
 				// Fall through
 
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php	(working copy)
@@ -260,6 +260,22 @@
 			),
 		) );
 
+		register_taxonomy( 'plugin_support_reps', array( 'plugin', 'force-count-to-include-all-post_status' ), array(
+			'hierarchical'      => false,
+			'query_var'         => 'plugin_support_rep',
+			'rewrite'           => false,
+			'labels'            => array(
+				'name' => __( 'Support Reps', 'wporg-plugins' ),
+				'singular_name' => __( 'Support Rep', 'wporg-plugins' ),
+			),
+			'public'            => true,
+			'show_ui'           => true,
+			'show_admin_column' => true,
+			'capabilities'      => array(
+				'assign_terms' => 'do_not_allow',
+			),
+		) );
+
 		register_taxonomy( 'plugin_tags', array( 'plugin', 'force-count-to-include-all-post_status' ), array(
 			'hierarchical'      => false,
 			'query_var'         => 'plugin_tags',
@@ -547,6 +563,7 @@
 		register_widget( __NAMESPACE__ . '\Widgets\Support'       );
 		register_widget( __NAMESPACE__ . '\Widgets\Committers'    );
 		register_widget( __NAMESPACE__ . '\Widgets\Contributors'  );
+		register_widget( __NAMESPACE__ . '\Widgets\Support_Reps'  );
 	}
 
 	/**
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/class-tools.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/class-tools.php	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/class-tools.php	(working copy)
@@ -227,6 +227,87 @@
 	}
 
 	/**
+	 * Retrieve a list of support reps for a specific plugin.
+	 *
+	 * @static
+	 *
+	 * @param string $plugin_slug The plugin slug.
+	 * @return array The list of user_nicename's which are support reps.
+	 */
+	public static function get_plugin_support_reps( $plugin_slug ) {
+		if ( ! $plugin_slug ) {
+			return array();
+		}
+
+		if ( false === ( $support_reps = wp_cache_get( $plugin_slug, 'plugin-support-reps' ) ) ) {
+			$post = Plugin_Directory::get_plugin_post( $plugin_slug );
+			$support_reps = wp_get_object_terms( $post->ID, 'plugin_support_reps', array( 'fields' => 'names' ) );
+
+			wp_cache_set( $plugin_slug, $support_reps, 'plugin-support-reps', 12 * HOUR_IN_SECONDS );
+		}
+
+		return $support_reps;
+	}
+
+	/**
+	 * Add a user as a support rep for a plugin.
+	 *
+	 * @static
+	 *
+	 * @param string          $plugin_slug The plugin slug.
+	 * @param string|\WP_User $user        The user to add.
+	 * @return bool
+	 */
+	public static function add_plugin_support_rep( $plugin_slug, $user ) {
+		if ( ! $user instanceof \WP_User ) {
+			$user = new \WP_User( $user );
+		}
+
+		if ( ! $user->exists() || ! $plugin_slug ) {
+			return false;
+		}
+
+		$post = Plugin_Directory::get_plugin_post( $plugin_slug );
+
+		if ( ! $post ) {
+			return false;
+		}
+
+		$result = wp_add_object_terms( $post->ID, $user->user_nicename, 'plugin_support_reps' );
+
+		return $result;
+	}
+
+	/**
+	 * Remove a user as a support rep for a plugin.
+	 *
+	 * @static
+	 *
+	 * @param string          $plugin_slug The plugin slug.
+	 * @param string|\WP_User $user        The user to remove.
+	 * @return bool
+	 */
+	public static function remove_plugin_support_rep( $plugin_slug, $user ) {
+		if ( ! $user instanceof \WP_User ) {
+			$user = new \WP_User( $user );
+		}
+
+		if ( ! $user->exists() || ! $plugin_slug ) {
+			return false;
+		}
+
+		$post = Plugin_Directory::get_plugin_post( $plugin_slug );
+
+		if ( ! $post ) {
+			return false;
+		}
+
+		$result = wp_remove_object_terms( $post->ID, $user->user_nicename, 'plugin_support_reps' );
+
+		return $result;
+	}
+
+	/**
 	 * Subscribe/Unsubscribe a user to a plugins commits.
 	 *
 	 * Plugin Committers are automatically subscribed to plugin commit
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/css/edit-form.css
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/css/edit-form.css	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/css/edit-form.css	(working copy)
@@ -74,6 +74,7 @@
 
 #poststuff .comments-meta-box.postbox .inside,
 #poststuff .committers-meta-box.postbox .inside,
+#poststuff .support-reps-meta-box.postbox .inside,
 .comments-meta-box .column-comment p {
 	margin: 0;
 	padding: 0;
@@ -102,7 +103,8 @@
 }
 
 .comments-meta-box .comments-box,
-.committers-meta-box .wp-list-table {
+.committers-meta-box .wp-list-table,
+.support-reps-meta-box .wp-list-table {
 	border: 0 none;
 }
 
@@ -137,17 +139,20 @@
 	}
 }
 
-/* Committers meta box */
-.add-committer {
+/* Committers and Support Reps meta boxes */
+.add-committer,
+.add-support-rep {
 	padding: 0 12px 12px;
 }
 
-.add-committer .button-link {
+.add-committer .button-link,
+.add-support-rep .button-link {
 	font-weight: 600;
 	margin: 10px 0;
 }
 
-.add-committer input[type="text"] {
+.add-committer input[type="text"],
+.add-support-rep input[type="text"] {
 	margin: 0 0 1em;
 	max-width: 260px;
 	vertical-align: baseline;
@@ -154,7 +159,8 @@
 	width: 100%;
 }
 
-.add-committer .notice {
+.add-committer .notice,
+.add-support-rep .notice {
 	display: block;
 	padding: 0.5em 0 0.5em 1em;
 }
@@ -264,12 +270,14 @@
 	background-color: #fde3e3;
 }
 
-.plugin-committers > div {
+.plugin-committers > div,
+.plugin-support-reps > div {
 	overflow-x: hidden;
 	white-space: nowrap;
 }
 
-.plugin-committer-email {
+.plugin-committer-email,
+.plugin-support-rep-email {
 	font-size: smaller;
 }
 
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/js/edit-form.js
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/js/edit-form.js	(revision 5770)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/js/edit-form.js	(working copy)
@@ -29,6 +29,22 @@
 				$( 'input[name="add_committer"]', '#add-committer' ).val( '' ).focus();
 			} );
 
+			$( '#add-support-rep-toggle' ).on( 'click', PluginEdit.toggleSupportRepForm );
+
+			$( '#the-support-rep-list' ).wpList({
+				alt: false,
+				confirm: function( element, settings, action ) {
+					if ( 'support-rep' === settings.what && 'delete' === action ) {
+						return confirm( pluginDirectory.removeSupportRepAYS );
+					}
+					return true;
+				},
+				addAfter: PluginEdit.supportRepRequestAfter,
+				delAfter: PluginEdit.supportRepRequestAfter
+			}).on( 'wpListAddEnd', function() {
+				$( 'input[name="add_support_rep"]', '#add-support-rep' ).val( '' ).focus();
+			} );
+
 			$( '#contact-author' ).appendTo( '#plugin-review .inside' );
 		},
 
@@ -108,6 +124,29 @@
 			} else {
 				$( '#committer-error' ).empty().hide();
 			}
+		},
+
+		toggleSupportRepForm: function( event ) {
+			var $form = $( '#add-support-rep' );
+
+			// Show/hide form.
+			$form.toggleClass( 'wp-hidden-children' );
+
+			// Focus on the input field, and on enter add the support rep, don't save post.
+			$( 'input[name="add_support_rep"]', $form ).focus().on( 'keydown', function( event ) {
+				if ( 13 === event.which ) {
+					event.preventDefault();
+					$( '#add-support-rep-submit', $form ).click();
+				}
+			} );
+		},
+
+		supportRepRequestAfter: function( response, data ) {
+			if ( data.parsed.errors ) {
+				$( '#support-rep-error' ).html( data.parsed.responses[0].errors[0].message ).show();
+			} else {
+				$( '#support-rep-error' ).empty().hide();
+			}
 		}
 
 	};
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/class-support-reps.php
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/class-support-reps.php	(nonexistent)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/class-support-reps.php	(working copy)
@@ -0,0 +1,98 @@
+<?php
+namespace WordPressdotorg\Plugin_Directory\Widgets;
+use WordPressdotorg\Plugin_Directory\Template;
+use WordPressdotorg\Plugin_Directory\Tools;
+
+/**
+ * A Widget to display support rep information about a plugin.
+ *
+ * @package WordPressdotorg\Plugin_Directory\Widgets
+ */
+class Support_Reps extends \WP_Widget {
+	/**
+	 * Support Reps constructor.
+	 */
+	public function __construct() {
+		parent::__construct( 'plugin_support_reps', __( 'Plugin Support Reps', 'wporg-plugins' ), array(
+			'classname'   => 'plugin-support-reps',
+			'description' => __( 'Displays support rep information.', 'wporg-plugins' ),
+		) );
+	}
+
+	/**
+	 * Outputs the content of the widget.
+	 *
+	 * @param array $args
+	 * @param array $instance
+	 */
+	public function widget( $args, $instance ) {
+		$post = get_post();
+
+		$support_reps = Tools::get_plugin_support_reps( $post->post_name );
+		$support_reps = array_map( function ( $user_login ) {
+			return get_user_by( 'slug', $user_login );
+		}, $support_reps );
+
+		if ( current_user_can( 'plugin_add_support_rep', $post ) || current_user_can( 'plugin_remove_support_rep', $post ) ) {
+			wp_enqueue_script( 'wporg-plugins-support-reps', plugins_url( 'js/support-reps.js', __FILE__ ), array( 'wp-util' ), true );
+			wp_localize_script( 'wporg-plugins-support-reps', 'supportRepsWidget', array(
+				'restUrl'             => get_rest_url(),
+				'restNonce'           => wp_create_nonce( 'wp_rest' ),
+				'pluginSlug'          => $post->post_name,
+				'removeSupportRepAYS' => __( 'Are you sure you want to remove this support rep?', 'wporg-plugins' ),
+			) );
+		}
+
+		$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Support Reps', 'wporg-plugins' ) : $instance['title'], $instance, $this->id_base );
+
+		echo $args['before_widget'];
+		echo $args['before_title'] . $title . $args['after_title'];
+		?>
+
+		<ul id="support-rep-list" class="support-rep-list">
+
+			<?php foreach ( $support_reps as $support_rep ) : ?>
+				<li data-user="<?php echo esc_attr( $support_rep->user_nicename ); ?>">
+					<?php echo get_avatar( $support_rep->ID, 32 ); ?>
+					<a href="<?php echo esc_url( 'https://profiles.wordpress.org/' . $support_rep->user_nicename ); ?>">
+						<?php echo Template::encode( $support_rep->display_name ); ?>
+					</a><br>
+
+					<?php if ( current_user_can( 'plugin_remove_support_rep', $post ) ) : ?>
+					<small>
+						<?php echo current_user_can( 'plugin_review' ) ? esc_html( $support_rep->user_email ) . ' ' : ''; ?>
+						<button class="button-link remove"><?php _e( 'Remove', 'wporg-plugins' ); ?></button>
+					</small>
+					<?php endif; ?>
+				</li>
+			<?php endforeach; ?>
+
+			<?php if ( current_user_can( 'plugin_add_support_rep', $post ) ) : ?>
+			<li class="new">
+				<form id="add-support-rep" action="POST">
+					<input type="text" name="support_rep" placeholder="<?php esc_attr_e( 'Login, Slug, or Email.', 'wporg-plugins' ); ?>">
+					<button type="submit" class="button button-secondary"><?php esc_attr_e( 'Add', 'wporg-plugins' ); ?></button>
+				</form>
+
+				<script id="tmpl-new-support-rep" type="text/template">
+					<li data-user="{{ data.nicename }}">
+						<a class="profile" href="{{ data.profile }}">
+							<img src="{{ data.avatar }}" class="avatar avatar-32 photo" height="32" width="32">
+							{{ data.name }}
+						</a><br>
+						<small>
+							<# if ( data.email ) { #>
+								<span class="email">{{ data.email }}</span>
+							<# } #>
+							<button class="button-link remove"><?php _e( 'Remove', 'wporg-plugins' ); ?></button>
+						</small>
+					</li>
+				</script>
+			</li>
+			<?php endif; ?>
+		</ul>
+
+		<?php
+		echo $args['after_widget'];
+	}
+}
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/js/support-reps.js
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/js/support-reps.js	(nonexistent)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/widgets/js/support-reps.js	(working copy)
@@ -0,0 +1,61 @@
+(
+	/**
+	 * @param {Object} $
+	 * @param {Object} wp
+	 * @param {Object} pluginDir
+	 * @param {String} pluginDir.restUrl
+	 * @param {String} pluginDir.restNonce
+	 * @param {String} pluginDir.pluginSlug
+	 */
+	function( $, wp, pluginDir ) {
+		var logError = function( result ) {
+			$( '.spinner' ).removeClass( 'spinner' );
+			result = $.parseJSON( result.responseText );
+			if ( typeof result.message !== 'undefined' ) {
+				alert( result.message );
+			}
+		};
+
+		$( '#support-rep-list' )
+			.on( 'click', '.remove', function() {
+				if ( ! window.confirm( pluginDir.removeSupportRepAYS ) ) {
+					return;
+				}
+
+				var $row = $( this ).addClass( 'spinner' ).parents( 'li' ),
+					url = pluginDir.restUrl + 'plugins/v1/plugin/' + pluginDir.pluginSlug + '/support-reps/' + $row.data( 'user' ) + '/?_wpnonce=' + pluginDir.restNonce;
+
+				$.post( {
+					url: url,
+					method: 'DELETE',
+				} ).success( function( result ) {
+					if ( true === result ) {
+						$row.slideUp( 500, function() {
+							$row.remove()
+						} );
+					}
+				} ).fail( logError );
+			} )
+			.on( 'submit', '#add-support-rep', function( event ) {
+				event.preventDefault();
+
+				var $row = $( this ).parents( 'li' ),
+					$newUserInput = $row.find( 'input[name="support_rep"]' ),
+					$button = $row.find( '.button-small' ).addClass( 'spinner' ),
+					url = pluginDir.restUrl + 'plugins/v1/plugin/' + pluginDir.pluginSlug + '/support-reps/?_wpnonce=' + pluginDir.restNonce;
+
+				$.post( {
+					url: url,
+					dataType: 'json',
+					data: {
+						support_rep: $newUserInput.val()
+					}
+				} ).done( function( result ) {
+					if ( typeof result.name !== 'undefined' ) {
+						$row.before( wp.template( 'new-support-rep' )( result ) );
+						$newUserInput.val( '' );
+						$button.removeClass( 'spinner' );
+					}
+				} ).fail( logError );
+			} );
+	} )( window.jQuery, window.wp, window.supportRepsWidget );
Index: wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/client/components/widget-area/widgets/committers/style.scss
===================================================================
--- wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/client/components/widget-area/widgets/committers/style.scss	(revision 5770)
+++ wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/client/components/widget-area/widgets/committers/style.scss	(working copy)
@@ -1,4 +1,5 @@
-.committer-list {
+.committer-list,
+.support-rep-list {
 	font-size: ms( -2 );
 	list-style: none;
 	margin: 0;
Index: wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/template-parts/plugin-sidebar-advanced.php
===================================================================
--- wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/template-parts/plugin-sidebar-advanced.php	(revision 5770)
+++ wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/template-parts/plugin-sidebar-advanced.php	(working copy)
@@ -21,6 +21,7 @@
 // If the user is not a contributor/committer for the plugin, we'll show the Donate metabox instead of the committer metabox.
 if ( current_user_can( 'plugin_admin_view', $post ) ) {
 	the_widget( 'WordPressdotorg\Plugin_Directory\Widgets\Committers', array(), $widget_args );
+	the_widget( 'WordPressdotorg\Plugin_Directory\Widgets\Support_Reps', array(), $widget_args );
 } else {
 	the_widget( 'WordPressdotorg\Plugin_Directory\Widgets\Donate', array(), $widget_args );
 }
