Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 5790)
+++ wp-admin/includes/template.php	(working copy)
@@ -161,7 +161,7 @@
 	}
 }
 
-function page_rows( $parent = 0, $level = 0, $pages = 0, $hierarchy = true ) {
+function page_rows( $page_columns, $parent = 0, $level = 0, $pages = 0, $hierarchy = true) {
 	global $wpdb, $class, $post;
 
 	if (!$pages )
@@ -175,25 +175,71 @@
 		if ( $hierarchy && ($post->post_parent != $parent) )
 			continue;
 
-		$post->post_title = wp_specialchars( $post->post_title );
+		add_filter('the_title','wp_specialchars');
+		$class = ('alternate' == $class) ? '' : 'alternate';
 		$pad = str_repeat( '&#8212; ', $level );
 		$id = (int) $post->ID;
-		$class = ('alternate' == $class ) ? '' : 'alternate';
-?>
-  <tr id='page-<?php echo $id; ?>' class='<?php echo $class; ?>'> 
-    <th scope="row" style="text-align: center"><?php echo $post->ID; ?></th> 
-    <td>
-      <?php echo $pad; ?><?php the_title() ?>
-    </td> 
-    <td><?php the_author() ?></td>
-    <td><?php if ( '0000-00-00 00:00:00' ==$post->post_modified ) _e('Unpublished'); else echo mysql2date( __('Y-m-d g:i a'), $post->post_modified ); ?></td> 
-	<td><a href="<?php the_permalink(); ?>" rel="permalink" class="edit"><?php _e( 'View' ); ?></a></td>
-    <td><?php if ( current_user_can( 'edit_page', $id ) ) { echo "<a href='page.php?action=edit&amp;post=$id' class='edit'>" . __( 'Edit' ) . "</a>"; } ?></td> 
-    <td><?php if ( current_user_can( 'delete_page', $id ) ) { echo "<a href='" . wp_nonce_url( "page.php?action=delete&amp;post=$id", 'delete-page_' . $id ) .  "' class='delete' onclick=\"return deleteSomething( 'page', " . $id . ", '" . js_escape(sprintf( __("You are about to delete the '%s' page.\n'OK' to delete, 'Cancel' to stop." ), get_the_title() ) ) . "' );\">" . __( 'Delete' ) . "</a>"; } ?></td> 
-  </tr> 
 
-<?php
-		if ( $hierarchy ) page_rows( $id, $level + 1, $pages );
+		echo '<tr id="page-' . $id . '" class="' . $class . '">';
+
+		foreach($page_columns as $column_name=>$column_display_name) {
+
+			switch($column_name) {
+
+			case 'id':
+				?>
+				<th scope="row" style="text-align: center"><?php echo $post->ID; ?></th>
+				<?php
+				break;
+
+			case 'title':
+				?>
+				<td>
+			     <?php echo $pad; ?><?php the_title() ?>
+            </td>
+				<?php
+				break;
+				
+			case 'owner':
+				?>
+				<td><?php the_author() ?></td>
+				<?php
+				break;
+
+			case 'updated':
+				?>
+				<td><?php if ( '0000-00-00 00:00:00' ==$post->post_modified ) _e('Unpublished'); else echo mysql2date( __('Y-m-d g:i a'), $post->post_modified ); ?></td>
+				<?php
+				break;
+
+			case 'control_view':
+				?>
+				<td><a href="<?php the_permalink(); ?>" rel="permalink" class="edit"><?php _e('View'); ?></a></td>
+				<?php
+				break;
+
+			case 'control_edit':
+				?>
+				<td><?php if ( current_user_can( 'edit_page', $id ) ) { echo "<a href='page.php?action=edit&amp;post=$id' class='edit'>" . __( 'Edit' ) . "</a>"; } ?></td>
+				<?php
+				break;
+
+			case 'control_delete':
+				?>
+				<td><?php if ( current_user_can( 'delete_page', $id ) ) { echo "<a href='" . wp_nonce_url( "page.php?action=delete&amp;post=$id", 'delete-page_' . $id ) .  "' class='delete' onclick=\"return deleteSomething( 'page', " . $id . ", '" . js_escape(sprintf( __("You are about to delete the '%s' page.\n'OK' to delete, 'Cancel' to stop." ), get_the_title() ) ) . "' );\">" . __( 'Delete' ) . "</a>"; } ?></td>
+				<?php
+				break;
+
+			default:
+				?>
+				<td><?php do_action('manage_pages_custom_column', $column_name, $id); ?></td>
+				<?php
+				break;
+			}
+		}
+		echo '</tr>';
+		
+		if($hierarchy) page_rows( $page_columns, $id, $level + 1, $pages );
 	}
 }
 
Index: wp-admin/edit-pages.php
===================================================================
--- wp-admin/edit-pages.php	(revision 5790)
+++ wp-admin/edit-pages.php	(working copy)
@@ -70,19 +70,45 @@
 $all = !( $h2_search || $post_status_q );
 
 if ($posts) {
+	// define the columns to display, the syntax is 'internal name' => 'display name'
+	$page_columns = array(
+		'id'         => '<div style="text-align: center">' . __('ID') . '</div>',
+		'title'      => __('Title'),
+		'owner' 		 => __('Owner'),
+		'updated'	 => __('Updated')
+	);
+	$page_columns = apply_filters('manage_pages_columns', $page_columns);
+
+	// you can not edit these at the moment
+	$page_columns['control_view']   = '';
+	$page_columns['control_edit']   = '';
+	$page_columns['control_delete'] = '';
 ?>
 <table class="widefat"> 
   <thead>
   <tr>
-    <th scope="col" style="text-align: center"><?php _e('ID') ?></th>
-    <th scope="col"><?php _e('Title') ?></th>
-    <th scope="col"><?php _e('Owner') ?></th>
-	<th scope="col"><?php _e('Updated') ?></th>
-	<th scope="col" colspan="3" style="text-align: center"><?php _e('Action'); ?></th>
+    <?php 
+	 $action_colspan = 0;
+	 foreach($page_columns as $column_type => $column_display_name) {
+	 	if(preg_match('/^control_/', $column_type)) {
+	     $action_colspan++;
+	   } else {
+		  if($action_colspan > 0) {
+		    echo '<th scope="col" style="text-align: center" colspan="' . $action_colspan . '">' . __('Action') . '</th>';
+			 $action_colspan = 0;
+		  }
+		  echo '<th scope="col">' . $column_display_name . '</th>';
+		}
+	 }
+    if($action_colspan > 0) {
+	   echo '<th scope="col" style="text-align: center" colspan="' . $action_colspan . '">' . __('Action') . '</th>';
+		$action_colspan = 0;
+	 }
+	 ?>
   </tr>
   </thead>
   <tbody id="the-list">
-<?php page_rows(0, 0, $posts, $all); ?>
+<?php page_rows($page_columns, 0, 0, $posts, $all); ?>
   </tbody>
 </table>
 
