diff --git src/wp-includes/class-wp-post.php src/wp-includes/class-wp-post.php
index edaf149a3f..c439a5eba1 100644
--- src/wp-includes/class-wp-post.php
+++ src/wp-includes/class-wp-post.php
@@ -12,12 +12,14 @@
  *
  * @since 3.5.0
  *
- * @property string $page_template
+ * @property string      $page_template The post type template specified for this post.
  *
- * @property-read array  $ancestors
- * @property-read int    $post_category
+ * @property-read array  $ancestors     The post's ancestors.
+ * @property-read array  $post_category The categories associated with the post.
  * @property-read string $tag_input
- *
+ * @property-read array  $pages         Array of all pages in post/page. Each array element contains part of the content
+ *                                      separated by the <!--nextpage--> tag.
+ * @property-read int    $multipage     Boolean indicator for whether multiple pages are in play.
  */
 final class WP_Post {
 
@@ -249,19 +251,17 @@ final class WP_Post {
 	 * @return bool
 	 */
 	public function __isset( $key ) {
-		if ( 'ancestors' == $key )
-			return true;
-
-		if ( 'page_template' == $key )
-			return true;
-
-		if ( 'post_category' == $key )
-		   return true;
-
-		if ( 'tags_input' == $key )
-		   return true;
-
-		return metadata_exists( 'post', $this->ID, $key );
+		switch ( $key ) {
+			case 'ancestors':
+			case 'page_template':
+			case 'post_category':
+			case 'tags_input':
+			case 'pages':
+			case 'multipage':
+				return true;
+			default:
+				return metadata_exists( 'post', $this->ID, $key );
+		}
 	}
 
 	/**
@@ -295,6 +295,43 @@ final class WP_Post {
 			return wp_list_pluck( $terms, 'name' );
 		}
 
+		if ( 'pages' === $key ) {
+			$content = $this->post_content;
+			if ( false !== strpos( $content, '<!--nextpage-->' ) ) {
+				$content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content );
+				$content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content );
+				$content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content );
+
+				// Ignore nextpage at the beginning of the content.
+				if ( 0 === strpos( $content, '<!--nextpage-->' ) )
+					$content = substr( $content, 15 );
+
+				$pages = explode('<!--nextpage-->', $content);
+			} else {
+				$pages = array( $this->post_content );
+			}
+
+			/**
+			 * Filters the "pages" derived from splitting the post content.
+			 *
+			 * "Pages" are determined by splitting the post content based on the presence
+			 * of `<!-- nextpage -->` tags.
+			 *
+			 * @since 4.4.0
+			 *
+			 * @param array   $pages Array of "pages" derived from the post content.
+			 *                       of `<!-- nextpage -->` tags..
+			 * @param WP_Post $post  Current post object.
+			 */
+			return apply_filters( 'content_pagination', $pages, $this );
+		}
+
+		if ( 'multipage' === $key ) {
+			$numpages = count( $this->pages );
+
+			return ( $numpages > 1 ) ? 1 : 0;
+		}
+
 		// Rest of the values need filtering.
 		if ( 'ancestors' == $key )
 			$value = get_post_ancestors( $this );
diff --git src/wp-includes/class-wp-query.php src/wp-includes/class-wp-query.php
index baefec75b4..e75e154109 100644
--- src/wp-includes/class-wp-query.php
+++ src/wp-includes/class-wp-query.php
@@ -4003,8 +4003,10 @@ class WP_Query {
 		$numpages = 1;
 		$multipage = 0;
 		$page = $this->get( 'page' );
-		if ( ! $page )
+
+		if ( ! $page || $post->ID !== get_queried_object_id() ) {
 			$page = 1;
+		}
 
 		/*
 		 * Force full post content when viewing the permalink for the $post,
@@ -4018,44 +4020,12 @@ class WP_Query {
 			$more = 0;
 		}
 
-		$content = $post->post_content;
-		if ( false !== strpos( $content, '<!--nextpage-->' ) ) {
-			$content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content );
-			$content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content );
-			$content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content );
-
-			// Ignore nextpage at the beginning of the content.
-			if ( 0 === strpos( $content, '<!--nextpage-->' ) )
-				$content = substr( $content, 15 );
-
-			$pages = explode('<!--nextpage-->', $content);
-		} else {
-			$pages = array( $post->post_content );
-		}
-
-		/**
-		 * Filters the "pages" derived from splitting the post content.
-		 *
-		 * "Pages" are determined by splitting the post content based on the presence
-		 * of `<!-- nextpage -->` tags.
-		 *
-		 * @since 4.4.0
-		 *
-		 * @param array   $pages Array of "pages" derived from the post content.
-		 *                       of `<!-- nextpage -->` tags..
-		 * @param WP_Post $post  Current post object.
-		 */
-		$pages = apply_filters( 'content_pagination', $pages, $post );
-
+		$pages    = $post->pages;
 		$numpages = count( $pages );
+		$multipage = $post->multipage;
 
-		if ( $numpages > 1 ) {
-			if ( $page > 1 ) {
-				$more = 1;
-			}
-			$multipage = 1;
-		} else {
-	 		$multipage = 0;
+		if ( $numpages > 1 && $page > 1 ) {
+			$more = 1;
 	 	}
 
 		/**
diff --git src/wp-includes/default-filters.php src/wp-includes/default-filters.php
index 9b45abc9fd..d95ffce693 100644
--- src/wp-includes/default-filters.php
+++ src/wp-includes/default-filters.php
@@ -140,12 +140,12 @@ add_filter( 'the_content', 'shortcode_unautop'                 );
 add_filter( 'the_content', 'prepend_attachment'                );
 add_filter( 'the_content', 'wp_make_content_images_responsive' );
 
-add_filter( 'the_excerpt',     'wptexturize'      );
-add_filter( 'the_excerpt',     'convert_smilies'  );
-add_filter( 'the_excerpt',     'convert_chars'    );
-add_filter( 'the_excerpt',     'wpautop'          );
-add_filter( 'the_excerpt',     'shortcode_unautop');
-add_filter( 'get_the_excerpt', 'wp_trim_excerpt'  );
+add_filter( 'the_excerpt',     'wptexturize'            );
+add_filter( 'the_excerpt',     'convert_smilies'        );
+add_filter( 'the_excerpt',     'convert_chars'          );
+add_filter( 'the_excerpt',     'wpautop'                );
+add_filter( 'the_excerpt',     'shortcode_unautop'      );
+add_filter( 'get_the_excerpt', 'wp_trim_excerpt', 10, 2 );
 
 add_filter( 'the_post_thumbnail_caption', 'wptexturize'     );
 add_filter( 'the_post_thumbnail_caption', 'convert_smilies' );
diff --git src/wp-includes/formatting.php src/wp-includes/formatting.php
index e4a4db1ddf..9176852c89 100644
--- src/wp-includes/formatting.php
+++ src/wp-includes/formatting.php
@@ -3282,14 +3282,17 @@ function human_time_diff( $from, $to = '' ) {
  * The ' [&hellip;]' string can be modified by plugins/themes using the {@see 'excerpt_more'} filter
  *
  * @since 1.5.0
+ * @since 4.7.0 Introduced the `$post` parameter.
  *
  * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
+ * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
  * @return string The excerpt.
  */
-function wp_trim_excerpt( $text = '' ) {
+function wp_trim_excerpt( $text = '', $post = null ) {
 	$raw_excerpt = $text;
+
 	if ( '' == $text ) {
-		$text = get_the_content('');
+		$text = get_the_content( $post, array( 'more_link_text' => '' ) );
 
 		$text = strip_shortcodes( $text );
 
diff --git src/wp-includes/post-template.php src/wp-includes/post-template.php
index 924e3996fb..f918391b38 100644
--- src/wp-includes/post-template.php
+++ src/wp-includes/post-template.php
@@ -253,27 +253,46 @@ function the_content( $more_link_text = null, $strip_teaser = false) {
  * @global array $pages     Array of all pages in post/page. Each array element contains part of the content separated by the <!--nextpage--> tag.
  * @global int   $multipage Boolean indicator for whether multiple pages are in play.
  *
- * @param string $more_link_text Optional. Content for when there is more text.
- * @param bool   $strip_teaser   Optional. Strip teaser content before the more text. Default is false.
+ * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
+ * @param array $args {
+ *     Array of arguments.
+ *
+ *     @type string $more_link_text Optional. Content for when there is more text. Default null.
+ *     @type bool   $strip_teaser   Optional. Strip teaser content before the more text. Default is false.
+ * }
  * @return string
  */
-function get_the_content( $more_link_text = null, $strip_teaser = false ) {
-	global $page, $more, $preview, $pages, $multipage;
+function get_the_content( $post = null, $args = null ) {
+	global $page, $more, $preview;
+
+	$more_link_text = sprintf(
+		'<span aria-label="%1$s">%2$s</span>',
+		sprintf(
+			/* translators: %s: Name of current post */
+			__( 'Continue reading %s' ),
+			the_title_attribute( array( 'echo' => false ) )
+		),
+		__( '(more&hellip;)' )
+	);
 
-	$post = get_post();
+	$defaults = array(
+		'more_link_text' => $more_link_text,
+		'strip_teaser'   => false,
+	);
 
-	if ( null === $more_link_text ) {
-		$more_link_text = sprintf(
-			'<span aria-label="%1$s">%2$s</span>',
-			sprintf(
-				/* translators: %s: Name of current post */
-				__( 'Continue reading %s' ),
-				the_title_attribute( array( 'echo' => false ) )
-			),
-			__( '(more&hellip;)' )
+	// Backward compatibility for the old function signature.
+	if ( is_bool( $args ) || is_string( $post ) ) {
+		$args = array(
+			'more_link_text' => $post,
+			'strip_teaser'   => $args,
 		);
+		$post = null;
 	}
 
+	$args = wp_parse_args( $args, $defaults );
+
+	$post = get_post( $post );
+
 	$output = '';
 	$has_teaser = false;
 
@@ -281,27 +300,31 @@ function get_the_content( $more_link_text = null, $strip_teaser = false ) {
 	if ( post_password_required( $post ) )
 		return get_the_password_form( $post );
 
-	if ( $page > count( $pages ) ) // if the requested page doesn't exist
-		$page = count( $pages ); // give them the highest numbered page that DOES exist
+	setup_postdata( $post );
+
+	if ( $page > count( $post->pages ) ) // if the requested page doesn't exist
+		$page = count( $post->pages ); // give them the highest numbered page that DOES exist
 
-	$content = $pages[$page - 1];
+	$content = $post->pages[ $page - 1 ];
 	if ( preg_match( '/<!--more(.*?)?-->/', $content, $matches ) ) {
 		$content = explode( $matches[0], $content, 2 );
-		if ( ! empty( $matches[1] ) && ! empty( $more_link_text ) )
-			$more_link_text = strip_tags( wp_kses_no_null( trim( $matches[1] ) ) );
+		if ( ! empty( $matches[1] ) && ! empty( $args['more_link_text'] ) )
+			$args['more_link_text'] = strip_tags( wp_kses_no_null( trim( $matches[1] ) ) );
 
 		$has_teaser = true;
 	} else {
 		$content = array( $content );
 	}
 
-	if ( false !== strpos( $post->post_content, '<!--noteaser-->' ) && ( ! $multipage || $page == 1 ) )
-		$strip_teaser = true;
+	if ( false !== strpos( $post->post_content, '<!--noteaser-->' ) && ( ! $post->multipage || $page == 1 ) ) {
+		$args['strip_teaser'] = true;
+	}
 
 	$teaser = $content[0];
 
-	if ( $more && $strip_teaser && $has_teaser )
+	if ( $more && $args['strip_teaser'] && $has_teaser ) {
 		$teaser = '';
+	}
 
 	$output .= $teaser;
 
@@ -309,7 +332,13 @@ function get_the_content( $more_link_text = null, $strip_teaser = false ) {
 		if ( $more ) {
 			$output .= '<span id="more-' . $post->ID . '"></span>' . $content[1];
 		} else {
-			if ( ! empty( $more_link_text ) )
+			if ( ! empty( $args['more_link_text'] ) ) {
+				$more_link = sprintf(
+					' <a href="%s#more-%d" class="more-link">%s</a>',
+					get_permalink(),
+					$post->ID,
+					$args['more_link_text']
+				);
 
 				/**
 				 * Filters the Read More link text.
@@ -319,7 +348,8 @@ function get_the_content( $more_link_text = null, $strip_teaser = false ) {
 				 * @param string $more_link_element Read More link element.
 				 * @param string $more_link_text    Read More text.
 				 */
-				$output .= apply_filters( 'the_content_more_link', ' <a href="' . get_permalink() . "#more-{$post->ID}\" class=\"more-link\">$more_link_text</a>", $more_link_text );
+				$output .= apply_filters( 'the_content_more_link', $more_link, $args['more_link_text'] );
+			}
 			$output = force_balance_tags( $output );
 		}
 	}
@@ -327,6 +357,8 @@ function get_the_content( $more_link_text = null, $strip_teaser = false ) {
 	if ( $preview ) // Preview fix for JavaScript bug with foreign languages.
 		$output =	preg_replace_callback( '/\%u([0-9A-F]{4})/', '_convert_urlencoded_to_entities', $output );
 
+	wp_reset_postdata();
+
 	return $output;
 }
 
diff --git tests/phpunit/tests/formatting/WpTrimExcerpt.php tests/phpunit/tests/formatting/WpTrimExcerpt.php
index da508c7712..48b1fc7641 100644
--- tests/phpunit/tests/formatting/WpTrimExcerpt.php
+++ tests/phpunit/tests/formatting/WpTrimExcerpt.php
@@ -26,6 +26,7 @@ class Tests_Formatting_WpTrimExcerpt extends WP_UnitTestCase {
 			while ( $q->have_posts() ) {
 				$q->the_post();
 				$this->assertSame( 'Post 2 Page 1', wp_trim_excerpt() );
+				$this->assertSame( 'Post 1 Page 1Post 1 Page 2', wp_trim_excerpt( '', $post1 ) );
 			}
 		}
 	}
@@ -51,7 +52,35 @@ class Tests_Formatting_WpTrimExcerpt extends WP_UnitTestCase {
 			while ( $q->have_posts() ) {
 				$q->the_post();
 				$this->assertSame( 'Post 2 Page 1', wp_trim_excerpt() );
+				$this->assertSame( 'Post 1 Page 1', wp_trim_excerpt( '', $post1 ) );
 			}
 		}
 	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_fall_back_on_current_post_when_text_is_empty() {
+		$GLOBALS['post'] = self::factory()->post->create_and_get( array( 'post_content' => 'Foo' ) );
+
+		$this->assertSame( 'Foo', wp_trim_excerpt( '' ) );
+	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_respect_post_param_when_text_is_empty() {
+		$GLOBALS['post'] = self::factory()->post->create_and_get( array( 'post_content' => 'Foo' ) );
+
+		$other_post = self::factory()->post->create_and_get( array( 'post_content' => 'Bar' ) );
+		$this->assertSame( 'Bar', wp_trim_excerpt( '', $other_post ) );
+	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_give_precedence_to_passed_excerpt() {
+		$post = self::factory()->post->create_and_get( array( 'post_content' => 'Foo' ) );
+		$this->assertSame( 'Foo', wp_trim_excerpt( 'Foo', $post ) );
+	}
 }
diff --git tests/phpunit/tests/post/getTheContent.php tests/phpunit/tests/post/getTheContent.php
new file mode 100644
index 0000000000..9e1da323b5
--- /dev/null
+++ tests/phpunit/tests/post/getTheContent.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * @group post
+ */
+class Tests_Post_GetTheContent extends WP_UnitTestCase {
+	/**
+	 * @ticket 36934
+	 */
+	public function test_argument_back_compat_more_link_text() {
+		$text = 'Foo<!--more-->Bar';
+		$p = self::factory()->post->create( array( 'post_content' => $text ) );
+
+		$q = new WP_Query( array( 'p' => $p ) );
+		while ( $q->have_posts() ) {
+			$q->the_post();
+
+			$found = get_the_content( 'Ping' );
+		}
+
+		$this->assertContains( '>Ping<', $found );
+	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_argument_back_compat_strip_teaser() {
+		$text = 'Foo<!--more-->Bar';
+		$p = self::factory()->post->create( array( 'post_content' => $text ) );
+
+		$this->go_to( get_permalink( $p ) );
+
+		$q = new WP_Query( array( 'p' => $p ) );
+		while ( $q->have_posts() ) {
+			$q->the_post();
+
+			$found = get_the_content( null, true );
+		}
+
+		$this->assertNotContains( 'Foo', $found );
+	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_respect_pagination_of_inner_post() {
+		$text_1 = 'Foo<!--nextpage-->Bar<!--nextpage-->Baz';
+		$post_1 = self::factory()->post->create_and_get( array( 'post_content' => $text_1 ) );
+
+		$text_2 = 'Bing<!--nextpage-->Bang<!--nextpage-->Boom';
+		$post_2 = self::factory()->post->create_and_get( array( 'post_content' => $text_2 ) );
+		$go_to = add_query_arg( 'page', '2', get_permalink( $post_1->ID ) );
+		$this->go_to( $go_to );
+
+		while ( have_posts() ) {
+			the_post();
+			$found = get_the_content( $post_2, array( 'more_link_text' => '' ) );
+		}
+
+		$this->assertSame( 'Bing', $found );
+	}
+}
diff --git tests/phpunit/tests/post/getTheExcerpt.php tests/phpunit/tests/post/getTheExcerpt.php
index 805333606e..481c1359b9 100644
--- tests/phpunit/tests/post/getTheExcerpt.php
+++ tests/phpunit/tests/post/getTheExcerpt.php
@@ -52,4 +52,65 @@ class Tests_Post_GetTheExcerpt extends WP_UnitTestCase {
 		$post_id = self::factory()->post->create( array( 'post_excerpt' => 'Bar' ) );
 		$this->assertSame( 'Bar', get_the_excerpt( $post_id ) );
 	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_fall_back_on_post_content_if_excerpt_is_empty_and_post_is_inferred_from_context() {
+		$post_id = self::factory()->post->create( array( 'post_content' => 'Foo', 'post_excerpt' => '' ) );
+		$q = new WP_Query( array(
+			'p' => $post_id,
+		) );
+
+		while ( $q->have_posts() ) {
+			$q->the_post();
+			$found = get_the_excerpt();
+		}
+
+		$this->assertSame( 'Foo', $found );
+	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_fall_back_on_post_content_if_excerpt_is_empty_and_post_is_provided() {
+		$GLOBALS['post'] = self::factory()->post->create_and_get( array( 'post_content' => 'Foo', 'post_excerpt' => '' ) );
+		$this->assertSame( 'Foo', get_the_excerpt( $GLOBALS['post'] ) );
+	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_respect_post_parameter_in_the_loop() {
+		$p1 = self::factory()->post->create_and_get( array( 'post_excerpt' => 'Foo' ) );
+		$p2 = self::factory()->post->create_and_get( array( 'post_excerpt' => 'Bar' ) );
+		$q = new WP_Query( array(
+			'p' => $p1->ID,
+		) );
+
+		while ( $q->have_posts() ) {
+			$q->the_post();
+			$found = get_the_excerpt( $p2 );
+		}
+
+		$this->assertSame( 'Bar', $found );
+	}
+
+	/**
+	 * @ticket 36934
+	 */
+	public function test_should_respect_post_parameter_in_the_loop_when_falling_back_on_post_content() {
+		$p1 = self::factory()->post->create_and_get( array( 'post_content' => 'Foo', 'post_excerpt' => '' ) );
+		$p2 = self::factory()->post->create_and_get( array( 'post_content' => 'Bar', 'post_excerpt' => '' ) );
+		$q = new WP_Query( array(
+			'p' => $p1->ID,
+		) );
+
+		while ( $q->have_posts() ) {
+			$q->the_post();
+			$found = get_the_excerpt( $p2 );
+		}
+
+		$this->assertSame( 'Bar', $found );
+	}
 }
