Index: src/wp-admin/includes/misc.php
===================================================================
--- src/wp-admin/includes/misc.php	(revision 26312)
+++ src/wp-admin/includes/misc.php	(working copy)
@@ -739,3 +739,19 @@
 	return $response;
 }
 add_filter( 'heartbeat_received', 'wp_refresh_post_nonces', 10, 3 );
+
+/**
+ * Disable suspending of Heartbeat on the Add/Edit Post screens
+ *
+ * @since 3.8
+ */
+function _disable_heartbeat_suspend( $settings ) {
+	global $pagenow;
+
+	if ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) {
+		$settings['suspend'] = 'disable';
+	}
+
+	return $settings;
+}
+add_filter( 'heartbeat_settings', '_disable_heartbeat_suspend' );
Index: src/wp-includes/js/heartbeat.js
===================================================================
--- src/wp-includes/js/heartbeat.js	(revision 26312)
+++ src/wp-includes/js/heartbeat.js	(working copy)
@@ -34,9 +34,12 @@
 	var Heartbeat = function() {
 		var $document = $(document),
 			settings = {
-				// Used to stop the "beat"
-				isRunning: true,
+				// Suspend/resume
+				suspend: false,
 
+				// Whether suspending is enabled
+				suspendEnabled: true,
+
 				// Current screen id, defaults to the JS global 'pagenow' when present (in the admin) or 'front'
 				screenId: '',
 
@@ -128,6 +131,10 @@
 				if ( ! settings.screenId ) {
 					settings.screenId = options.screenId || 'front';
 				}
+
+				if ( options.suspend === 'disable' ) {
+					settings.suspendEnabled = false;
+				}
 			}
 
 			// Convert to milliseconds
@@ -145,7 +152,12 @@
 				focused();
 			}).on( 'unload.wp-heartbeat', function() {
 				// Don't connect any more
-				settings.isRunning = false;
+				settings.suspend = true;
+
+				// Abort the last request if not completed
+				if ( settings.xhr && settings.xhr.readyState !== 4 ) {
+					settings.xhr.abort();
+				}
 			});
 
 			// Check for user activity every 30 seconds.
@@ -274,7 +286,7 @@
 
 			// If the connection to the server is slower than the interval,
 			// heartbeat connects as soon as the previous connection's response is received.
-			if ( settings.connecting ) {
+			if ( settings.connecting || settings.suspend ) {
 				return;
 			}
 
@@ -351,7 +363,7 @@
 			var delta = time() - settings.lastTick,
 				interval = settings.mainInterval;
 
-			if ( ! settings.isRunning ) {
+			if ( settings.suspend ) {
 				return;
 			}
 
@@ -403,6 +415,9 @@
 			clearFocusTimers();
 			settings.userActivity = time();
 
+			// Resume if suspended
+			settings.suspend = false;
+
 			if ( ! settings.hasFocus ) {
 				settings.hasFocus = true;
 				scheduleNextTick();
@@ -513,6 +528,11 @@
 				blurred();
 			}
 
+			if ( settings.suspendEnabled && lastActive > 1800000 ) {
+				// Suspend after 30 min. of inactivity
+				settings.suspend = true;
+			}
+
 			if ( ! settings.userActivityEvents ) {
 				$document.on( 'mouseover.wp-heartbeat-active keyup.wp-heartbeat-active', function(){ userIsActive(); } );
 
@@ -562,6 +582,19 @@
 		}
 
 		/**
+		 * Disable suspending
+		 *
+		 * Should be used only when Heartbeat is performing critical tasks like autosave, post-locking, etc.
+		 * Using this for non-crittical tasks may overload the user's hosting account if several
+		 * browser windows/tabs are left open for a long time.
+		 *
+		 * @return void
+		 */
+		function disableSuspend() {
+			settings.suspendEnabled = false;
+		}
+
+		/**
 		 * Get/Set the interval
 		 *
 		 * When setting to 'fast' or 5, by default interval is 5 sec. for the next 30 ticks (for 2 min and 30 sec).
@@ -691,6 +724,7 @@
 		return {
 			hasFocus: hasFocus,
 			connectNow: connectNow,
+			disableSuspend: disableSuspend,
 			setInterval: setInterval,
 			hasConnectionError: hasConnectionError,
 			enqueue: enqueue,
