diff --git src/wp-admin/network/site-users.php src/wp-admin/network/site-users.php
index a3857b7..526c393 100644
--- src/wp-admin/network/site-users.php
+++ src/wp-admin/network/site-users.php
@@ -145,6 +145,7 @@ if ( $action ) {
 			if ( isset( $_REQUEST['users'] ) ) {
 				$userids = $_REQUEST['users'];
 				$update = 'promote';
+				$blog_roles = array_keys( $editable_roles );
 				foreach ( $userids as $user_id ) {
 					$user_id = (int) $user_id;
 
@@ -158,7 +159,16 @@ if ( $action ) {
 					}
 
 					$user = get_userdata( $user_id );
-					$user->set_role( $_REQUEST['new_role'] );
+
+					// Remove any blog roles for this user
+					foreach ( $blog_roles as $blog_role ) {
+						if ( $user->has_cap( $blog_role ) ) {
+							$user->remove_role( $blog_role );
+						}
+					}
+
+					// Add  back the role being bulk-set
+					$user->add_role( $_REQUEST['new_role'] );
 				}
 			} else {
 				$update = 'err_promote';
diff --git src/wp-admin/users.php src/wp-admin/users.php
index 194ced9..c5a35ae 100644
--- src/wp-admin/users.php
+++ src/wp-admin/users.php
@@ -115,6 +115,7 @@ case 'promote':
 
 	$userids = $_REQUEST['users'];
 	$update = 'promote';
+	$blog_roles = array_keys( $editable_roles );
 	foreach ( $userids as $id ) {
 		$id = (int) $id;
 
@@ -137,7 +138,16 @@ case 'promote':
 		}
 
 		$user = get_userdata( $id );
-		$user->set_role( $role );
+
+		// Remove any blog roles for this user
+		foreach ( $blog_roles as $blog_role ) {
+			if ( $user->has_cap( $blog_role ) ) {
+				$user->remove_role( $blog_role );
+			}
+		}
+
+		// Add  back the role being bulk-set
+		$user->add_role( $_REQUEST['new_role'] );
 	}
 
 	wp_redirect(add_query_arg('update', $update, $redirect));
