Index: wp-login.php
===================================================================
--- wp-login.php	(revision 40334)
+++ wp-login.php	(working copy)
@@ -174,7 +174,14 @@
 	if ( !empty( $message ) )
 		echo $message . "\n";
 
-	// In case a plugin uses $error rather than the $wp_errors object
+	/**
+	 * Fires after the login logo.
+	 *
+	 * @since 4.7
+	 */
+	do_action( 'after_login_logo' );
+
+	// In case a plugin uses $error rather than the $wp_errors object.
 	if ( !empty( $error ) ) {
 		$wp_error->add('error', $error);
 		unset($error);
@@ -201,6 +208,13 @@
 			 * @param string $errors Login error message.
 			 */
 			echo '<div id="login_error">' . apply_filters( 'login_errors', $errors ) . "</div>\n";
+
+			/**
+			 * Fires after the login error message.
+			 *
+			 * @since 4.7
+			 */
+			do_action( 'after_login_error' );
 		}
 		if ( ! empty( $messages ) ) {
 			/**
@@ -211,6 +225,13 @@
 			 * @param string $messages Login messages.
 			 */
 			echo '<p class="message">' . apply_filters( 'login_messages', $messages ) . "</p>\n";
+
+			/**
+			 * Fires after the login message.
+			 *
+			 * @since 4.7
+			 */
+			do_action( 'after_login_message' );
 		}
 	}
 } // End of login_header()
@@ -358,7 +379,7 @@
 
 	/**
 	 * Filters the message body of the password reset mail.
-	 * 
+	 *
 	 * If the filtered message is empty, the password reset email will not be sent.
 	 *
 	 * @since 2.8.0
