Index: src/wp-admin/includes/class-wp-users-list-table.php
===================================================================
--- src/wp-admin/includes/class-wp-users-list-table.php	(revision 49022)
+++ src/wp-admin/includes/class-wp-users-list-table.php	(working copy)
@@ -101,6 +101,14 @@
 				'search'  => $usersearch,
 				'fields'  => 'all_with_meta',
 			);
+		} elseif ( '-1' === $role && is_multisite() && current_user_can( 'manage_network_users' ) ) {
+			$args = array(
+				'number'  => $users_per_page,
+				'offset'  => ( $paged - 1 ) * $users_per_page,
+				'blog_id' => 0,
+				'search'  => $usersearch,
+				'fields'  => 'all_with_meta'
+			);
 		} else {
 			$args = array(
 				'number' => $users_per_page,
@@ -115,7 +123,7 @@
 			$args['search'] = '*' . $args['search'] . '*';
 		}
 
-		if ( $this->is_site_users ) {
+		if ( $this->is_site_users && ! isset( $args['blog_id'] ) ) {
 			$args['blog_id'] = $this->site_id;
 		}
 
@@ -191,21 +199,44 @@
 		$avail_roles =& $users_of_blog['avail_roles'];
 		unset( $users_of_blog );
 
+		$role_links = array();
+
+		if ( is_multisite() && current_user_can( 'manage_network_users' ) ) {
+			$current_link_attributes = '';
+
+			if ( '-1' === $role ) {
+				$current_link_attributes = ' class="current" aria-current="page"';
+			}
+
+			$name = __( 'All Network Users' );
+
+			$role_links['all_network'] = "<a href='" . esc_url( add_query_arg( 'role', '-1', $url ) ) . "'$current_link_attributes>$name</a>";
+
+			/* translators: %s: Number of users. */
+			$all_users_label = _nx(
+				'All Site Users <span class="count">(%s)</span>',
+				'All Site Users <span class="count">(%s)</span>',
+				$total_users,
+				'users'
+			);
+		} else {
+			/* translators: %s: Number of users. */
+			$all_users_label = _nx(
+				'All <span class="count">(%s)</span>',
+				'All <span class="count">(%s)</span>',
+				$total_users,
+				'users'
+			);
+		}
+
 		$current_link_attributes = empty( $role ) ? ' class="current" aria-current="page"' : '';
 
-		$role_links        = array();
 		$role_links['all'] = sprintf(
 			'<a href="%s"%s>%s</a>',
 			$url,
 			$current_link_attributes,
 			sprintf(
-				/* translators: %s: Number of users. */
-				_nx(
-					'All <span class="count">(%s)</span>',
-					'All <span class="count">(%s)</span>',
-					$total_users,
-					'users'
-				),
+				$all_users_label,
 				number_format_i18n( $total_users )
 			)
 		);
@@ -454,7 +485,8 @@
 			if ( ! is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) ) {
 				$actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&amp;user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . '</a>';
 			}
-			if ( is_multisite() && current_user_can( 'remove_user', $user_object->ID ) ) {
+
+			if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) && is_user_member_of_blog( $user_object->ID, $this->site_id ) ) {
 				$actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( $url . "action=remove&amp;user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . '</a>';
 			}
 
@@ -551,7 +583,14 @@
 						$r .= "<a href='" . esc_url( "mailto:$email" ) . "'>$email</a>";
 						break;
 					case 'role':
-						$r .= esc_html( $roles_list );
+						if ( empty( $roles_list ) ) {
+							$r .= sprintf(
+								'<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">%s</span>',
+								__( 'User is not a member of this site' )
+							);
+						} else {
+							$r .= esc_html( $roles_list );
+						}
 						break;
 					case 'posts':
 						if ( $numposts > 0 ) {
@@ -623,7 +662,7 @@
 			}
 		}
 
-		if ( empty( $role_list ) ) {
+		if ( empty( $role_list ) && is_user_member_of_blog( $user_object->ID, $this->site_id ) ) {
 			$role_list['none'] = _x( 'None', 'no user roles' );
 		}
 
Index: src/wp-admin/network/site-users.php
===================================================================
--- src/wp-admin/network/site-users.php	(revision 49022)
+++ src/wp-admin/network/site-users.php	(working copy)
@@ -15,7 +15,6 @@
 }
 
 $wp_list_table = _get_list_table( 'WP_Users_List_Table' );
-$wp_list_table->prepare_items();
 
 get_current_screen()->add_help_tab( get_site_screen_help_tab_args() );
 get_current_screen()->set_help_sidebar( get_site_screen_help_sidebar_content() );
@@ -54,6 +53,8 @@
 
 switch_to_blog( $id );
 
+$wp_list_table->prepare_items();
+
 $action = $wp_list_table->current_action();
 
 if ( $action ) {
@@ -157,17 +158,24 @@
 				foreach ( $userids as $user_id ) {
 					$user_id = (int) $user_id;
 
-					// If the user doesn't already belong to the blog, bail.
+					// If the user doesn't already belong to the blog:
 					if ( ! is_user_member_of_blog( $user_id ) ) {
-						wp_die(
-							'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
-							'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',
-							403
-						);
+						if ( current_user_can( 'manage_network_users' ) ) {
+							add_existing_user_to_blog( array(
+								'user_id' => $user_id,
+								'role'    => $role,
+							) );
+						} else {
+							wp_die(
+								'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
+								'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',
+								403
+							);
+						}
+					} else {
+						$user = get_userdata( $user_id );
+						$user->set_role( $role );
 					}
-
-					$user = get_userdata( $user_id );
-					$user->set_role( $role );
 				}
 			} else {
 				$update = 'err_promote';
@@ -278,6 +286,9 @@
 <form class="search-form" method="get">
 <?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>
 <input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>" />
+<?php if ( isset( $_GET['role'] ) && '-1' === $_GET['role'] ) { ?>
+	<input type="hidden" name="role" value="-1" />
+<?php } ?>
 </form>
 
 <?php $wp_list_table->views(); ?>
Index: src/wp-admin/users.php
===================================================================
--- src/wp-admin/users.php	(revision 49022)
+++ src/wp-admin/users.php	(working copy)
@@ -139,17 +139,24 @@
 					continue;
 			}
 
-			// If the user doesn't already belong to the blog, bail.
-			if ( is_multisite() && ! is_user_member_of_blog( $id ) ) {
-				wp_die(
-					'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
-					'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',
-					403
-				);
+			// If the user doesn't already belong to the blog:
+			if ( ! is_user_member_of_blog( $id ) ) {
+				if ( current_user_can( 'manage_network_users' ) ) {
+					add_existing_user_to_blog( array(
+						'user_id' => $id,
+						'role'    => $role,
+					) );
+				} else {
+					wp_die(
+						'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
+						'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',
+						403
+					);
+				}
+			} else {
+				$user = get_userdata( $id );
+				$user->set_role( $role );
 			}
-
-			$user = get_userdata( $id );
-			$user->set_role( $role );
 		}
 
 		wp_redirect( add_query_arg( 'update', $update, $redirect ) );
