Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(Revision 26919)
+++ wp-admin/includes/meta-boxes.php	(Arbeitskopie)
@@ -644,6 +644,7 @@
 			'show_option_none' => __('(no parent)'),
 			'sort_column'      => 'menu_order, post_title',
 			'echo'             => 0,
+			'post_status'      => 'publish,private',
 		);
 
 		$dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );
Index: wp-admin/includes/class-wp-posts-list-table.php
===================================================================
--- wp-admin/includes/class-wp-posts-list-table.php	(Revision 26919)
+++ wp-admin/includes/class-wp-posts-list-table.php	(Arbeitskopie)
@@ -902,6 +902,7 @@
 			'show_option_none'  => __( 'Main Page (no parent)' ),
 			'option_none_value' => 0,
 			'sort_column'       => 'menu_order, post_title',
+			'post_status'       => 'publish,private',
 		);
 
 		if ( $bulk )
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(Revision 26919)
+++ wp-includes/post.php	(Arbeitskopie)
@@ -2755,6 +2755,28 @@
 	if ( empty($post_type) )
 		$post_type = 'post';
 
+	if ( isset($post_parent) )
+		$post_parent = (int) $post_parent;
+	else
+		$post_parent = 0;
+	// Check the post_parent to see if it will cause a hierarchy loop
+	$post_parent = apply_filters( 'wp_insert_post_parent', $post_parent, $post_ID, compact( array_keys( $postarr ) ), $postarr );
+	//inherit parent post status when private
+	if ( $post_parent ) {
+		$parent_status = get_post( $post_parent )->post_status;
+		if ( 'private' === $parent_status ) {
+			$post_status = $parent_status;
+		} elseif ( 'publish' !== $parent_status ) {
+			if ( $wp_error ) {
+				return new WP_Error( 'invalid_parent_status',
+						__( 'The selected parent has an invalid status' ),
+						$parent_status );
+			} else {
+				return 0;
+			}
+		}
+	}
+
 	if ( empty($post_status) )
 		$post_status = 'draft';
 
@@ -2851,14 +2873,6 @@
 	if ( ! isset($pinged) )
 		$pinged = '';
 
-	if ( isset($post_parent) )
-		$post_parent = (int) $post_parent;
-	else
-		$post_parent = 0;
-
-	// Check the post_parent to see if it will cause a hierarchy loop
-	$post_parent = apply_filters( 'wp_insert_post_parent', $post_parent, $post_ID, compact( array_keys( $postarr ) ), $postarr );
-
 	if ( isset($menu_order) )
 		$menu_order = (int) $menu_order;
 	else
@@ -2876,6 +2890,13 @@
 	$where = array( 'ID' => $post_ID );
 
 	if ( $update ) {
+		$result = affect_descendants( $post_ID, $data, $previous_status );
+		if ( is_wp_error( $result ) ) {
+			if ( $wp_error ) {
+				return $result;
+			}
+			return 0;
+		}
 		do_action( 'pre_post_update', $post_ID, $data );
 		if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) {
 			if ( $wp_error )
@@ -2965,6 +2986,69 @@
 }
 
 /**
+ * Affects descendant pages on some post status changes.
+ * @param array $data Array with new post fields
+ * @param string $previous_status
+ * @return int|WP_Error WP_Error on failure. Otherwise 0
+ */
+function affect_descendants( $ID, $data, $previous_status ) {
+	$getter_args = array();
+	$force_inheritance = false;
+	//remove parentship for all childrens if post status does not support it
+	if ( in_array( $previous_status , array( 'publish', 'private' ) ) &&
+			! in_array( $data['post_status'], array( 'publish', 'private' ) ) ) {
+		$getter_args = array(
+				'parent' => $ID,
+				'hierarchical' => 0,
+				'post_status' => 'publish,future,draft,pending,private',
+			);
+	}
+	//publish->private? set post status of all descendants to private
+	if ( 'publish' === $previous_status && 'private' === $data['post_status'] ) {
+		$getter_args = array(
+				'child_of' => $ID,
+				'post_status' => 'publish,future,draft,pending',
+			);
+		$force_inheritance = true;
+	}
+	if ( ! count( $getter_args ) ) { //no need for changes
+		return 0;
+	}
+
+	$descendants = get_pages( $getter_args );
+	if ( false === $descendants ) {
+		return new WP_Error( 'get_descendant_fail',
+				__( 'Could not get descendant' ), $getter_args );
+	}
+	if ( ! count( $descendants ) ) {
+		return 0;
+	}
+	global $wpdb;
+	$sql = "UPDATE {$wpdb->posts} SET ";
+	if ( $force_inheritance ) {
+		$sql .= 'post_status="private"';
+	} else {
+		$sql .= 'post_parent=0';
+	}
+	$sql .= ' WHERE ';
+	for ( $i = 0; $i != count( $descendants ); $i++ ) {
+		$sql .= "ID={$descendants[$i]->ID} ";
+		if ( count( $descendants ) - 1 != $i ) {
+			$sql .= 'OR ';
+		}
+	}
+
+	if ( FALSE === $wpdb->query( $sql ) ) {
+		return new WP_Error( 'affect_descendant_fail',
+				__( 'Could not affect descendants' ), $sql );
+	}
+	return 0;
+}
+
+/**
+ * 
+
+/**
  * Update a post with new post data.
  *
  * The date does not have to be set for drafts. You can set the date and it will
