Index: wp-includes/link-template.php
===================================================================
--- wp-includes/link-template.php	(revision 20209)
+++ wp-includes/link-template.php	(working copy)
@@ -1429,6 +1429,31 @@
 }
 
 /**
+ * Retrieve link to a multipage part.
+ *
+ * @since 3.2.0
+ *
+ * @param int $page Optional.
+ * @return string
+ */
+function get_multipage_link( $page = 1 ) {
+	global $post, $wp_rewrite;
+
+	if ( 1 == $page ) {
+		$url = get_permalink();
+	} else {
+		if ( '' == get_option('permalink_structure') || in_array( $post->post_status, array( 'draft', 'pending') ) )
+			$url = add_query_arg( 'page', $page, get_permalink() );
+		elseif ( 'page' == get_option( 'show_on_front' ) && get_option('page_on_front') == $post->ID )
+			$url = trailingslashit( get_permalink() ) . user_trailingslashit( $wp_rewrite->pagination_base . "/$page", 'single_paged' );
+		else
+			$url = trailingslashit( get_permalink() ) . user_trailingslashit( $page, 'single_paged' );
+	}
+
+	return $url;
+}
+
+/**
  * Retrieve next posts page link.
  *
  * Backported from 2.1.3 to 2.0.10.
Index: wp-includes/post-template.php
===================================================================
--- wp-includes/post-template.php	(revision 20209)
+++ wp-includes/post-template.php	(working copy)
@@ -626,7 +626,6 @@
  *      is not linked.
  *
  * @since 1.2.0
- * @access private
  *
  * @param string|array $args Optional. Overwrite the defaults.
  * @return string Formatted output in HTML.
@@ -632,6 +631,11 @@
  * @return string Formatted output in HTML.
  */
 function wp_link_pages($args = '') {
+	global $page, $numpages, $multipage, $more, $pagenow;
+
+	if ( !$multipage )
+		return false;
+
 	$defaults = array(
 		'before' => '<p>' . __('Pages:'), 'after' => '</p>',
 		'link_before' => '', 'link_after' => '',
@@ -644,40 +648,36 @@
 	$r = apply_filters( 'wp_link_pages_args', $r );
 	extract( $r, EXTR_SKIP );
 
-	global $page, $numpages, $multipage, $more, $pagenow;
+	$output = '';
+
+	if ( 'number' == $next_or_number ) {
+		$output .= $before;
+		for ( $i = 1; $i <= $numpages; $i++ ) {
+			$link = $link_before . str_replace( '%', $i, $pagelink ) . $link_after;
 
-	$output = '';
-	if ( $multipage ) {
-		if ( 'number' == $next_or_number ) {
-			$output .= $before;
-			for ( $i = 1; $i < ($numpages+1); $i = $i + 1 ) {
-				$j = str_replace('%',$i,$pagelink);
-				$output .= ' ';
-				if ( ($i != $page) || ((!$more) && ($page==1)) ) {
-					$output .= _wp_link_page($i);
-				}
-				$output .= $link_before . $j . $link_after;
-				if ( ($i != $page) || ((!$more) && ($page==1)) )
-					$output .= '</a>';
+			if ( ( $i != $page ) || ( !$more && 1 == $page ) ) {
+				$link = '<a href="' . esc_url( get_multipage_link( $i ) ) . '">' . $link . '</a>';
 			}
-			$output .= $after;
-		} else {
-			if ( $more ) {
-				$output .= $before;
-				$i = $page - 1;
-				if ( $i && $more ) {
-					$output .= _wp_link_page($i);
-					$output .= $link_before. $previouspagelink . $link_after . '</a>';
-				}
-				$i = $page + 1;
-				if ( $i <= $numpages && $more ) {
-					$output .= _wp_link_page($i);
-					$output .= $link_before. $nextpagelink . $link_after . '</a>';
-				}
-				$output .= $after;
-			}
+			$link = apply_filters( 'wp_link_pages_link', $link, $i );
+			$output .= ' ' . $link;
+		}
+		$output .= $after;
+	} elseif ( $more ) {
+		$output .= $before;
+		$i = $page - 1;
+		if ( $i ) {
+			$link = '<a href="' . esc_url( get_multipage_link( $i ) ) . '">' .$link_before. $previouspagelink . $link_after . '</a>';
+			$output .= apply_filters( 'wp_link_pages_link', $link, $i );
+		}
+		$i = $page + 1;
+		if ( $i <= $numpages ) {
+			$link = '<a href="' . esc_url( get_multipage_link( $i ) ) . '">' . $link_before. $nextpagelink . $link_after . '</a>';
+			$output .= apply_filters( 'wp_link_pages_link', $link, $i );
 		}
+		$output .= $after;
 	}
+	
+	$output = apply_filters( 'wp_link_pages', $output, $args );
 
 	if ( $echo )
 		echo $output;
@@ -685,32 +685,6 @@
 	return $output;
 }
 
-/**
- * Helper function for wp_link_pages().
- *
- * @since 3.1.0
- * @access private
- *
- * @param int $i Page number.
- * @return string Link.
- */
-function _wp_link_page( $i ) {
-	global $post, $wp_rewrite;
-
-	if ( 1 == $i ) {
-		$url = get_permalink();
-	} else {
-		if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) )
-			$url = add_query_arg( 'page', $i, get_permalink() );
-		elseif ( 'page' == get_option('show_on_front') && get_option('page_on_front') == $post->ID )
-			$url = trailingslashit(get_permalink()) . user_trailingslashit("$wp_rewrite->pagination_base/" . $i, 'single_paged');
-		else
-			$url = trailingslashit(get_permalink()) . user_trailingslashit($i, 'single_paged');
-	}
-
-	return '<a href="' . esc_url( $url ) . '">';
-}
-
 //
 // Post-meta: Custom per-post fields.
 //
