Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 17647)
+++ wp-admin/includes/template.php	(working copy)
@@ -1155,18 +1155,41 @@
 	if ( !isset($wp_settings_sections) || !isset($wp_settings_sections[$page]) )
 		return;
 
+	$callback = apply_filters( 'do_settings_section_callback-' . $page, 'do_settings_section_output' );
+	
+	if ( !function_exists($callback) )
+		return false;
+
 	foreach ( (array) $wp_settings_sections[$page] as $section ) {
-		echo "<h3>{$section['title']}</h3>\n";
-		call_user_func($section['callback'], $section);
 		if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section['id']]) )
 			continue;
-		echo '<table class="form-table">';
-		do_settings_fields($page, $section['id']);
-		echo '</table>';
+
+		call_user_func( $callback, $page, $section );
 	}
 }
 
 /**
+ * Prints a settings section.
+ *
+ * Part of the Settings API. Used as the default way of displaying a settings section.
+ * To display your setting's section differently, use the 'do_settings_section_callback-$page'
+ * and provide a callback function where $page is the slug the section appears on.
+ *
+ * @since 3.2.0
+ *
+ * @param string $page  The slug name of the page whos settings sections you want to output.
+ * @param array $section A registered section.
+ */
+function do_settings_section_output( $page, $section ) {
+	echo "<h3>{$section['title']}</h3>\n";
+	call_user_func( $section['callback'], $section );
+
+	echo '<table class="form-table">';
+	do_settings_fields( $page, $section['id'] );
+	echo '</table>';
+}
+
+/**
  * Print out the settings fields for a particular settings section
  *
  * Part of the Settings API. Use this in a settings page to output
@@ -1186,20 +1209,40 @@
 	if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section]) )
 		return;
 
+	$callback = apply_filters( 'do_settings_fields_callback-' . $page, 'do_settings_fields_output' );
+	
+	if ( !function_exists($callback) )
+		return false;
+
 	foreach ( (array) $wp_settings_fields[$page][$section] as $field ) {
-		echo '<tr valign="top">';
-		if ( !empty($field['args']['label_for']) )
-			echo '<th scope="row"><label for="' . $field['args']['label_for'] . '">' . $field['title'] . '</label></th>';
-		else
-			echo '<th scope="row">' . $field['title'] . '</th>';
-		echo '<td>';
-		call_user_func($field['callback'], $field['args']);
-		echo '</td>';
-		echo '</tr>';
+		call_user_func( $callback, $field );
 	}
 }
 
 /**
+ * Prints a settings field.
+ *
+ * Part of the Settings API. Used as the default way of displaying a settings field.
+ * To display your setting's field differently, use the 'do_settings_fields_callback-$page'
+ * and provide a callback function where $page is the $page the setting appears on.
+ *
+ * @since 3.2.0
+ *
+ * @param array $field A registered field within the settings API.
+ */
+function do_settings_fields_output( $field ) {
+	echo '<tr valign="top">';
+	if ( !empty($field['args']['label_for']) )
+		echo '<th scope="row"><label for="' . $field['args']['label_for'] . '">' . $field['title'] . '</label></th>';
+	else
+		echo '<th scope="row">' . $field['title'] . '</th>';
+	echo '<td>';
+	call_user_func($field['callback'], $field['args']);
+	echo '</td>';
+	echo '</tr>';
+}
+
+/**
  * Register a settings error to be displayed to the user
  *
  * Part of the Settings API. Use this to show messages to users about settings validation
