Index: src/wp-includes/post.php
===================================================================
--- src/wp-includes/post.php	(revision 27219)
+++ src/wp-includes/post.php	(working copy)
@@ -3593,14 +3593,35 @@
  * @return array
  */
 function get_page_children($page_id, $pages) {
-	$page_list = array();
-	foreach ( (array) $pages as $page ) {
-		if ( $page->post_parent == $page_id ) {
-			$page_list[] = $page;
-			if ( $children = get_page_children($page->ID, $pages) )
-				$page_list = array_merge($page_list, $children);
+	// a mapping of page->ID to page
+	$page_dictionary = array(); 
+	// the child filtered pages that will be returned
+	$page_list = array(); 
+
+	// create ID -> page map	
+	foreach( (array) $pages as $page ) {
+		$page_dictionary[$page->ID] = $page;
+	}
+
+	foreach ( (array) $pages as $page) {
+		$child_page = $page;
+
+		// look for the parent of the page
+		while ( $child_page->post_parent && $child_page->post_parent != $page_id && $child_page->post_parent != $child_page->ID) {
+			if ( isset($page_dictionary[$child_page->post_parent]) ) {
+				$child_page = $page_dictionary[$child_page->post_parent];
+			} else {
+				break;
+			}
 		}
+
+		// if the parent of the page is the parent we are looking for,
+		// add it to the page list
+		if ($child_page->post_parent == $page_id) {
+			$page_list[]= $page;
+		}
 	}
+
 	return $page_list;
 }
 
Index: tests/phpunit/tests/post/getPages.php
===================================================================
--- tests/phpunit/tests/post/getPages.php	(revision 27219)
+++ tests/phpunit/tests/post/getPages.php	(working copy)
@@ -211,4 +211,32 @@
 
 		$this->assertEqualSets( array( $page_1, $page_2, $page_4, $page_3 ), wp_list_pluck( $pages, 'ID' ) );
 	}
+
+	/**
+	* @ticket 17374 
+	*/
+	function test_get_pages_sorted_and_child_of() {
+		global $wpdb;
+
+		$create_time = '2014-02-21 22:06:23';
+
+		$top_level_page = $this->factory->post->create( array( 'post_type' => 'page' ) );
+
+		$sub_page_1 = $this->factory->post->create( array( 'post_type' => 'page', 'post_parent' => $top_level_page ) );
+		$sub_page_2 = $this->factory->post->create( array( 'post_type' => 'page', 'post_parent' => $top_level_page ) );
+
+		$sub_sub_page_1 = $this->factory->post->create( array( 'post_type' => 'page', 'post_parent' => $sub_page_1 ) );
+
+		$this->factory->post->update_object($top_level_page, array( 'post_date' => '2014-02-21 22:06:23' ));
+		$this->factory->post->update_object($sub_page_1, array( 'post_date' => '2014-02-21 22:06:24' ));
+		$this->factory->post->update_object($sub_page_2, array( 'post_date' => '2014-02-21 22:06:25'));
+		$this->factory->post->update_object($sub_sub_page_1, array( 'post_date' => '2014-02-21 22:06:26' ));
+
+		$pages = get_pages(array( 'child_of' => $top_level_page, 'sort_column' => 'post_date', 'sort_order' => 'DESC')); 
+
+		for ($i = 1; $i < count($pages); $i++) {
+			echo($pages[$i - 1]->post_date);
+			$this->assertGreaterThan($pages[$i]->post_date, $pages[$i - 1]->post_date);
+		}
+	}
 }
\ No newline at end of file
