Index: src/wp-admin/admin-ajax.php
===================================================================
--- src/wp-admin/admin-ajax.php	(revision 29203)
+++ src/wp-admin/admin-ajax.php	(working copy)
@@ -61,7 +61,7 @@
 	'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
 	'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs',
 	'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail',
-	'parse-media-shortcode'
+	'parse-media-shortcode', 'generate_password',
 );
 
 // Register core Ajax calls.
Index: src/wp-admin/css/forms.css
===================================================================
--- src/wp-admin/css/forms.css	(revision 29203)
+++ src/wp-admin/css/forms.css	(working copy)
@@ -451,8 +451,8 @@
 	border-color: #8dff1c;
 }
 
-.indicator-hint {
-	padding-top: 8px;
+#password2 .indicator-hint {
+	padding: 4px 0 0 220px;
 }
 
 p.search-box {
@@ -651,10 +651,36 @@
 	border: none;
 }
 
-.color-option {
+.color-option,
+.pass1-password-visibility {
 	cursor: pointer;
 }
 
+.pass1-password-visibility {
+	line-height: 18px;
+	margin-right: 20px;
+}
+.pass1-password-visibility:before {
+	vertical-align: middle;
+}
+
+.pass1-password-visibility.show {
+	color: #666;
+}
+
+.pass1-password-visibility.hide {
+	color: #000;
+}
+
+.form-table tr#password td,
+.form-table tr#password2 td {
+	padding: 0 10px;
+}
+.form-table tr#password2 th,
+.form-table tr#password th {
+	padding: 0 10px 20px 0px;
+}
+
 /*------------------------------------------------------------------------------
   19.0 - Tools
 ------------------------------------------------------------------------------*/
@@ -948,6 +974,10 @@
 		padding: 0;
 		line-height: 2;
 	}
+
+	#password2 .indicator-hint {
+		padding-left: 0;
+	}
 }
 
 @media only screen and (max-width: 768px) {
Index: src/wp-admin/includes/ajax-actions.php
===================================================================
--- src/wp-admin/includes/ajax-actions.php	(revision 29203)
+++ src/wp-admin/includes/ajax-actions.php	(working copy)
@@ -2706,7 +2706,7 @@
 	if ( ! empty( $wp_scripts ) ) {
 		$wp_scripts->done = array();
 	}
-	
+
 	if ( 'playlist' === $_REQUEST['type'] ) {
 		wp_underscore_playlist_templates();
 
@@ -2716,4 +2716,13 @@
 	}
 
 	wp_send_json_success( ob_get_clean() );
+}
+
+/**
+ * Generates a password via ajax
+ *
+ * @since 4.0.0
+ */
+function wp_ajax_generate_password() {
+	wp_die( wp_generate_password() );
 }
\ No newline at end of file
Index: src/wp-admin/includes/user.php
===================================================================
--- src/wp-admin/includes/user.php	(revision 29203)
+++ src/wp-admin/includes/user.php	(working copy)
@@ -174,6 +174,22 @@
 
 	if ( $update ) {
 		$user_id = wp_update_user( $user );
+
+		// Encourage the user to reset their password
+		if( ! empty( $_POST['reset_password'] ) ) {
+			update_user_option( $user_id, 'default_password_nag', true, true );
+		}
+
+		// Send the new, plaintext password to the user
+		if( ! empty( $_POST['send_password'] ) ) {
+			$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
+			$message  = sprintf( __( 'Username: %s' ), $user->user_login ) . "\r\n";
+			$message .= sprintf( __( 'Password: %s' ), $pass1 ) . "\r\n";
+			$message .= wp_login_url() . "\r\n";
+
+			wp_mail( $user->user_email, sprintf( __( '[%s] Your username and password' ), $blogname ), $message );
+		}
+
 	} else {
 		$user_id = wp_insert_user( $user );
 		wp_new_user_notification( $user_id, isset( $_POST['send_password'] ) ? wp_unslash( $pass1 ) : '' );
Index: src/wp-admin/js/user-profile.js
===================================================================
--- src/wp-admin/js/user-profile.js	(revision 29203)
+++ src/wp-admin/js/user-profile.js	(working copy)
@@ -32,11 +32,89 @@
 
 	$(document).ready( function() {
 		var $colorpicker, $stylesheet, user_id, current_user_id,
+			self = this,
 			select = $( '#display_name' );
 
-		$('#pass1').val('').keyup( check_pass_strength );
-		$('#pass2').val('').keyup( check_pass_strength );
+		/* Passwords */
+
+		/**
+		 * Add a Generate Password button
+		 * Add a show password icon to view password when editing own profile
+		 * @since 4.0.0
+		 */
+		var visibilityIconShow = $( '.pass1-password-visibility.show' ),
+			visibilityIconHide = $( '.pass1-password-visibility.hide' ),
+			pass1 = $( '#pass1' ),
+			pass2 = $( '#pass2' ),
+			password_repeat = $( '.password-repeat' ),
+			// Show the 'Show Password' icon
+			showShowPasswordIcon = function() {
+				if( 'profile' == pagenow ) {
+					visibilityIconShow.show();
+					visibilityIconHide.hide();
+				}
+			},
+			// Show the 'Hide Password' icon
+			showHidePasswordIcon = function() {
+				visibilityIconShow.hide();
+				visibilityIconHide.show();
+			};
+		// Handle user entering password
+		pass1.val('').keyup(function(e) {
+			check_pass_strength();
+			changed = true;
+
+			// If the entry field is text, make password repeat field match and show 'hide password' icon
+			if ( 'text' == pass1.attr('type') ) {
+				pass2.attr('type', 'text');
+				showHidePasswordIcon();
+			} else {
+				// Otherwise show 'show password' icon
+				showShowPasswordIcon();
+			}
+			// Show the password repeat field
+			password_repeat.show();
+		});
+		pass2.val('').keyup( check_pass_strength );
+
+		// Handle the Generate Password button
+		$( '#generate-password' ).on('click', function() {
+			if ( 'profile' == pagenow ) {
+				// User's own password
+				pass1.attr('type', 'text');
+				pass2.attr('type', 'text');
+			} else {
+				pass1.attr('type', 'password');
+				pass2.attr('type', 'password');
+			}
+			// Send an ajax request to the server to get a new password
+			$.post( ajaxurl, { action: 'generate_password' }, function( response ) {
+				pass1.val( response ).trigger('keyup');
+				pass2.val( response ).trigger('keyup');
+				showHidePasswordIcon();
+				pass1.focus();
+				password_repeat.hide();
+			});
+		});
+		// Handle clicking on the 'show password' icon
+		visibilityIconShow.on('click', function(e) {
+			showHidePasswordIcon();
+			e.preventDefault();
+			pass1.attr('type', 'text');
+			pass2.attr('type', 'text');
+		});
+		// Handle clicking on the 'hide password' icon
+		visibilityIconHide.on('click', function(e) {
+			showShowPasswordIcon();
+			e.preventDefault();
+			pass1.attr('type', 'password');
+			pass2.attr('type', 'password');
+		});
+
 		$('#pass-strength-result').show();
+
+		/* End Passwords */
+
 		$('.color-palette').click( function() {
 			$(this).siblings('input[name="admin_color"]').prop('checked', true);
 		});
Index: src/wp-admin/user-edit.php
===================================================================
--- src/wp-admin/user-edit.php	(revision 29203)
+++ src/wp-admin/user-edit.php	(working copy)
@@ -459,18 +459,33 @@
 	<th><label for="pass1"><?php _e( 'New Password' ); ?></label></th>
 	<td>
 		<input class="hidden" value=" " /><!-- #24364 workaround -->
-		<input type="password" name="pass1" id="pass1" class="regular-text" size="16" value="" autocomplete="off" /><br />
-		<span class="description"><?php _e( 'If you would like to change the password type a new one. Otherwise leave this blank.' ); ?></span>
-	</td>
+		<input type="password" name="pass1" id="pass1" class="regular-text" value="" autocomplete="off" />
+		<span class="dashicons dashicons-visibility pass1-password-visibility hidden show" title="<?php _e( 'Show Password' ); ?>"></span>
+		<span class="dashicons dashicons-visibility pass1-password-visibility hidden hide" title="<?php _e( 'Hide Password' ); ?>"></span>
+		<input type="button" name="generate-password" id="generate-password" value="<?php _e( 'Generate Password' ); ?>" class="button hide-if-no-js" />
+  	</td>
 </tr>
-<tr>
-	<th scope="row"><label for="pass2"><?php _e( 'Repeat New Password' ); ?></label></th>
+<tr id="password2">
+	<th><label class="password-repeat hidden" for="pass2"><?php _e( 'Repeat New Password' ); ?></label></th>
 	<td>
-	<input name="pass2" type="password" id="pass2" class="regular-text" size="16" value="" autocomplete="off" /><br />
-	<span class="description" for="pass2"><?php _e( 'Type your new password again.' ); ?></span>
-	<br />
-	<div id="pass-strength-result"><?php _e( 'Strength indicator' ); ?></div>
-	<p class="description indicator-hint"><?php _e( 'Hint: The password should be at least seven characters long. To make it stronger, use upper and lower case letters, numbers, and symbols like ! " ? $ % ^ &amp; ).' ); ?></p>
+		<div class="password-repeat hidden">
+			<input name="pass2" type="password" id="pass2" class="regular-text" value="" autocomplete="off" />
+			<br />
+			<div id="pass-strength-result"><?php _e( 'Strength indicator' ); ?></div>
+			<p class="description indicator-hint"><?php _e( 'Hint: The password should be at least seven characters long. To make it stronger, use upper and lower case letters, numbers and symbols like ! " ? $ % ^ &amp; ).' ); ?></p>
+		</div>
+		<p class="description"><?php _e( 'If you would like to change the password type or generate a new one. Otherwise leave this blank.' ); ?></p>
+		<?php if( ! IS_PROFILE_PAGE ) { ?>
+		<p class="hide-if-no-js">
+			<label for="send_password">
+				<input type="checkbox" name="send_password" id="send_password" value="1" /> <?php _e( 'Send this password to the user by email.' ); ?>
+			</label>
+			<br />
+			<label for="reset_password">
+				<input type="checkbox" name="reset_password" id="reset_password" value="1" /> <?php _e( 'Encourage the user to change their password, once logged in.' ); ?>
+			</label>
+		</p>
+		<?php } ?>
 	</td>
 </tr>
 <?php endif; ?>
