Index: /Users/simon/Projects/WordPress-Bleeding/site/wp-includes/comment.php
===================================================================
--- /Users/simon/Projects/WordPress-Bleeding/site/wp-includes/comment.php	(revision 16532)
+++ /Users/simon/Projects/WordPress-Bleeding/site/wp-includes/comment.php	(working copy)
@@ -1350,7 +1350,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_user_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'] : '' );
 	}
 
@@ -1386,10 +1386,10 @@
 		case 'approve':
 		case '1':
 			$status = '1';
-			if ( get_option('comments_notify') ) {
-				$comment = get_comment($comment_id);
+			$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';
@@ -1575,6 +1575,35 @@
 	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 ) ";
+	$moderation_notify = $wpdb->prefix . 'moderation_notify';
+	$moderation_notify_all = $wpdb->prefix . 'moderation_notify_all';
+	$user_ids = $wpdb->get_col( $wpdb->prepare( $sql, $comments_notify, $post->post_author, $comments_notify_all ) );
+
+	$user_ids = array_unique( $user_ids );
+	
+	$users = array();
+	foreach ( $user_ids as $user_id )
+		$users[] = new WP_User( $user_id );
+
+	return $users;
+}
+
 //
 // Ping and trackback functions.
 //
Index: /Users/simon/Projects/WordPress-Bleeding/site/wp-includes/pluggable.php
===================================================================
--- /Users/simon/Projects/WordPress-Bleeding/site/wp-includes/pluggable.php	(revision 16532)
+++ /Users/simon/Projects/WordPress-Bleeding/site/wp-includes/pluggable.php	(working copy)
@@ -1102,16 +1102,15 @@
 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 = array();
+	foreach ( $recipients as $recipient )
+		$email_to[] = $recipient->user_email;
+
 	$comment = get_comment($comment_id);
 	$post = get_post($comment->comment_post_ID);
-	$user = get_userdata( $post->post_author );
-	// Send to the administation 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'");
Index: /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/includes/schema.php
===================================================================
--- /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/includes/schema.php	(revision 16532)
+++ /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/includes/schema.php	(working copy)
@@ -206,7 +206,6 @@
 	'use_balanceTags' => 0,
 	'use_smilies' => 1,
 	'require_name_email' => 1,
-	'comments_notify' => 1,
 	'posts_per_rss' => 10,
 	'rss_use_excerpt' => 0,
 	'mailserver_url' => 'mail.example.com',
@@ -229,7 +228,6 @@
 	'links_recently_updated_append' => '</em>',
 	'links_recently_updated_time' => 120,
 	'comment_moderation' => 0,
-	'moderation_notify' => 1,
 	'permalink_structure' => '',
 	'gzipcompression' => 0,
 	'hack_file' => 0,
Index: /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/includes/user.php
===================================================================
--- /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/includes/user.php	(revision 16532)
+++ /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/includes/user.php	(working copy)
@@ -185,6 +185,19 @@
 		$user_id = wp_insert_user( get_object_vars( $user ) );
 		wp_new_user_notification( $user_id, isset($_POST['send_password']) ? $pass1 : '' );
 	}
+
+	// Per site email notification settings
+	// Only change these if the user can moderate comments
+	if ( user_can( $user_id, 'moderate_comments' ) ) {
+		// @TODO: Some of these options probably need to be defaulted on when the first user in a site is created
+		$comments_notify = (bool) @ $_POST['comments_notify'];
+		$moderation_notify = (bool) @ $_POST['moderation_notify'];
+		$moderation_notify_all = (bool) @ $_POST['moderation_notify_all'];
+		update_user_option( $user_id, 'comments_notify', $comments_notify );
+		update_user_option( $user_id, 'moderation_notify', $moderation_notify );
+		update_user_option( $user_id, 'moderation_notify_all', $moderation_notify_all );
+	}
+
 	return $user_id;
 }
 
Index: /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/options-discussion.php
===================================================================
--- /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/options-discussion.php	(revision 16532)
+++ /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/options-discussion.php	(working copy)
@@ -113,18 +113,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: /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/options.php
===================================================================
--- /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/options.php	(revision 16532)
+++ /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/options.php	(working copy)
@@ -56,7 +56,7 @@
 
 $whitelist_options = array(
 	'general' => array( 'blogname', 'blogdescription', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'timezone_string' ),
-	'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'page_comments', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ),
+	'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'page_comments', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ),
 	'media' => array( 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'large_size_w', 'large_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type', 'embed_autourls', 'embed_size_w', 'embed_size_h' ),
 	'privacy' => array( 'blog_public' ),
 	'reading' => array( 'posts_per_page', 'posts_per_rss', 'rss_use_excerpt', 'blog_charset', 'show_on_front', 'page_on_front', 'page_for_posts' ),
Index: /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/user-edit.php
===================================================================
--- /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/user-edit.php	(revision 16532)
+++ /Users/simon/Projects/WordPress-Bleeding/site/wp-admin/user-edit.php	(working copy)
@@ -211,6 +211,27 @@
 <th scope="row"><?php _e( 'Keyboard Shortcuts' ); ?></th>
 <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 if ( user_can( $profileuser->ID, 'moderate_comments' ) ) : ?>
+	<input type="hidden" name="email_notifications" value="1" />
+	<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_user_option('comments_notify', $profileuser->ID)); ?> />
+	<?php _e('A comment is posted on one of my posts') ?>
+	</label>
+	<br />
+	<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>
+	<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>
+	</fieldset></td>
+	</tr>
+<?php endif; // current_user_can moderate_comments ?>
 <?php
 endif;
 do_action('personal_options', $profileuser);
