diff --git a/Source/pages/list.php b/Source/pages/list.php
index ee1497d..6d12603 100644
--- a/Source/pages/list.php
+++ b/Source/pages/list.php
@@ -56,25 +56,46 @@
 $t_count = $t_stats['changesets'];
 
 if ( $t_count > $f_perpage ) {
-	$t_page = 1;
-	while( $t_count > 0 ) {
-		if ( $t_page > 1 && $t_page % 15 != 1 ) {
-			echo ', ';
+
+	$t_pages = ceil( $t_count / $f_perpage );
+	$t_current = $f_offset;
+	$t_page_set = array();
+
+	$t_page_link_body = "if ( is_null( \$t ) ) { \$t = \$p; }
+		return ( is_null( \$p ) ? '...' : ( \$p == $t_current ? \"\$p\" :
+		'' . \$t . '' ) );";
+	$t_page_link = create_function( '$p, $t=null', $t_page_link_body ) or die( 'gah' );
+
+	if ( $t_pages > 15 ) {
+		$t_used_page = false;
+		for( $i = 1; $i <= $t_pages; $i++ ) {
+			if ( $i <= 3 || $i > $t_pages-3 ||
+				( $i >= $t_current-4 && $i <= $t_current+4 ) ||
+				$i % 10 == 0) {
+
+				$t_page_set[] = $i;
+				$t_used_page = true;
+			} else if ( $t_used_page ) {
+				$t_page_set[] = null;
+				$t_used_page = false;
+			}
 		}
 
-		if ( $t_page == $f_offset ) {
-			echo " $t_page";
-		} else {
-			echo ' ', $t_page, '';
-		}
-
-		if ( $t_page % 15 == 0 ) {
-			echo '
';
-		}
-
-		$t_count -= $f_perpage;
-		$t_page ++;
+	} else {
+		$t_page_set = range( 1, $t_pages );
 	}
+
+	if ( $t_current > 1 ) {
+		echo $t_page_link( $f_offset-1, '<<' ), '  ';
+	}
+
+	$t_page_set = map( $t_page_link, $t_page_set );
+	echo join( ' ', $t_page_set );
+
+	if ( $t_current < $t_pages ) {
+		echo '  ', $t_page_link( $f_offset+1, '>>' );
+	}
+
 }
 ?>
 
diff --git a/Source/pages/search.php b/Source/pages/search.php
index 04f420d..3a4a8d7 100644
--- a/Source/pages/search.php
+++ b/Source/pages/search.php
@@ -47,30 +47,51 @@