Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 23297)
+++ wp-includes/comment.php	(working copy)
@@ -1407,7 +1407,7 @@
 
 		$post = get_post($commentdata['comment_post_ID']); // Don't notify if it's your own comment
 
-		if ( get_option('comments_notify') && $commentdata['comment_approved'] && ( ! isset( $commentdata['user_id'] ) || $post->post_author != $commentdata['user_id'] ) )
+		if ( get_option( 'comments_notify', $post->post_author ) && $commentdata['comment_approved'] && ( ! isset( $commentdata['user_id'] ) || $post->post_author != $commentdata['user_id'] ) )
 			wp_notify_postauthor($comment_ID, isset( $commentdata['comment_type'] ) ? $commentdata['comment_type'] : '' );
 	}
 
@@ -1440,10 +1440,10 @@
 		case 'approve':
 		case '1':
 			$status = '1';
-			if ( get_option('comments_notify') ) {
-				$comment = get_comment($comment_id);
-				wp_notify_postauthor($comment_id, $comment->comment_type);
-			}
+			$comment = get_comment( $comment_id );
+			$post = get_post( $comment->comment_post_ID );
+			if ( get_user_option( 'comments_notify', $post->post_author ) )
+				wp_notify_postauthor( $comment_id, $comment->comment_type );
 			break;
 		case 'spam':
 			$status = 'spam';
@@ -1626,6 +1626,33 @@
 	return true;
 }
 
+/**
+ * Gets the User IDs of the users who should be emailed if a
+ * particular comment is held for moderation.
+ *
+ * @param int $comment_id The ID of the comment we want moderation recipients for
+ * @return array An array of WP_User objects
+ **/
+function wp_get_moderation_recipients( $comment_id ) {
+	global $wpdb;
+
+	$comment = get_comment( $comment_id );
+	$post = get_post( $comment->comment_post_ID );
+
+	// Find the IDs of the users who have requested moderation notifications in
+	// one way or another.
+	$sql = " SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s OR ( user_id = %d AND meta_key = %s ) ";
+	$user_ids = $wpdb->get_col( $wpdb->prepare( $sql,
+		$wpdb->prefix . 'moderation_notify',
+		$post->post_author,
+		$wpdb->prefix . 'moderation_notify_all'
+	) );
+
+	$users = array_map( array( 'WP_User', '__construct' ), array_unique( $user_ids ) );
+
+	return $users;
+}
+
 //
 // Ping and trackback functions.
 //
Index: wp-includes/pluggable.php
===================================================================
--- wp-includes/pluggable.php	(revision 23297)
+++ wp-includes/pluggable.php	(working copy)
@@ -1094,16 +1094,13 @@
 function wp_notify_moderator($comment_id) {
 	global $wpdb;
 
-	if ( 0 == get_option( 'moderation_notify' ) )
+	if ( ! $recipients = wp_get_moderation_recipients( $comment_id ) )
 		return true;
 
+	$email_to = wp_list_pluck( $recipients, 'user_email' );
+
 	$comment = get_comment($comment_id);
 	$post = get_post($comment->comment_post_ID);
-	$user = get_userdata( $post->post_author );
-	// Send to the administration and to the post author if the author can modify the comment.
-	$email_to = array( get_option('admin_email') );
-	if ( user_can($user->ID, 'edit_comment', $comment_id) && !empty($user->user_email) && ( get_option('admin_email') != $user->user_email) )
-		$email_to[] = $user->user_email;
 
 	$comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
 	$comments_waiting = $wpdb->get_var("SELECT count(comment_ID) FROM $wpdb->comments WHERE comment_approved = '0'");
@@ -1112,8 +1109,7 @@
 	// we want to reverse this for the plain text arena of emails.
 	$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
 
-	switch ($comment->comment_type)
-	{
+	switch ($comment->comment_type) {
 		case 'trackback':
 			$notify_message  = sprintf( __('A new trackback on the post "%s" is waiting for your approval'), $post->post_title ) . "\r\n";
 			$notify_message .= get_permalink($comment->comment_post_ID) . "\r\n\r\n";
Index: wp-admin/includes/user.php
===================================================================
--- wp-admin/includes/user.php	(revision 23297)
+++ wp-admin/includes/user.php	(working copy)
@@ -161,6 +161,13 @@
 		$user_id = wp_insert_user( $user );
 		wp_new_user_notification( $user_id, isset($_POST['send_password']) ? $pass1 : '' );
 	}
+
+	if ( user_can( $user_id, 'moderate_comments' ) ) {
+		foreach ( array( 'comments_notify', 'moderation_notify', 'moderation_notify_all' ) as $option )
+			if ( isset( $_POST[$option] ) )
+				update_user_option( $user_id, $option, $_POST[$option] );
+	}
+
 	return $user_id;
 }
 
Index: wp-admin/options-discussion.php
===================================================================
--- wp-admin/options-discussion.php	(revision 23297)
+++ wp-admin/options-discussion.php	(working copy)
@@ -120,18 +120,6 @@
 </fieldset></td>
 </tr>
 <tr valign="top">
-<th scope="row"><?php _e('E-mail me whenever'); ?></th>
-<td><fieldset><legend class="screen-reader-text"><span><?php _e('E-mail me whenever'); ?></span></legend>
-<label for="comments_notify">
-<input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked('1', get_option('comments_notify')); ?> />
-<?php _e('Anyone posts a comment'); ?> </label>
-<br />
-<label for="moderation_notify">
-<input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked('1', get_option('moderation_notify')); ?> />
-<?php _e('A comment is held for moderation'); ?> </label>
-</fieldset></td>
-</tr>
-<tr valign="top">
 <th scope="row"><?php _e('Before a comment appears'); ?></th>
 <td><fieldset><legend class="screen-reader-text"><span><?php _e('Before a comment appears'); ?></span></legend>
 <label for="comment_moderation">
Index: wp-admin/user-edit.php
===================================================================
--- wp-admin/user-edit.php	(revision 23297)
+++ wp-admin/user-edit.php	(working copy)
@@ -37,8 +37,7 @@
 	$parent_file = 'profile.php';
 
 $profile_help = '<p>' . __('Your profile contains information about you (your &#8220;account&#8221;) as well as some personal options related to using WordPress.') . '</p>' .
-	'<p>' . __('You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens.') . '</p>' .
-	'<p>' . __('Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts.') . '</p>' .
+	'<p>' . __('Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts. You can also change your password on this screen.') . '</p>' .
 	'<p>' . __('Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so.') . '</p>' .
 	'<p>' . __('Remember to click the Update Profile button when you are finished.') . '</p>';
 
@@ -48,6 +47,19 @@
 	'content' => $profile_help,
 ) );
 
+$personal_options = '<p>' . __( 'Personal options allow you to customize your WordPress experience. Among other things, you can:' ) . '</p>' . 
+	'<ul><li>' . __( 'Turn off the WYSIWYG (Visual) editor' ) . '</li>' . 
+	'<li>' . __( 'Change the color scheme of your WordPress administration screens' ) . '</li>' . 
+	'<li>' . __( 'Turn on keyboard shortcuts' ) . '</li>' . 
+	'<li>' . __( 'Manage email notification settings' ) . '</li></ul>' . 
+	'<p>' . __( 'You can also hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens.' ) . '</p>';
+
+get_current_screen()->add_help_tab( array(
+	'id'		=> 'personal-options',
+	'title'		=> __( 'Personal Options' ),
+	'content' 	=> $personal_options
+) );
+
 get_current_screen()->set_help_sidebar(
     '<p><strong>' . __('For more information:') . '</strong></p>' .
     '<p>' . __('<a href="http://codex.wordpress.org/Users_Your_Profile_Screen" target="_blank">Documentation on User Profiles</a>') . '</p>' .
@@ -221,6 +233,34 @@
 <td><label for="comment_shortcuts"><input type="checkbox" name="comment_shortcuts" id="comment_shortcuts" value="true" <?php if ( !empty($profileuser->comment_shortcuts) ) checked('true', $profileuser->comment_shortcuts); ?> /> <?php _e('Enable keyboard shortcuts for comment moderation.'); ?></label> <?php _e('<a href="http://codex.wordpress.org/Keyboard_Shortcuts" target="_blank">More information</a>'); ?></td>
 </tr>
 <?php endif; ?>
+
+<?php if ( user_can( $profileuser->ID, 'moderate_comments' ) ) : ?>
+	<tr valign="top">
+	<th scope="row"><?php _e( 'E-mail me whenever:' ) ?></th>
+		<td><fieldset>
+			<legend class="screen-reader-text">
+				<span><?php _e( 'E-mail me whenever' ) ?></span>
+			</legend><!-- .screen-reader-text -->
+
+			<input type="hidden" name="email_notifications" value="1" />
+			<label for="comments_notify">
+				<input name="comments_notify" type="checkbox" id="comments_notify" value="1" <?php checked( '1', get_user_option( 'comments_notify', $profileuser->ID ) ); ?> />
+				<?php _e( 'A comment is posted on one of my posts' ) ?>
+			</label><!-- comments_notify --><br/>
+
+			<label for="moderation_notify">
+				<input name="moderation_notify" type="checkbox" id="moderation_notify" value="1" <?php checked( '1', get_user_option( 'moderation_notify', $profileuser->ID ) ); ?> />
+				<?php _e( 'A comment on one of my posts is held for moderation' ) ?>
+			</label><!-- moderation_notify --><br/>
+
+			<label for="moderation_notify_all">
+				<input name="moderation_notify_all" type="checkbox" id="moderation_notify_all" value="1" <?php checked( '1', get_user_option( 'moderation_notify_all', $profileuser->ID ) ); ?> />
+				<?php _e( 'Any comment is held for moderation' ) ?>
+			</label><!-- moderation_notify_all -->
+		</fieldset></td>
+	</tr>
+<?php endif; ?>
+
 <tr class="show-admin-bar">
 <th scope="row"><?php _e('Toolbar')?></th>
 <td><fieldset><legend class="screen-reader-text"><span><?php _e('Toolbar') ?></span></legend>
