Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/user-content-voting.php
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/user-content-voting.php	(revision 3778)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/user-content-voting.php	(working copy)
@@ -292,34 +292,58 @@
 			$comment_id = $comment->comment_ID;
 		}
 
-		$can_vote     = self::user_can_vote( get_current_user_id(), $comment_id );
-		$user_note    = self::is_current_user_note( $comment_id );
-		$logged_in    = is_user_logged_in();
-		$comment_link = get_comment_link( $comment_id );
-		$nonce        = wp_create_nonce( 'user-note-vote-' . $comment_id );
-		$disabled_str = __( 'Voting for this note is disabled', 'wporg' );
-		$log_in_str   = __( 'You must log in to vote on the helpfulness of this note', 'wporg' );
-		$log_in_url   = add_query_arg( 'redirect_to', urlencode( $comment_link ), 'https://login.wordpress.org' );
+		$can_vote       = self::user_can_vote( get_current_user_id(), $comment_id );
+		$user_upvoted   = self::has_user_upvoted_comment( $comment_id );
+		$user_downvoted = ( $user_upvoted ? false : self::has_user_downvoted_comment( $comment_id ) );
+		$logged_in      = is_user_logged_in();
+		$comment_link   = get_comment_link( $comment_id );
+		$nonce          = wp_create_nonce( 'user-note-vote-' . $comment_id );
+		$disabled_str   = __( 'Voting for this note is disabled', 'wporg' );
+		$cancel_str     = __( 'Click to cancel your vote.', 'wporg' ); 
+		$log_in_str     = __( 'You must log in to vote on the helpfulness of this note', 'wporg' );
+		$log_in_url     = add_query_arg( 'redirect_to', urlencode( $comment_link ), 'https://login.wordpress.org' );
+		$class          = '';
 
-		if ( ! $can_vote && $user_note ) {
+		if ( ! $can_vote && self::is_current_user_note( $comment_id ) ) {
 			$disabled_str = __( 'Voting for your own note is disabled', 'wporg' );
 		}
 
 		echo '<div class="user-note-voting" data-nonce="' . esc_attr( $nonce ) . '">';
 
-		// Up vote link
-		$user_upvoted = self::has_user_upvoted_comment( $comment_id );
-		if ( $can_vote ) {
-			$title = $user_upvoted ?
-				__( 'You have voted to indicate this note was helpful', 'wporg' ) :
-				__( 'Vote up if this note was helpful', 'wporg' );
-			$tag = $user_upvoted ? 'span' : 'a';
+		// Up vote
+		if ( $can_vote && !$user_downvoted ) {
+			// This user can vote. (user is logged in and it's not a note from the current user)
+			// And the user has not already downvoted this note.
+			$tag = 'a';
+			
+			if( $user_upvoted ) {
+				$title = __( 'You have voted to indicate this note was helpful.', 'wporg' );
+				$title .= ' ' . $cancel_str;
+			} else {
+				$title = __( 'Vote up if this note was helpful', 'wporg' );
+			}
 		} else {
-			$title = ! $logged_in ? $log_in_str : $disabled_str;
-			$tag = $logged_in ? 'span' : 'a';
+			$tag   = 'span';
+			$class = ' vote-disabled';
+			$title = $disabled_str;
+
+			// User has downvoted this note
+			if( $user_downvoted ) {
+				$title = __( "Voting up is disabled because you've already downvoted this note" , 'wporg' );		
+			}
+
+			// User is not logged in. Display log in link
+			if( ! $logged_in ) {
+				$tag   = 'a';
+				$class = '';
+				$title = $log_in_str;
+			}		
 		}
+
+		$class .= $user_upvoted ? ' user-voted' : '';
+
 		echo "<{$tag} "
-			. 'class="user-note-voting-up' . ( $user_upvoted ? ' user-voted' : '' )
+			. 'class="user-note-voting-up' . $class
 			. '" title="' . esc_attr( $title )
 			. '" data-id="' . esc_attr( $comment_id )
 			. '" data-vote="up';
@@ -347,19 +371,42 @@
 			. self::count_votes( $comment_id, 'difference' )
 			. '</span>';
 
-		// Down vote link
-		$user_downvoted = ( $user_upvoted ? false : self::has_user_downvoted_comment( $comment_id ) );
-		if ( $can_vote ) {
-			$title = $user_downvoted ?
-				__( 'You have voted to indicate this note was not helpful', 'wporg' ) :
-				__( 'Vote down if this note was not helpful', 'wporg' );
-			$tag = $user_downvoted ? 'span' : 'a';
+		// Down vote
+		$class = '';
+
+		if ( $can_vote && !$user_upvoted) {
+			// This user can vote. (user is logged in and it's not a note from the current user)
+			// And the user has not already upvoted this note.
+			$tag = 'a';
+			
+			if( $user_downvoted ) {
+				$title = __( 'You have voted to indicate this note was not helpful.', 'wporg' );
+				$title .= ' ' . $cancel_str;
+			} else {
+				$title = __( 'Vote down if this note was not helpful', 'wporg' );
+			}
 		} else {
-			$title = ! $logged_in ? $log_in_str : $disabled_str;
-			$tag = $logged_in ? 'span' : 'a';
+			$tag        = 'span';
+			$class      = ' vote-disabled';
+			$title      = $disabled_str;
+
+			// User has upvoted this note
+			if( $user_upvoted ) {
+				$title = __( "Voting down is disabled because you've already upvoted this note" , 'wporg' );
+			}
+
+			// User is not logged in. Display log in link
+			if( ! $logged_in ) {
+				$tag   = 'a';
+				$class = '';
+				$title = $log_in_str;
+			}
 		}
+
+		$class .= $user_downvoted ? ' user-voted' : '';
+
 		echo "<{$tag} "
-			. 'class="user-note-voting-down' . ( $user_downvoted ? ' user-voted' : '' )
+			. 'class="user-note-voting-down' . $class
 			. '" title="' . esc_attr( $title )
 			. '" data-id="' . esc_attr( $comment_id )
 			. '" data-vote="down';
@@ -485,9 +532,11 @@
 		// Get list of people who cast the same vote.
 		$add_to_list = get_comment_meta( $comment_id, $add_to, true );
 
-		// Don't do anything if user is recasting the same vote as before.
+		// Remove user from list if recasting the same vote as before.
 		if ( in_array( $user_id, (array) $add_to_list ) ) {
-			return false;
+			unset( $add_to_list[ array_search( $user_id, $add_to_list ) ] );
+			update_comment_meta( $comment_id, $add_to, $add_to_list );
+			return true;
 		}
 
 		// If the user had previously cast the opposite vote, undo that older vote.
Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/scss/main.scss
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/scss/main.scss	(revision 3778)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/scss/main.scss	(working copy)
@@ -1482,7 +1482,8 @@
 	.user-voted.user-note-voting-down .dashicons {
 		color: red;
 	}
-	.user-submitted-note .dashicons {
+	.user-submitted-note .dashicons,
+	.vote-disabled .dashicons {
 		color: grey;
 	}
 
Index: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/stylesheets/main.css
===================================================================
--- sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/stylesheets/main.css	(revision 3778)
+++ sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/stylesheets/main.css	(working copy)
@@ -1817,7 +1817,8 @@
   color: red;
 }
 
-.devhub-wrap .user-submitted-note .dashicons {
+.devhub-wrap .user-submitted-note .dashicons,
+.devhub-wrap .vote-disabled .dashicons {
   color: grey;
 }
 
