Index: src/wp-admin/includes/admin-filters.php
===================================================================
--- src/wp-admin/includes/admin-filters.php	(revision 39901)
+++ src/wp-admin/includes/admin-filters.php	(working copy)
@@ -55,6 +55,8 @@
 add_action( 'update_option_siteurl',       'update_home_siteurl', 10, 2 );
 add_action( 'update_option_page_on_front', 'update_home_siteurl', 10, 2 );
 
+add_action( 'update_option_new_admin_email', 'update_option_new_admin_email', 10, 2 );
+
 add_filter( 'heartbeat_received', 'wp_check_locked_posts',  10,  3 );
 add_filter( 'heartbeat_received', 'wp_refresh_post_lock',   10,  3 );
 add_filter( 'wp_refresh_nonces', 'wp_refresh_post_nonces', 10,  3 );
Index: src/wp-admin/includes/misc.php
===================================================================
--- src/wp-admin/includes/misc.php	(revision 39901)
+++ src/wp-admin/includes/misc.php	(working copy)
@@ -936,3 +936,80 @@
 	</script>
 	<?php
 }
+
+/**
+ * Sends an email when a site administrator email address is changed.
+ *
+ * @since 3.0.0
+ *
+ * @param string $old_value The old email address. Not currently used.
+ * @param string $value     The new email address.
+ */
+function update_option_new_admin_email( $old_value, $value ) {
+	if ( $value == get_option( 'admin_email' ) || !is_email( $value ) )
+		return;
+
+	$hash = md5( $value. time() .mt_rand() );
+	$new_admin_email = array(
+		'hash' => $hash,
+		'newemail' => $value
+	);
+	update_option( 'adminhash', $new_admin_email );
+
+	$switched_locale = switch_to_locale( get_user_locale() );
+
+	/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */
+	$email_text = __( 'Howdy ###USERNAME###,
+
+You recently requested to have the administration email address on
+your site changed.
+
+If this is correct, please click on the following link to change it:
+###ADMIN_URL###
+
+You can safely ignore and delete this email if you do not want to
+take this action.
+
+This email has been sent to ###EMAIL###
+
+Regards,
+All at ###SITENAME###
+###SITEURL###' );
+
+	/**
+	 * Filters the email text sent when the site admin email is changed.
+	 *
+	 * The following strings have a special meaning and will get replaced dynamically:
+	 * ###USERNAME###  The current user's username.
+	 * ###ADMIN_URL### The link to click on to confirm the email change.
+	 * ###EMAIL###     The new email.
+	 * ###SITENAME###  The name of the site.
+	 * ###SITEURL###   The URL to the site.
+	 *
+	 * @since 3.0.0
+	 *
+	 * @param string $email_text      Text in the email.
+	 * @param string $new_admin_email New admin email that the current administration email was changed to.
+	 */
+	$content = apply_filters( 'new_admin_email_content', $email_text, $new_admin_email );
+
+	$current_user = wp_get_current_user();
+	$content = str_replace( '###USERNAME###', $current_user->user_login, $content );
+	$content = str_replace( '###ADMIN_URL###', esc_url( self_admin_url( 'options.php?adminhash='.$hash ) ), $content );
+	$content = str_replace( '###EMAIL###', $value, $content );
+	// get single site name
+	$site_name = get_option( 'blogname' );
+	if ( is_multisite() ) {
+		$content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content );
+		$content = str_replace( '###SITEURL###', network_home_url(), $content );
+	} else {
+		$content = str_replace( '###SITENAME###', $site_name, $content );
+		$content = str_replace( '###SITEURL###', home_url(), $content );
+	}
+
+	wp_mail( $value, sprintf( __( '[%s] New Admin Email Address' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), $content );
+
+	if ( $switched_locale ) {
+		restore_previous_locale();
+	}
+}
Index: src/wp-admin/includes/ms-admin-filters.php
===================================================================
--- src/wp-admin/includes/ms-admin-filters.php	(revision 39901)
+++ src/wp-admin/includes/ms-admin-filters.php	(working copy)
@@ -20,8 +20,6 @@
 
 add_action( 'personal_options_update', 'send_confirmation_on_profile_email' );
 
-add_action( 'update_option_new_admin_email', 'update_option_new_admin_email', 10, 2 );
-
 // Site Hooks.
 add_action( 'wpmueditblogaction', 'upload_space_setting' );
 
Index: src/wp-admin/includes/ms.php
===================================================================
--- src/wp-admin/includes/ms.php	(revision 39901)
+++ src/wp-admin/includes/ms.php	(working copy)
@@ -256,76 +256,6 @@
 }
 
 /**
- * Sends an email when a site administrator email address is changed.
- *
- * @since 3.0.0
- *
- * @param string $old_value The old email address. Not currently used.
- * @param string $value     The new email address.
- */
-function update_option_new_admin_email( $old_value, $value ) {
-	if ( $value == get_option( 'admin_email' ) || !is_email( $value ) )
-		return;
-
-	$hash = md5( $value. time() .mt_rand() );
-	$new_admin_email = array(
-		'hash' => $hash,
-		'newemail' => $value
-	);
-	update_option( 'adminhash', $new_admin_email );
-
-	$switched_locale = switch_to_locale( get_user_locale() );
-
-	/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */
-	$email_text = __( 'Howdy ###USERNAME###,
-
-You recently requested to have the administration email address on
-your site changed.
-
-If this is correct, please click on the following link to change it:
-###ADMIN_URL###
-
-You can safely ignore and delete this email if you do not want to
-take this action.
-
-This email has been sent to ###EMAIL###
-
-Regards,
-All at ###SITENAME###
-###SITEURL###' );
-
-	/**
-	 * Filters the email text sent when the site admin email is changed.
-	 *
-	 * The following strings have a special meaning and will get replaced dynamically:
-	 * ###USERNAME###  The current user's username.
-	 * ###ADMIN_URL### The link to click on to confirm the email change.
-	 * ###EMAIL###     The new email.
-	 * ###SITENAME###  The name of the site.
-	 * ###SITEURL###   The URL to the site.
-	 *
-	 * @since MU
-	 *
-	 * @param string $email_text      Text in the email.
-	 * @param string $new_admin_email New admin email that the current administration email was changed to.
-	 */
-	$content = apply_filters( 'new_admin_email_content', $email_text, $new_admin_email );
-
-	$current_user = wp_get_current_user();
-	$content = str_replace( '###USERNAME###', $current_user->user_login, $content );
-	$content = str_replace( '###ADMIN_URL###', esc_url( self_admin_url( 'options.php?adminhash='.$hash ) ), $content );
-	$content = str_replace( '###EMAIL###', $value, $content );
-	$content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content );
-	$content = str_replace( '###SITEURL###', network_home_url(), $content );
-
-	wp_mail( $value, sprintf( __( '[%s] New Admin Email Address' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), $content );
-
-	if ( $switched_locale ) {
-		restore_previous_locale();
-	}
-}
-
-/**
  * Sends an email when an email address change is requested.
  *
  * @since 3.0.0
Index: src/wp-admin/options-general.php
===================================================================
--- src/wp-admin/options-general.php	(revision 39901)
+++ src/wp-admin/options-general.php	(working copy)
@@ -78,9 +78,28 @@
 <?php endif; ?>
 </tr>
 <tr>
-<th scope="row"><label for="admin_email"><?php _e('Email Address') ?> </label></th>
-<td><input name="admin_email" type="email" id="admin_email" aria-describedby="admin-email-description" value="<?php form_option( 'admin_email' ); ?>" class="regular-text ltr" />
-<p class="description" id="admin-email-description"><?php _e( 'This address is used for admin purposes, like new user notification.' ) ?></p></td>
+<th scope="row"><label for="new_admin_email"><?php _e('Email Address') ?></label></th>
+<td><input name="new_admin_email" type="email" id="new_admin_email" aria-describedby="new-admin-email-description" value="<?php form_option( 'admin_email' ); ?>" class="regular-text ltr" />
+<p class="description" id="new-admin-email-description"><?php _e( 'This address is used for admin purposes. If you change this we will send you an email at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ) ?></p>
+<?php
+$new_admin_email = get_option( 'new_admin_email' );
+if ( $new_admin_email && $new_admin_email != get_option('admin_email') ) : ?>
+<div class="updated inline">
+<p><?php
+	printf(
+		/* translators: %s: new admin email */
+		__( 'There is a pending change of the admin email to %s.' ),
+		'<code>' . esc_html( $new_admin_email ) . '</code>'
+	);
+	printf(
+		' <a href="%1$s">%2$s</a>',
+		esc_url( wp_nonce_url( admin_url( 'options.php?dismiss=new_admin_email' ), 'dismiss-new_admin_email' ) ),
+		__( 'Cancel' )
+	);
+?></p>
+</div>
+<?php endif; ?>
+</td>
 </tr>
 <tr>
 <th scope="row"><?php _e('Membership') ?></th>
@@ -112,7 +131,7 @@
 	);
 	printf(
 		' <a href="%1$s">%2$s</a>',
-		esc_url( wp_nonce_url( admin_url( 'options.php?dismiss=new_admin_email' ), 'dismiss-' . get_current_blog_id() . '-new_admin_email' ) ),
+		esc_url( wp_nonce_url( admin_url( 'options.php?dismiss=new_admin_email' ), 'dismiss-new_admin_email' ) ),
 		__( 'Cancel' )
 	);
 ?></p>
Index: src/wp-admin/options.php
===================================================================
--- src/wp-admin/options.php	(revision 39901)
+++ src/wp-admin/options.php	(working copy)
@@ -53,25 +53,23 @@
 }
 
 // Handle admin email change requests
-if ( is_multisite() ) {
-	if ( ! empty($_GET[ 'adminhash' ] ) ) {
-		$new_admin_details = get_option( 'adminhash' );
-		$redirect = 'options-general.php?updated=false';
-		if ( is_array( $new_admin_details ) && hash_equals( $new_admin_details[ 'hash' ], $_GET[ 'adminhash' ] ) && !empty($new_admin_details[ 'newemail' ]) ) {
-			update_option( 'admin_email', $new_admin_details[ 'newemail' ] );
-			delete_option( 'adminhash' );
-			delete_option( 'new_admin_email' );
-			$redirect = 'options-general.php?updated=true';
-		}
-		wp_redirect( admin_url( $redirect ) );
-		exit;
-	} elseif ( ! empty( $_GET['dismiss'] ) && 'new_admin_email' == $_GET['dismiss'] ) {
-		check_admin_referer( 'dismiss-' . get_current_blog_id() . '-new_admin_email' );
+if ( ! empty($_GET[ 'adminhash' ] ) ) {
+	$new_admin_details = get_option( 'adminhash' );
+	$redirect = 'options-general.php?updated=false';
+	if ( is_array( $new_admin_details ) && hash_equals( $new_admin_details[ 'hash' ], $_GET[ 'adminhash' ] ) && !empty($new_admin_details[ 'newemail' ]) ) {
+		update_option( 'admin_email', $new_admin_details[ 'newemail' ] );
 		delete_option( 'adminhash' );
 		delete_option( 'new_admin_email' );
-		wp_redirect( admin_url( 'options-general.php?updated=true' ) );
-		exit;
+		$redirect = 'options-general.php?updated=true';
 	}
+	wp_redirect( admin_url( $redirect ) );
+	exit;
+} elseif ( ! empty( $_GET['dismiss'] ) && 'new_admin_email' == $_GET['dismiss'] ) {
+	check_admin_referer( 'dismiss-new_admin_email' );
+	delete_option( 'adminhash' );
+	delete_option( 'new_admin_email' );
+	wp_redirect( admin_url( 'options-general.php?updated=true' ) );
+	exit;
 }
 
 if ( is_multisite() && ! is_super_admin() && 'update' != $action ) {
