diff --git a/src/wp-admin/includes/class-wp-users-list-table.php b/src/wp-admin/includes/class-wp-users-list-table.php
index 8c80e9070d..644925748b 100644
--- a/src/wp-admin/includes/class-wp-users-list-table.php
+++ b/src/wp-admin/includes/class-wp-users-list-table.php
@@ -102,6 +102,14 @@ class WP_Users_List_Table extends WP_List_Table {
 				'search' => $usersearch,
 				'fields' => 'all_with_meta'
 			);
+		} elseif ( '-1' === $role && 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 @@ class WP_Users_List_Table extends WP_List_Table {
 		if ( '' !== $args['search'] )
 			$args['search'] = '*' . $args['search'] . '*';
 
-		if ( $this->is_site_users )
+		if ( $this->is_site_users && ! isset( $args['blog_id'] ) )
 			$args['blog_id'] = $this->site_id;
 
 		if ( isset( $_REQUEST['orderby'] ) )
@@ -222,6 +230,12 @@ class WP_Users_List_Table extends WP_List_Table {
 
 		}
 
+		if ( current_user_can( 'manage_network_users' ) ) {
+			$class = ( '-1' === $role ) ? ' class="current"' : '';
+			$name  = __( 'All Network Users' );
+			$role_links['all_network'] = "<a href='" . esc_url( add_query_arg( 'role', '-1', $url ) ) . "'$class>$name</a>";
+		}
+
 		return $role_links;
 	}
 
@@ -357,9 +371,6 @@ class WP_Users_List_Table extends WP_List_Table {
 			$post_counts = count_many_users_posts( array_keys( $this->items ) );
 
 		foreach ( $this->items as $userid => $user_object ) {
-			if ( is_multisite() && empty( $user_object->allcaps ) )
-				continue;
-
 			echo "\n\t" . $this->single_row( $user_object, '', '', isset( $post_counts ) ? $post_counts[ $userid ] : 0 );
 		}
 	}
@@ -410,7 +421,7 @@ class WP_Users_List_Table extends WP_List_Table {
 
 			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() && get_current_user_id() != $user_object->ID && 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>";
 
 			/**
@@ -476,7 +487,11 @@ class WP_Users_List_Table extends WP_List_Table {
 						$r .= "<a href='" . esc_url( "mailto:$email" ) . "'>$email</a>";
 						break;
 					case 'role':
-						$r .= esc_html( $roles_list );
+						if ( empty( $roles_list ) ) {
+							$r .= '<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">' . __( 'User is not a member of this site' ) . '</span>';
+						} else {
+							$r .= esc_html( $roles_list );
+						}
 						break;
 					case 'posts':
 						if ( $numposts > 0 ) {
@@ -544,7 +559,7 @@ class WP_Users_List_Table extends WP_List_Table {
 			}
 		}
 
-		if ( empty( $role_list ) ) {
+		if ( is_user_member_of_blog( $user_object->ID, $this->site_id ) && empty( $role_list ) ) {
 			$role_list['none'] = _x( 'None', 'no user roles' );
 		}
 
diff --git a/src/wp-admin/network/site-users.php b/src/wp-admin/network/site-users.php
index fcd1a863d0..58cf07428c 100644
--- a/src/wp-admin/network/site-users.php
+++ b/src/wp-admin/network/site-users.php
@@ -148,17 +148,25 @@ if ( $action ) {
 				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>' . __( 'Cheatin&#8217; uh?' ) . '</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'    => $_REQUEST['new_role'],
+							) );
+						} else {
+							wp_die(
+								'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</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( $_REQUEST['new_role'] );
 					}
 
-					$user = get_userdata( $user_id );
-					$user->set_role( $_REQUEST['new_role'] );
 				}
 			} else {
 				$update = 'err_promote';
@@ -260,6 +268,9 @@ endif; ?>
 <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(); ?>
diff --git a/src/wp-admin/users.php b/src/wp-admin/users.php
index 087d93f1b7..0da39d7b68 100644
--- a/src/wp-admin/users.php
+++ b/src/wp-admin/users.php
@@ -127,17 +127,25 @@ case 'promote':
 				continue;
 		}
 
-		// If the user doesn't already belong to the blog, bail.
+		// If the user doesn't already belong to the blog:
 		if ( is_multisite() && !is_user_member_of_blog( $id ) ) {
-			wp_die(
-				'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</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' => $id,
+					'role'    => $role,
+				) );
+			} else {
+				wp_die(
+					'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</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));
